Person p1("ahoj",20);
const Person* p = &p1;//对象是const
Person const* p = &p1;//对象是const
Person *const p = &p1;//指针是const
区别的标记并不是谁离得近,而是他在*号的前面还是后面。
int i; |
const int ci=3; |
|
int* ip; |
ip=&i; |
ip=&ci;//ERROR |
const int* cip; |
cip=&i; |
cip=&ci; |
常成员
const成员变量
· 必须使用初始化参数列表初始化,初始化之后不能修改
const成员函数
· 类成员函数形参表之后,函数体之前加上const,这样的函数称为常函数
· const实际修饰的是this指针
· 常函数内部无法修改成员变量的值,除非mutable修饰该成员变量
const对象
· 这个对象里的成员变量是无法修改的
· 被const修饰的对象,对象指针或对象引用,统称为常对象
· 常对象只能调用常函数,非常对象即可调用常函数,也可调用非常函数,优先调用非常版本
· 成员函数常版本和非常版本可以构成重载
class A
{
A():m_a(10){} //常成员变量必须用这种方式赋初始值
~A(){}
private:
const int m_a;
};
class Student
{
public:
Student(string name,int age):m_name(name),m_age(age){}
~Student(){}
void foo()
{
cout << "Student::foo()" << endl;
}
void foo()const // const修饰this指针
{
cout << "Student::foo()const" << endl;
}
void print()const // <=> void print(Student const* const this)
{
cout << "Student::print()const" << endl;
cout << m_name << "," << ++this->m_age << endl;
}
// this指向不可修改
// this指向的对象不可修改
private:
string m_name;
mutable int m_age; //被mutable修饰的常成员变量可以修改
};
int main()
{
Student stu("ahoj",19);
stu.print();
return 0;
}