- 浏览: 3452051 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
sonichy:
Qt5改动很多,要改改了。
基于QItemDelegate的例子1 SpinBoxDelegate -
我的主页6:
楼主,2.2子查询的分页方式:SELECT * FROM ar ...
Mysql 分页语句Limit用法 -
liguoqi:
非常感谢楼主的用心指导,工具以及图片例子都提供了 赞!
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
问下这个图片怎么解压损坏呀
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
楼主讲解的非常详细,还附带工具和图片例子,非常感谢
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载
节选自《C++ Primer》,还是书上写的最清楚。
12.6. static 类成员
对于特定类类型的全体对象而言,访问一个全局对象有时是必要的。也许,在程序的任意点需要统计已创建的特定类类型对象的数量;或者,全局对象可能是指向类的错误处理例程的一个指针;或者,它是指向类类型对象的内在自由存储区的一个指针。
然而,全局对象会破坏封装:对象需要支持特定类抽象的实现。如果对象是全局的,一般的用户代码就可以修改这个值。类可以定义类 静态成员,而不是定义一个可普遍访问的全局对象。
通常,非 static 数据成员存在于类类型的每个对象中。不像普通的数据成员,static 数据成员独立于该类的任意对象而存在;每个 static 数据成员是与类关联的对象,并不与该类的对象相关联。
正如类可以定义共享的 static 数据成员一样,类也可以定义 static 成员函数。static 成员函数没有 this 形参,它可以直接访问所属类的 static 成员,但不能直接使用非 static 成员。 使用类的 static 成员的优点使用 static 成员而不是全局对象有三个优点。
定义 static 成员在成员声明前加上关键字 static 将成员设为 static。static 成员遵循正常的公有/私有访问规则。
例如,考虑一个简单的表示银行账户的类。每个账户具有余额和拥有者,并且按月获得利息,但应用于每个账户的利率总是相同的。可以按下面的这样编写这个类 class Account { public: // interface functions here void applyint() { amount += amount * interestRate; } static double rate() { return interestRate; } static void rate(double); // sets a new rate private: std::string owner; double amount; static double interestRate; static double initRate(); }; 这个类的每个对象具有两个数据成员:owner 和 amount。对象没有与 static 数据成员对应的数据成员,但是,存在一个单独的interestRate 对象,由 Account 类型的全体对象共享。 使用类的 static 成员可以通过作用域操作符从类直接调用 static 成员,或者通过对象、引用或指向该类类型对象的指针间接调用。 Account ac1; Account *ac2 = &ac1; // equivalent ways to call the static member rate function double rate; rate = ac1.rate(); // through an Account object or reference rate = ac2->rate(); // through a pointer to an Account object rate = Account::rate(); // directly from the class using the scope operator 像使用其他成员一样,类成员函数可以不用作用域操作符来引用类的 static 成员: class Account {
public:
// interface functions here
void applyint() { amount += amount * interestRate; }
};
12.6.1. static 成员函数
Account 类有两个名为 rate 的 static 成员函数,其中一个定义在类的内部。当我们在类的外部定义 static 成员时,无须重复指定 static 保留字,该保留字只出现在类定义体内部的声明处: void Account::rate(double newRate) { interestRate = newRate; } static 函数没有 this 指针static 成员是类的组成部分但不是任何对象的组成部分,因此,static 成员函数没有 this 指针。通过使用非 static 成员显式或隐式地引用 this 是一个编译时错误。
因为 static 成员不是任何对象的组成部分,所以 static 成员函数不能被声明为 const。毕竟,将成员函数声明为 const 就是承诺不会修改该函数所属的对象。最后,static 成员函数也不能被声明为虚函数。我们将在第 15.2.4 节学习虚函数。 12.6.2. static 数据成员static 数据成员可以声明为任意类型,可以是常量、引用、数组、类类型,等等。 static 数据成员必须在类定义体的外部定义(正好一次)。不像普通数据成员,static 成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。
定义 static 数据成员的方式与定义其他类成员和变量的方式相同:先指定类型名,接着是成员的完全限定名。
可以定义如下 interestRate: // define and initialize static class member
double Account::interestRate = initRate();
这个语句定义名为 interestRate 的 static 对象,它是类 Account 的成员,为 double 型。像其他成员定义一样,一旦成员名出现,static 成员的就是在类作用域中。因此,我们可以没有限定地直接使用名为 initRate 的 static 成员函数,作为interestRate 初始化式。注意,尽管 initRate 是私有的,我们仍然可以使用该函数来初始化 interestRate。像任意的其他成员定义一样,interestRate 的定义是在类的作用域中,因此可以访问该类的私有成员。
特殊的整型 const static 成员
一般而言,类的 static 成员,像普通数据成员一样,不能在类的定义体中初始化。相反,static 数据成员通常在定义时才初始化。
这个规则的一个例外是,只要初始化式是一个常量表达式,整型 const static 数据成员就可以在类的定义体中进行初始化: class Account { public: static double rate() { return interestRate; } static void rate(double); // sets a new rate private: static const int period = 30; // interest posted every 30 days double daily_tbl[period]; // ok: period is constant expression };
用常量值初始化的整型 const static 数据成员是一个常量表达式。同样地,它可以用在任何需要常量表达式的地方,例如指定数组成员 daily_tbl 的维。
在类内部提供初始化式时,成员的定义不必再指定初始值: // definition of static member with no initializer; // the initial value is specified inside the class definition const int Account::period; static 成员不是类对象的组成部分普通成员都是给定类的每个对象的组成部分。static 成员独立于任何对象而存在,不是类类型对象的组成部分。因为 static数据成员不是任何对象的组成部分,所以它们的使用方式对于非 static 数据成员而言是不合法的。
例如,static 数据成员的类型可以是该成员所属的类类型。非 static 成员被限定声明为其自身类对象的指针或引用: class Bar { public: // ... private: static Bar mem1; // ok Bar *mem2; // ok Bar mem3; // error }; 类似地,static 数据成员可用作默认实参: class Screen { public: // bkground refers to the static member // declared later in the class definition Screen& clear(char = bkground); private: static const char bkground = '#'; }; 非 static 数据成员不能用作默认实参,因为它的值不能独立于所属的对象而使用。使用非 static 数据成员作默认实参,将无法提供对象以获取该成员的值,因而是错误的。 |
ps: 以下关于静态成员变量
1.初始化static成员变量不能安排在类的构造函数中,因为构造函数可能一再被调用,而变量的初值却只应该设定一次。也不要把初始化安排在头文件中,因为它可能会被包含在许多地方。而应该放在main函数之中,或全域函数中,或者任何函数之外。
2.静态成员变量(函数)在类外定义时,注意不要写static,初始化时候 [类型名] [类名]::[变量名] 例如:int Base::a。
3.当静态成员变量被声明为private类型时,不能用类名::变量名 为静态成员变量赋值。
当声明为public 则可以。
4.当用类名调用静态成员函数时,调用符号是::,而不是java里的.号,也不是指针的->号
发表评论
-
C++ 实现把非静态成员函数作为回调函数(非static)
2012-11-16 10:10 14614众所周知,C++的类成员函数不能像普通函数那样用于回调,因 ... -
【转】windows多线程CreateThread与_beginthreadex本质区别
2012-11-15 14:40 13828本文将带领你与多线程作第一次亲密接触,并深入分析Crea ... -
windows下C语言多线程编程
2012-11-15 14:37 10037_beginThreadex创建多线程解读 一、需 ... -
ostringstream 的清空数据方法
2012-09-27 15:28 19409关于C++中 <sstream>中ostrings ... -
输入参数和输出参数
2012-09-26 10:43 36761. 输入参数,是函数的调用者,传递给函数的实现者,对函 ... -
ofstream、ifstream、fstream
2012-09-23 19:23 2928学习一下C++的文件流: ofstream是从内 ... -
将ostream 对象转换成字符串流输出
2012-09-22 10:47 8609将ostream 对象转换成字符串流输出 因为项目中需 ... -
sstream和strstream以及fstream
2012-09-22 10:38 4465在C++有两种字符串流,也称为数组I/O流,一种在sstre ... -
字符串流 ostrstream 和 istrstream
2012-09-22 10:28 7933ostrstream类流 /*ostrst ... -
将有格式的int解析成float
2012-09-20 18:10 2317因项目中有一个需求:将采集到所有short int 转换成fl ... -
回调函数测试例子
2012-09-29 14:15 4332回调函数就是一个通过函数指针调用的函数。如果你把函数的指 ... -
fatal error C1083: Cannot open include file: 'iostream.h': No such file or dire
2012-09-20 17:19 6458错误: fatal error C1083: Cannot o ... -
C++中类的声明
2012-08-29 16:28 6950可以声明一个类而不定义它 class Sc ... -
only static const integral data members can be initialized within a class
2012-06-28 11:40 2752翻译一下:只有静态整型常量数据成员能在类中初始化 ... -
fstream与 C 风格(例如fread 和 fwrite )两种读写文件方法的效率比较
2012-06-27 17:21 21003我觉得作者写的挺好,评论也写的很对。 目前我的项目 ... -
C/C++快速写入类结构对象进入文件
2012-06-19 10:38 0void QObject::deleteLater() { ... -
C语言文件操作函数大全
2012-06-18 13:54 2388C语言文件操作函数大 ... -
C++ 动态申请数组
2012-06-09 00:05 6718方法1、C++使用vector方便 ... -
VC++动态链接库(DLL)编程深入浅出(ZZ)
2012-06-08 10:06 24561.概论 先来阐述一下DLL(Dynamic Link ... -
C++中的头文件和源文件
2012-05-09 14:54 6630一、C++编译模式 通常 ...
相关推荐
### C++将类的成员函数作为回调函数 #### 背景与问题 在C++编程中,回调函数是一种常见的设计模式,它允许程序在特定的事件或条件下调用一个预先注册的函数。然而,当涉及到类的成员函数时,事情变得稍微复杂了...
总结来说,C++中的类成员和数据成员初始化是一个严谨的过程,需要理解构造函数的机制,以及`const`、`static`和数组的特殊性。正确初始化成员可以确保对象的有效性和代码的健壮性。遵循这些规则,可以帮助我们编写出...
- 在C++中,`static`可以用于局部变量、全局变量以及类成员变量。 2. **为什么引入Static?** - 当需要在函数内部保留某些状态,并希望这些状态能够在函数多次调用之间持续存在时,就需要使用`static`。 - 如果...
总之,`static`在C++中扮演着多面角色,涉及到变量、函数、类成员等多个方面。理解并熟练运用`static`是C++程序员必备的技能之一,它可以帮助你编写更加高效、安全和模块化的代码。正确地使用`static`,可以有效控制...
类的static、const、static const、const static成员的初始化 在 C++ 编程中,static、const、static const 和 const static 是四个常见的概念,但它们的初始化方式却容易弄混淆。下面我们将对这四种成员变量的初始...
4. 在类外部定义static成员函数时,不需要再次使用static关键字。 在类的定义体内部,static成员函数只在声明时使用static关键字,如下例所示: ```cpp class A { public: static void staticFunction(); }; ``` ...
在C++编程语言中,静态成员是一个非常重要的概念,它为类提供了一种共享数据和功能的方法。静态成员不依赖于任何对象实例,而是属于类本身。本篇将通过两个实例——静态成员函数和静态数据成员,深入探讨它们在C++中...
C++ static 用法总结 静态变量是 C++ 中的一个重要概念,它有多种使用方式,今天我们就来总结一下 C++ 中的静态变量用法。 一、局部静态变量 在 C/C++ 中,局部变量可以分为三种:auto、static 和 register。与 ...
在标题“全局数据管理—使用C++类的静态成员取代全局数据”中,重点在于静态数据成员。静态数据成员是类的一个共享属性,不与任何特定的对象关联,所有该类的对象共享同一份存储空间。这使得它们成为实现全局数据的...
NON-STATIC成员是指没有加Static的成员,所有没有加Static的成员都是非静态成员。当类被实例化之后,可以通过实例化的类名进行访问。非静态成员的生存期决定于该类的生存期,而静态成员则不存在生存期的概念,因为...
在C++编程语言中,`static`关键字是一个非常重要的特性,它有多种用途,涉及到变量、函数、类成员等多个方面。下面将详细讲解`static`关键字的基本用法及其在不同场景下的应用。 1. **静态全局变量(Static Global ...
3. **类的静态成员变量**:在C++中,类的静态成员变量被所有类的实例共享,它们不是每个对象的副本,而是所有对象共用的一个实例。静态成员变量不能通过对象直接访问,需要通过类名或指针进行访问。 接着,我们来看...
一般地,线程要读写类的私有成员变量,只有两种方法:将全局函数声明为类友元friend,或者使用静态的成员函数static。那非静态的成员函数呢?一般地方都说的是,不行,做不了。。。为什么不行?都是代码区的代码,...
在创建自定义类时,我们可能将此类命名为CDigiStatic,并在头文件中声明类结构,包括继承自CStatic的声明,以及可能需要的成员变量,如当前显示的数字、LED样式等。在源文件中,我们将实现类的构造函数、析构函数...
在类中,static 成员变量可以满足需要在一个类的各个对象间交互的需求,同时又力求不破坏类的封装性。类的静态成员变量具有独立的存储区,属于整个类,且连接器会保证它拥有一个单一的外部定义。 const 关键字是 ...
### C++ `static` 关键字的原理及用法详解 #### 一、引言 在C++编程语言中,`static`关键字扮演着至关重要的角色。它不仅可以用来控制变量和函数的可见性和生命周期,还能在类的设计中发挥独特的作用。正确地理解...
C++中的类静态成员和类静态成员函数是编程中非常重要的概念,它们具有特殊的行为和用途,对于理解和编写高效的C++代码至关重要。 首先,类静态成员(static data member)是属于类本身而非类的任何特定对象的。这...
C++中的类成员是学习C++的基础,本文详细介绍了C++类中的各种成员,包括静态成员变量、成员函数、const成员变量、const成员函数、const static数据成员、对象数组、类中的对象成员、类成员指针、嵌套类、友元和this...
C/C++ static详解 static 关键字是 C 和 C++ 中都存在的关键字,它主要有三种使用方式,其中前两种只...在 C++ 中,static 关键字还可以用来修饰数据成员和成员函数,这样可以实现静态数据成员和静态成员函数的概念。