const对象和const函数的用法限制以及对const成员变量或引用的初始化问题

来源:互联网 发布:win10 telnet 端口 编辑:程序博客网 时间:2024/05/17 23:56

                           Const对象和const成员函数

将对象声明为const将有助于贯彻最小特权原则。修改这种对象的任何企图在编译时就会被发现,而不是等到执行期才导致错误。 

要将成员函数指定为const则既要在其原型中指定,又要在其定义中指定。方法是在函数参数列表后和函数体开始的左花括号前插入关键字const;

1 将修改对象的数据成员的成员函数定义为const将导致编译错误。

2  定义为const的成员函数如果又调用同一类的同一实例的非const成员函数,将会导致编译错误。如果常量对象的const函数调用其他对象改变其他对象的非const成员变量值  不会出错,但前提是必须为(只要声明const对象来调用const成员函数,则必须为所在类显式的提供默认构造函数)

3   在const对象上调用非const成员函数将导致编译错误。

4   试图将构造函数和折构函数声明为const是一个编译错误——对于构造函数和折构函数而言,两者都会修改对象。切记:不允许对构造函数和折构函数进行const声明。必须允许构造函数修改对象,这样对象才能恰当的初始化。而折构函数必须能够在对象使用的内存被系统回收之前进行它的扫尾工作。

5   可以对const成员函数进行非const版本的重载。编译器将根据调用函数的对象的性质选择相应的重载函数来使用。如果对象是const,则编译器使用const版本的重载函数;如果对象是非const,则编译器使用非const版本的重载函数。

6   尽管构造函数必须是非const函数,但它仍然可以初始化const对象。在构造函数中调用非const成员函数来作为初始化const对象的一部分是允许的。const对象的“常量性质” 在从构造函数完成对象初始化开始到对象的折构函数被调用结束这个过程之间是一直保持的。

7  使用成员初始化器来初始化const数据成员——所有的数据成员均可以用成员初始化器形式进行初始化,但是const数据成员和引用的数据成员必须使用成员初始化器进行初始化。关于const成员的初始化问题如下 :如果给类中的const成员变量初始化时 可以直接在类体内定义变量时初始化赋值。也可以使用成员初始化器进行初始化。但定义以后再对其赋值就会造成错误。而关于const成员引用的初始化问题如下:只能用成员初始化器对其初始化,方法是在构造函数列表内声明同一类型的参数,然后使用初始化器对引用进行初始化。切记,在定义引用的同时进行初始化赋值,或者用构造器进行初始化时直接用数值或常量值对其初始化都是错误的。

   关于成员初始化器用法如下:成员初始化器列表用一个冒号(:)与参数列表分开。每个成员初始化器都是由数据成员名称后紧跟着包含该成员初始化值的一对圆括号组成;注意多个成员初始化器之间用逗号隔开。注意:成员初始化器列表在构造函数执行前被执行。


8 const对象不能通过赋值修改,所以它必须被初始化,当类的某个成员变量引用被声明时,必须使用初始化器且必须使用构造函数参数对其初始化。而对于const对象的某个成员变量被用const声明时,可以使用初始化器,也可以在初始化器内赋常值,也可以在类定义体内用const声明变量的同时进行初始化赋值,但不可以再进行其他方式的赋值(例如在构造函数中为这些类型数据赋值是不允许的)。

9 不为const数据成员进行初始化 会造成编译错误。





0 0
原创粉丝点击