常对象
用const修饰的对象称为常对象,为什么要用常对象这样的数据呢?——保证数据的安全性,为了确保数据在共享的时候不被随意更改。const在修饰函数时,声明和定义时都要包含,调用时可以不加从const。
常对象就是用const修饰的对象,常对象中的数据成员为常变量且必须要有初值。
常对象的声明
const 类名 对象[(实参表)];或者 类名 conts 对象[(实参表)];
这两种形式说明,常对象声明时const只要在对象名前就行,举个日期的例子。
例子:const Date date(2024,4,28); Date const date(2024,4,28); 。
性质
数据成员不能被修改
在所有情况下,date里面的所有数据成员的值不能被修改。
常对象不能调用非const成员函数
常对象不能调用该对象的非const型的成员函数,除了系统自动生成的构造函数与析构函数。编译系统只要发现常对象调用了成员函数,就会检查,该函数是不是const,不是就会报错。
const型成员函数
如何将成员函数声明成const型成员函数——只要在函数声明后面加上const就行;
例如:void PrintDate() const;
const型成员函数,又被称为只读成员函数。
const型成员函数只能访问类对象的任何数据成员的值,不能修改。
常对象成员
分解一下这个词,对象成员包括数据成员和成员函数,常对象成员,也就是用const声明的数据成员和用const声明的成员函数分别为 常数据成员,常成员函数。
常数据成员
常数据成员的声明和作用与常变量类似,
常变量
1.用const声明
2.在程序运行过程中不能被修改
3.声明的同时必须初始化
常数据成员
1.用const声明
2.在程序运行过程中不能被修改
3.在声明时必须初始化——构造函数必须使用初始化列表
常成员函数
常成员函数就是const型成员函数,前面说过,const型成员函数的声明就是在成员函数声明后面加上const,常成员函数只能访问对象的数据成员,不能修改数据成员的值。
注意
常对象中的数据成员都是常数据成员,成员函数只有加const的才是常数据成员;
没有声明const成员函数,即使函数内部没有修改数据成员,也不能被常对象调用;
常成员函数不能调用非const成员函数。
总结
const型数据成员
无论是对象的const型数据成员还是常对象的const型数据成员都是不能被修改的
const型成员函数
无论是对象的const型成员函数还是常对象的const型成员函数都是只能访问数据成员的值不能修改;
const型成员函数只能调用const型成员函数,不能调用非const型成员函数。
常对象
常对象只能调用const型的成员函数;
常对象中的数据成员都是const型数据成员。
指针与const
指向对象的常指针
指向对象的常指针——将指向对象的指针加上const修饰,这样这个指针指向的对象就不能在修改,只能指向该对象。
类名 *const 指针名=&对象;
Date *const pdate=&date;
这样pdate就只能指向date这个对象;
应用场景
可以给函数的形参指针加上const,这样函数体代码里面就不允许出现修改指针指向的代码;
指向常对象的指针
这是当一个对象已经被声明成为常对象,想要让一个指向该常对象,那么就只能用指向常对象的指针,来指向这个常对象;
定义指向常对象的指针:const 类名 *指针名;
const Date date(2024,4,27);//常对象定义
const Date *pdate=&date;//指向常对象的指针
指向常对象的指针指向非常对象
如果定义了一个指向常对象的指针,并让其指向非常对象则会导致:
这个非常对象的值不能通该指针来修改;
并且无法通过该指针调用非const成员函数。
可以改变指向
指向常对象的指针的指向对象不能改变,但是,该指针的指向可以改变;
函数形参
指向常对象的指针最常用于函数的形参,可以在函数体代码执行中保证该指针指向对象的内容不被修改。实参可以是常对象,也可以是非常对象。
总结
指向对象的常指针:指针被const修饰,导致该指针只能指向一个对象,对象里面的值可以随意修改。
指向常对象的指针:对象被const修饰,导致该对象里面的值不能被修改,而指针的指向可以修改。
对象的常引用
对象的引用就是对象的别名,这个别名和对象名都是代表同一块内存空间,别名在声明时,要先初始化(也就是谁的别名),一旦初始化,后面就不能更改(不能成为别人的别名)
对象加上const多了一个 区别——通过常引用只能调用const型成员函数;
常引用与指向常对象的指针用法相似。