水下功夫做透,水上才能顺风顺水。

C++中static与const成员

一.static成员

(1)static数据成员

 static数据成员的创建是为了对象之间的共享和沟通,具有以下特点:

1.1 static数据成员属于类,只占一份空间(不像普通数据成员每个对象中都有一份数据),其空间在对象之外,但可以被各个同类对象共享。

1.2 static数据成员不能通过构造函数初始化(这是因为static数据成员只有一份数据,而每实例化一个对象就会执行一次构造函数),只能在类外初始化(编译器默认赋其为0)。

一般形式为:数据类型 类名::静态数据成员 = 初值;//不加static修饰。加粗处为与全局变量定义的不同点。

1.3 声明类时静态数据成员已经被分配空间(早于对象的构造),到程序运行结束才释放(晚于对象的析构)。

1.4 被定义成public数据成员时,在main函数内既可以通过类名来引用,也可以通过对象来引用。

1.5 static数据成员可以被static成员函数和非static成员函数所引用。

1.6 类的static数据成员和它所有派生类对象也是共享的。

(2)static成员函数

小叙this指针:

 1 class A
 2 {
 3     public:
 4     int i;
 5     void display();
 6 };
 7 void A::display()
 8 {
 9    cout<<i<<endl;   
10 }    
11 
12 int main(void)
13 {
14      A a1;
15      A a2;
16      a1.i = 1;
17      a2.i = 2;
18      a1.display();
19      a2.display();
20 }
display();<=>display(A* const this);//指向谁在函数内不能变,指向的对象值在函数内可以变。

对象a1和a2各有一份数据成员i,而成员函数只有一份供共用。成员函数怎么选择显示哪个i呢?

这里成员函数所隐含的形参-本类对象指针this发挥了作用。对象在调用成员函数时,会把自身地址传递给this指针,然后由this去引用数据成员。

a1.display();<=>a1.display(&a1);

结束小叙。

普通成员函数被每个对象共享且属于每一对象,故成员函数有指向该对象的this指针,可以访问普通数据成员。

静态成员函数被每个对象共享但不属于任一对象,故静态成员函数没有指向该对象的this指针,不可以访问普通数据成员。

这是静态成员函数和普通成员函数的根本区别。

二. const成员

const的意思,就是不可以被改变或不可以改变。

(1)const数据成员

const数据成员具有以下特点:

1.1 不能被改变,不能被赋值。

1.2 只能通过构造函数的参数初始化表进行初始化。

Time::Time(int h):hours(h){}

(2)const成员函数

类型名 函数名(参数表) const;//定义时也加const

2.1 const成员函数隐含形参(const 类名* const this)。

指向谁在函数内不能变,指向的对象值在函数内也不能变。

2.2 可以引用对象的所有数据成员,但不可以改变。

2.3 不允许其调用普通成员函数(为了防止const成员函数通过普通成员函数改变数据成员)。

(3) const对象

类名 const 对象名(实参);<=>const 类名 对象名(实参);

 const对象的数据成员都是,const数据成员。

1.1 必须有初值。

1.2 只能通过构造函数的参数初始化表进行初始化。

1.3 只能调用const成员函数(调用普通成员函数,隐形指针传递非法--参考谭浩强C++,解释在上)。

1.4 被声明为mutable的数据成员,可以通过(const对象)调用const成员函数修改值。

说明:由于const成员函数有this指针,而static成员函数没有this指针,故这两个关键词不能同时修饰一个成员函数。

 

posted @ 2015-04-05 19:25  北方寒士  阅读(215)  评论(0编辑  收藏  举报