您的位置:首页 > 编程语言 > C语言/C++

C++ 中const的总结

2015-10-11 16:00 316 查看
const声明一个只读变量

与其他变量不同,除非特别说明,在全局作用域声明的const变量是定义该对象的文件的局部变量,非const变量默认为extern。要是const变量能够在其他的文件中访问,必须显示地指定它为extern。

const引用能指向const变量或非const变量,非const引用只能指向非const对象

const引用可以初始化为不同类型的对象或者初始化为右值同样的初始化对于非const引用却是不合法的,而且导致编译错误

int i = 42;

double dval = 3.14;

const int &ref1 = 42;      //右值

const int &ref2 =  dval ;      (这里编译器会转换为 int temp = dval; const int &ref2 = temp)如果这里ref2不是const,那么可以给ref2赋值,但实际上修改的是temp,所以不允许将非const引用初始化为不同类型的对象


在const成员函数中,this指针是一个const类型的const指针,非const成员函数的中this位指向类类型的const指针。因此下面的例子不合法

class A

{

public:

A():x(32){}

A &display_x()  const                            //Error:无法将const  A& 转换为 A&

{

cout << x;

return *this;

}

void set_x(int val)

{

x = val;

}

private:

int x;

};

如果在前面加上const 的话就不能这样使用

A a = A();

a.diaplay_x().set_x();

一个解决方法是覆盖display_x()函数,则正确的定义如下

class A

{

public:

A():x(32){}

const A &display_x() const

{

cout << x;

return *this;

}

A &display_x()

{

cout << x;

return *this;

}

void set_x(int val)

{

x = val;

}

private:

int x;

};


const 对象只能只能使用const 成员(数据成员和函数成员)。非const对象可以使用任意成员。

如果要在const修改数据成员,则数据成员必须用mutable 声明

构造函数或析构函数不可以使用类型限定符,也就不可以声明为const。

成员函数如果声明为const,则在定义时也需要加上const

对于const的数据成员必须在初始化列表初始化。唯一例外的是static const int变量可以在类中定义初始化(注意这里限定为整形,这里包括char、int、 long、枚举,不包括double,至于为什么目前不清楚)这里不同编译器处理并不同,VS2010上double型的报错,而在codeblock 编译却是合法的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 对象