C++
const修饰类成员变量、类成员函数、普通变量和普通函数
1. const修饰类成员变量
- const修饰的类成员变量,只能通过直接赋值(例如:a)、通过构造函数的初始化列表来赋值(例如:b)、和 const_cast来修改值(例如:c)
class A
{
public:
A(int b_, int c_) :b(b_), c(c_) {}
void doSometing()
{
int *p = const_cast<int*>(&c);
*p = 15;
}
public:
const int a = 5;
const int b;
const int c;
};
2. const 修饰类成员函数
-
const在类成员函数前,对于返回一个const修饰的变量的引用(例如:a),必须要返回常量引用(例如:doSometing1),因为不返回常量引用,外部可能通过该引用修改变量值。
-
const在类成员函数后,实质修饰的是this指针,相当于const *this,这样就不能通过成员函数来修改成员变量的值(例如:b),同上理由返回的引用也必须使常量引用。
-
若某成员变量有mutable关键词修饰,则const修饰的成员函数可以修改该成员变量值(例如:c),也可返回非常量引用。
class A { public: A(){} const int& doSometing1() { return a; } int& doSometing2() const { b = 4; //错误!,const放类成员函数后,不允许修改成员变量 return b; //错误!,const放类成员函数后,返回变量引用,外部可能通过该引用修改变量值 } int& doSometing3() const { c = 1; //正确,const修饰的成员函数可以修改 mutable 关键词修饰的变量 return c; } private: const int a = 5; int b = 5; mutable int c = 5; };
3. const修饰的普通变量
- const 修饰的普通变量,代表他是一个常量,只能通过const_cast来修改(例如:p2)
void doSometing()
{
const int a = 5;
int *p1 = &a; //错误!,试图用非常量指针指向const
int *p2 = const_cast<int*>(&a); //正确
*p2 = 10;
}
4.const修饰的普通函数
- 只用对返回的是引用时,要求返回const 引用(例如:doSometing2),返回的非引用时,因为返回的是原变量的一份拷贝值,所以有无const都不会影响原变量的值
int& doSometing1(const int a)
{
return a; //错误! 外部可能通过该引用修改变量值
}
const int& doSometing2(const int &a)
{
return a;
}
int doSometing3(const int &a)
{
return a;
}
int doSometing3()
{
const int a = 10;
return a;
}