?对于需要共享又要防止被修改的数据因该声明为常量;
1. 常对象
?常对象的数据成员的值在整个生存期间都不会被改变,所以常对象必须初试化,然后不能被更新
class A
{
public:
……
A(int a,int b):x(a),y(b){}
……
private:
int x,y;
};
const A a(3,4);
【属性】常对象不能被赋值的两种保护: (1)一般用对象.数据成员=值 的方式,但是限制其不能这样赋值。 (2)类中用成员函数访问去更改值,而语法规定:不能通过常对象调用普通成员函数 而常对象唯一的对外接口是: (3)调用常成员函数
2. 常成员函数
类型说明符 函数名(参数表) const { }
(1)因为不管是否是常常对象调用常成员函数,都会将该对象视作常对象,那么此时的常成员函数是不能修改对象的数据成员的值。 (2)const可以被视为重载的区分:(一般如果对象为非常对象调用这两个重载函数,优先调用非常成员函数 )
void print();
void print() const;
扩展理解 ?非静态成员函数 后面加const(加到非成员函数或静态成员后面会产生编译错误),表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,任意修改它所在的类的成员的操作都是不允许的 (因为隐含了对this指针的const引用);唯一的例外是对于mutable修饰的成员。 总结:
- 非const对象/const对象------>const成员函数
- const的对象(只能)---->const成员函数
- 非const成员函数(只被)<------非const对象
? 一般对于不需修改操作的成员函数 尽量声明为const成员函数,以防止产生const对象无法调用该成员函数的问题
3.常数据成员
类中声明常数据成员后就不能在类成员函数或者外面对象访问赋值。只能通过初始化列表初始化。
class A{
public:
A(int i);
private:
const int a;
static const int b;
}
A::A(int i) : a (i){}
const int A::b = 10;
【注意】类的静态变量和常量都是在类内声明,类外赋值的。但静态常量 如果是整形和枚举类型 可以直接在类内指定其值,此时编译器会将所有的A::b替换为10(但如果出现如给b取地址,需要分配空间,得专门定义A::b)
4. 常引用
常引用引用的对象不能被更新。如果常引用作参数,不会对原实参进行修改;
非常引用(绑定)—> 普通对象 常引用(绑定)—>常对象/普通对象----->(当作)常对象
?函数中无需改变其值的参数,不宜用普通引用方式传递,会使得常对象无法传入,可以传值或者常引用,传值会产生大量拷贝,传常引用更佳:复制构造函数 一般用常引用传递 例如:
void func(char *a){........}
int main(){
char *a="hello world!";
func(a);
return 0;
}
void func(const char *a){........}
|