C++中const小结
const 修饰普通变量
表示变量的值不能被改变。下面两条语句(第2
行和第3
行)表示的意思一致。
int a;
const int ca = 42;
//int const ca = 42;
const 修饰指针
指向常量的指针不能改变其指对象的值。第 5
行代码是错误的。
int a = 42;
const int * ip = &a;
int const * ipp = &a;
//*ip = 42;
常量指针不能改变其指向,也就意味着它必须要初始化。但是,可以通过常量指针改变其所指对象的值,如第 6
行代码,最终打印结果会是 56
。
int a = 42;
int b = 25;
int * const p = &a;
//p = &b;
*p = 56;
cout << "a: " << a << endl;
常量指针,同时它指向一个常量
const int a = 42;
const int * const p = &a;
const 与引用
临时对象的常引用。第2
行代码会报错,不能将double
类型引用绑定到int
类型变量上。但是,加了const
修饰后,就没有问题了。
int a = 42;
//double &f = a;
const double &f = a;
本质上,const
引用,引用了一个不可改变的临时变量。编译器把代码处理成了如下形式
const double temp = a;
const double &f = temp;
const 修饰函数参数
如果第1
行代码参数中没有const
,则会报错,不能将一个非const
左值引用类型绑定到一个右值(临时对象)上。故将参数修改为常引用
void foo(const std::string &str)
{
cout << str << endl;
}
int main()
{
foo("abcd");
return 0;
}
const 修饰类数据成员
const
修饰数据成员,称为常数据成员,可能被普通成员函数和常成员函数来使用,不可以更改。
必须初始化,可以在类中(不推荐),或者初始化列表中(这是在类对象生成之前唯一一次改变const
成员的机会了)。
class A
{
public:
A(int i)
:_ci(i)
{
cout << "A(int i)" << endl;
}
~A()
{
cout << "~A()" << endl;
}
void dis()
{
cout << _ci << endl;
}
private:
//const int _ci = 100; // 不推荐
const int _ci;
};
int main()
{
A a(42);
a.dis();
return 0;
}
const 修饰类成员函数
-
const
修饰成员函数,承诺在本函数内部不会改变类内的数据成员,因此,也只能调用承诺不会改变成员的其它const
成员函数,而不能调用其它非const
成员函数。 -
const
修饰成员函数,放在声明之后,实现体之前。 -
第
23
行代码,它只能调用const
成员函数,如果函数dis()
是没有const
修饰的话,第23
行代码将会报错。
class A
{
public:
A(int i, double d, float f)
:_ci(i), _cd(d), _fe(f)
{
cout << "A()" << endl;
}
~A()
{
cout << "~A()" << endl;
}
void dis() const
{
cout << _fe << endl;
}
void foo() const
{
//_fe = 4.56;
dis();
}
private:
const int _ci;
const double _cd;
float _fe;
};
int main()
{
A a(42, 25, 3.14);
a.foo();
return 0;
}
const 修饰对象
const
修饰对象,保证在对象层面,不会修改数据成员。所以const
对象,只能调用const
成员函数。
参考资料
Stanley等《C++ Primer e5》
王桂林《C++基础与提高》