摘要
const 是C++一个强大的工具,可以帮助我们提高程序的健壮性,减少运行期可能发生的错误,但是,对于初学者来说,const也是相对难以掌握的,我将对const进行一下总结。
const 变量
普通的内置对象
const int i=0;
const int& j=i;
const指针
const int *i = new int[30];
//const 修饰的是(*i), 所以(*i),也就是值本身不可变,也就是一个low-level const
int * const i = new int[30];
//const 修饰的是(i), 所以(i),也就是指针本身不可变,也就是一个top-level const
const 返回值函数
- by-value
class v{}
const v func(int i){
return v(i); //返回一个对象,编译器会进行优化
}
- by-reference
class v{}
const v& func(int i){
v c(i);
return c; //很蠢,因为c在离开该函数后已经被析构了
}
- by-pointer
class v{}
const v* func(int i){
return new v(i); //也很蠢,开发者还要记得delete它
}
class与const
在这一章节中,将重点介绍class,也就是类与const的一些应用
首先,我们定义一个类constTest作为我们测试的舞台
class constTest
{
public:
const int c_int;
int _int;
public:
constTest();
explicit constTest(int);
int get_cInt() const;
int get_int();
};
const 成员变量
const成员变量的声明很简单,只需要在成员变量类型前加上const即可
const int c_int;
由于const成员变量的值需要在对象初始化阶段时被定义,因此const成员变量必须通过成员变量赋值列来完成定义
constTest::constTest(int i):c_int(i),_int(i)
{}
这种写法十分高效,比以下写法好的多
constTest::constTest(int i):c_int(i)
{
this->_int=i;
}
但是要注意的是赋值的顺序最好与声明的顺序一致,防止某些构造函数参数间的依赖性:
class A{
public:
A(int a):a(a);
}
class C{
public:
C(A a):a(a);
}
class B{
public:
int num_a;
A a;
C c;
B(int);
}
B::B(int num):C(this->num_a),num_a(num),A(this->C) //这句话有bug哟~
{}
const 成员函数
在class中声明const成员函数,只需要在函数后加一个const即可:
int get_cInt() const;
被声明为const的成员函数:
- 可以访问所有的成员变量;
- 不可以对成员变量进行赋值;
- 不可以调用非const的成员函数(因为非const的成员函数有权利对成员变量进行赋值)
没有被声明为const的成员函数:
- 可以访问所有的成员变量;
- 可以对非const成员变量进行赋值;
- 可以调用所有的成员函数
const对象
我们构造一个普通对象和一个const对象
const constTest c1(1);
constTest c2(1);
被声明为const的对象
- 可以访问所用的成员变量
- 不可以进行任何赋值
- 不可以调用非const成员函数
没有被声明为const的对象
- 可以访问所用的成员变量
- 可以调用所有成员函数
参考文献
《Effective C++》
《More Effective C++》