C++:常对象、常成员变量、常成员函数、指向对象的常指针、指向常对象的指针、对象的常引用

谭浩强C++ P283

1. 常对象

类名 const 对象名
const 类名 对象名 // 以下两种形式两种都可以
  1. 所有成员的值都不能修改,
    (所有数据成员都是常数据成员)
    (非要改变成员变量用mutable标记成员变量)
  2. const对象只能调用const成员函数,不能调用非const函数,但类中可能有非const函数,但不能用
  3. 必须要有初值

2. 常数据成员

  1. 必须用参数初始化表初始化,因为其不能赋值
  2. 能被常/非常成员函数引用

3. 常成员函数

void f1() const //const加后面
  1. 只能引用本类中数据成员,不能修改它们
  2. 能引用常/非常数据成员

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; //编译出错
}
  1. 一个对象已被声明为常对象,只能用指向常对象指针指向
  2. 指向常对象的指针,可以指向一个非const对象,但其指向的对象不能通过指针来改变,如果希望任何情况下s1的值都不能改变,应把它定义为const型
    指向的对象不能通过指针来改变的原因:用指向常对象的指针指向变量期间,变量也有常变量特征,其值不能改变)
Student s1(3, "1111");
  1. 指向非const对象的指针,不能指向const对象
    (形参是const对象的指针,实参不能指向const对象)
    (原因:形参指针和实参指针指向同一变量,形参所指向的变量的数是可以改变的,但实参是const变量的地址,指向的变量的值是不可改变的,发生矛盾)
形参实参
非const对象的指针只能非const对象的指针可以改变值
const对象的指针const/非const对象的指针不可改变值
  1. 指向常对象的指针常用于函数形参,保护形参所指的对象,让它在函数执行过程中不被修改
int main() {
	Student s1(3, "1111");
	s1.f1(&s1);
}

void Student::f1(const Student *p) {
	cout << p->num;
	p->num = 4; //编译错误
}
  1. 指向常对象的指针变量,不能改变指向对象的值(内容),可以改变指针指向的值
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. 指针常量/常量指针区别小技巧

  1. 常量指针通常有两种表示方法:
method 1: const double * ptr;
method 2: double const *ptr;
  1. 指针常量通常表示为:
double * const ptr;
  1. 读法:
const double * ptr;//按照顺序读作常量指针:指向常量的指针--即所指向的值不能变.
double const * ptr;//同上

double * const ptr;//按照顺序读作指针常量,指针是一个常量--指针的值不能变.
  1. 常量换成类的对象,读法一样
// 指向对象的常指针
Time *const p
// 指向的对象内容(ex:成员变量)不能通过指针改变

// 指向常对象的指针 
const Time *p
// 指向的对象不能变

首先读“指向”,然后碰到什么读什么,
碰到对象类型读指向对象的常指针,
碰到const,读指向常对象的指针。

  1. 理解
    读法参照4,理解:*后为一整体,有const为常指针,无const为常对象/量
const double * ptr; // 指向常量的指针
double * const ptr; // 指向变量的常指针

Time *const p; // 指向对象的常指针
const Time *p; // 指向常对象的指针

这部分参考: https://blog.csdn.net/a15261893837/article/details/70767385#commentBox

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值