C++中常对象、常成员函数、常成员变量
谭浩强C++ P283
1. 常对象
类名 const 对象名
const 类名 对象名 // 以下两种形式两种都可以
- 所有成员的值都不能修改,
(所有数据成员都是常数据成员)
(非要改变成员变量用mutable标记成员变量) - const对象只能调用const成员函数,不能调用非const函数,但类中可能有非const函数,但不能用
- 必须要有初值
2. 常数据成员
- 必须用参数初始化表初始化,因为其不能赋值
- 能被常/非常成员函数引用
3. 常成员函数
void f1() const //const加后面
- 只能引用本类中数据成员,不能修改它们
- 能引用常/非常数据成员
4. 指向对象的常指针
指针变量声明为const型,不能改变指针指向,但能改变指向对象的值
类名 *const 指针变量名
常作为函数形参,不允许函数在执行过程中改变指针变量的值,让其始终指向原来的对象。
如果函数执行过程中修改了该形参,编译系统会发现错误,比人工保证形参不被修改更可靠。
int main() {
Student s1(3, "1111");
Student s2(2, "2222");
Student *const p = &s1;
(*p).get();
// p = &s2; //报错
};
5. 指向常对象的指针
指向的对象内容(ex:成员变量)不能通过指针改变
const 类名 *指针变量名
区分:
指向对象的常指针
Time *const p
指向常对象的指针
const Time *p
指向的对象不能变
int main() {
Student s1(3, "1111");
const Student *p = &s1;
(*p).get();
(*p).num = 10; //编译出错
}
- 一个对象已被声明为常对象,只能用指向常对象指针指向
- 指向常对象的指针,可以指向一个非const对象,但其指向的对象不能通过指针来改变,如果希望任何情况下s1的值都不能改变,应把它定义为const型
(指向的对象不能通过指针来改变的原因:用指向常对象的指针指向变量期间,变量也有常变量特征,其值不能改变)
Student s1(3, "1111");
- 指向非const对象的指针,不能指向const对象
(形参是const对象的指针,实参不能指向const对象)
(原因:形参指针和实参指针指向同一变量,形参所指向的变量的数是可以改变的,但实参是const变量的地址,指向的变量的值是不可改变的,发生矛盾)
形参 | 实参 | |
---|---|---|
非const对象的指针 | 只能非const对象的指针 | 可以改变值 |
const对象的指针 | const/非const对象的指针 | 不可改变值 |
- 指向常对象的指针常用于函数形参,保护形参所指的对象,让它在函数执行过程中不被修改
int main() {
Student s1(3, "1111");
s1.f1(&s1);
}
void Student::f1(const Student *p) {
cout << p->num;
p->num = 4; //编译错误
}
- 指向常对象的指针变量,不能改变指向对象的值(内容),可以改变指针指向的值
int main() {
Student s1(3, "1111");
Student s2(4, "2222");
const Student *q = &s1;
q = &s2; //同样不能通过改变s2的值
}
6. 对象的常引用
void f1(const ClassName &point)
不希望在函数中修改实参s1的值,可以把引用变量student修改为const(常引用)
在函数f1()中不能修改student的值,也不能改变实参s1的值
class Student {
...
Student(int, string);
};
int main() {
Student s1(3, "1111");
Student s2(4, "2222");
s1.f1(s1);
s1.get();
}
void Student::f1(const Student &student) {
student.num = 10; //编译错误
}
7. 指针常量/常量指针区别小技巧
- 常量指针通常有两种表示方法:
method 1: const double * ptr;
method 2: double const *ptr;
- 指针常量通常表示为:
double * const ptr;
- 读法:
const double * ptr;//按照顺序读作常量指针:指向常量的指针--即所指向的值不能变.
double const * ptr;//同上
double * const ptr;//按照顺序读作指针常量,指针是一个常量--指针的值不能变.
- 常量换成类的对象,读法一样
// 指向对象的常指针
Time *const p
// 指向的对象内容(ex:成员变量)不能通过指针改变
// 指向常对象的指针
const Time *p
// 指向的对象不能变
首先读“指向”,然后碰到什么读什么,
碰到对象类型读指向对象的常指针,
碰到const,读指向常对象的指针。
- 理解
读法参照4,理解:*后为一整体,有const为常指针,无const为常对象/量
const double * ptr; // 指向常量的指针
double * const ptr; // 指向变量的常指针
Time *const p; // 指向对象的常指针
const Time *p; // 指向常对象的指针
这部分参考: https://blog.csdn.net/a15261893837/article/details/70767385#commentBox