特殊的对象、类成员
一、特殊的对象
- const 对象
类对象也可以声明为 const 对象,一般来说,能作用于 const 对象的成员函数除了构造函数和析构函
数,便只有 const 成员函数了,因为 const 对象只能被创建、撤销以及只读访问,改写是不允许的。
- 指向对象的指针
初始化表达式是可选的,既可以通过取地址(&对象名)给指针初始化,也可以通过申请动态内存给指
针初始化,或者干脆不初始化(比如置为 nullptr ),在程序中再对该指针赋值。 指针中存储的是对象所占内存空间的首地址
- 堆对象
使用new表达式为对象数组分配动态空间时,不能显式调用对象的构造函数,因此,对象要么没
有定义任何形式的构造函数(由编译器缺省提供),要么显式定义了一个(且只能有一个)所有参数都
有缺省值的构造函数。
二、特殊的成员函数
- 静态成员函数
静态成员函数的参数列表中不含有隐含的this指针。
静态成员函数不在类外声明也能够使用。
1. 静态成员函数内部不能使用非静态的成员变量和非静态的成员函数
2. 静态成员函数内部只能调用静态数据成员和静态的成员函数
- const 成员函数
把const 关键字放在函数的参数表和函数体之间。
1. 只能读取类数据成员,而不能修改之。
2. 只能调用 const 成员函数,不能调用非 const 成员函数。
三、特殊的数据成员
- 常量数据成员
当数据成员用 const 关键字进行修饰以后,就成为常量成员。一经初始化,该数据成员便具有“只读属性”,在程序中无法对其值修改。事实上,在构造函数体内初始化 const 数据成员是非法的,它们只能在构造函数初始化列表中进行初始化。
- 引用数据成员
和常量成员相同,引用成员也必须在构造函数初始化列表中进行初始化,否则编译报错。
- 类对象成员
当数据成员本身也是自定义类类型对象时,比如一个直线类 Line 对象中包含两个 Point 类对象,对
Point对象的创建就必须要放在Line 的构造函数的初始化列表中进行。
- 静态数据成员
C++ 允许使用 static (静态存储)修饰数据成员,这样的成员在编译时就被创建并初始化的(与之相比,对象是在运行时被创建的),且其实例只有一个,被所有该类的对象共享。
静态数据成员和之前介绍的静态变量一样,当程序执行时,该成员已经存在,一直到程序结束,任何该类对象都可对其进行访问,静态数据成员存储在全局/静态区,并不占据对象的存储空间。
因为静态数据成员不属于类的任何一个对象,所以它们并不是在创建类对象时被定义的。这意味着它们不是由类的的构造函数初始化的,一般来说,我们不能在类的内部初始化静态数据成员,必须在类的外部定义和初始化静态数据成员,且不再包含 static 关键字。