C++查漏补缺读书笔记二 static关键字

来源:互联网 发布:泰安焦点网络怎么样 编辑:程序博客网 时间:2024/06/05 15:07

本节对static关键字的一些容易忽视的细节做些笔记


1 在成员声明前加上关键字 static 将成员设为 static。static 成员遵循正常的公有/私有访问规则。

注:虽说static成员不属于对象,但是就访问权限而言,还是遵循类的规则


2 当我们在类的外部定义 static 成员时,无须重复指定 static 保留字,该保留字只出现在类定义体内部的声明处,像使用任意的类成员一样,在类定义体外部引用类的 static 成员时,必须指定成员是在哪个类中定义的。然而,static 关键字只能用于类定义体内部的声明中,定义不能标示为 static。

     注:static 仅用于声明,不用于定义处。


3 因为 static 成员不是任何对象的组成部分,所以 static 成员函数不能被声明为 const。毕竟,将成员函数声明为 const 就是承诺不会修改该函数所属的对象。最后,static 成员函数也不能被声明为虚函数

注:const 意味着该函数不能改变对象的任何数据,所以const成员函数针对具体的类的对象而言,而static则与对象无关,所以 static 成员函数不能被声明为 const。static成员函数不能被声明为虚函数,是因为静态成员数无法重载。附上一个链接讲述const成员函数的

http://blog.csdn.net/whyglinux/article/details/602329


4 const static成员,一般而言,类的 static 成员,像普通数据成员一样,不能在类的定义体中初始化。相反,static 数据成员通常在定义时才初始化。例外是,只要初始化式是一个常量表达式,整型const static 数据成员就可以在类的定义体中进行初始化。

注:很好理解,常量就是不可改变的量,编译时就可确定的,所以放在声明处是OK的。


5 static 数据成员可用作默认实参:非 static 数据成员不能用作默认实参,因为它的值不能独立于所属的对象而使用。使用非 static 数据成员作默认实参,将无法提供对象以获取该成员的值,因而是错误的。

注:如何理解这句话呢。默认实参,顾名思义就是在该函数运行时,此参数已经是确定值了。非static数据成员由对象所决定,无法保证做到这一点。而static和对象无关,所以可以。


6 static 数据成员的类型可以是该成员所属的类类型。非 static 成员被限定声明为其自身类对象的指针或引用:

     class Bar {     public:         // ...     private:         static Bar mem1; // ok         Bar *mem2;       // error原书此处有误         Bar mem3;        // error     };


习题解答

下面的 static 数据成员声明和定义中哪些是错误的(如果有的话)?解释为什么。

     // example.h     class Example {     public:         static double rate = 6.5;//error,只有const数据成员才可以在此初始化         static const int vecSize = 20;//OK         static vector<double> vec(vecSize);//error  ver(vecSize)表示在此就初始化vec的大小,只有const数据成员才可以在此初始化     };     // example.C     #include "example.h"     double Example::rate;//OK 初始化为0     vector<double> Example::vec;//OK  初始化为空



谢谢你的阅读!