C++笔记(四)——Const修饰符

文章目录

  • 1. 常对象
  • 2. 常对象成员
  • 3. 指向对象的常指针
  • 4. 指向常对象的指针变量
  • 5. 对象的常引用
  • 6. CONST型数据小结

C++笔记(四)——Const修饰符_第1张图片

既要使数据能在一定范围内共享,又要保证它不被任意修改,这时可以使用const,即把有关数据定义为常量

1. 常对象

在定义指定对象为常对象时,有以下几点要注意

  1. 常对象中的数据成员为常变量且必须要有初值
  2. 常对象不能调用该对象的非const型的成员函数(除系统自调的隐式构造函数及析构函数)

定义常对象的一般形式为:两种定义方式等价

  • 类名 const 对象名[(实参表列)]
  • const 类名 对象名[(实参表列)]
const Time t(1,2,3);		// 定义常对象t,并指定数据成员的初值
t.get_time();				// 企图调用常对象t中的非const型成员函数,非法,编译不通过

void get_time() const;		// 将函数声明为常成员函数,常成员函数可以访问常对象中的数据成员,但仍不可修改常对象中数据成员的值

mutable int count;			// 把count声明为可变的数据成员,这样就可以用声明为const的成员函数来修改它的值

2. 常对象成员

可以在声明类时将成员声明为const,即声明常数据成员和常成员函数

  1. 常数据成员

    • 常数据成员的值不可改变
    • 只能通过构造函数的参数初始化表对常数据成员进行初始化
    const int hour;					// 类体内声明常数据成员hour
    
    Time::Time(int h)				// 类体外定义构造函数,并对hour赋初值,非法
    {
    	hour = h;
    }
    
    Time::Time(int h):hour(h){}		// 合法
    
  2. 常成员函数

    • 常成员函数只能引用本类中的数据成员,而不能修改它的值
    • const 是函数类型的一部分,咋声明和定义函数的时候都要有const关键字,在调用时不必加const

    详情如下表

    数据成员 非const成员函数 const成员函数
    非const数据成员 可以引用,也可修改值 可以引用,但不可修改值
    const数据成员 可以引用,但不可修改值 可以引用,但不可修改值
    const对象的数据成员 不可引用和修改 可以引用,但不可修改值

3. 指向对象的常指针

将指向对象的指针变量声明为const型,并使之初始化,这样指针值始终保持为其初值,不能改变,即其指向始终不变,定义指向对象的长指针一般形式为:类名 * const 指针变量名 = 对象地址

Time t(1,2,3), s;			
Time * const pt = &t;		// 定义指向对象的常指针,指向对象t,此后pt一直指向t,不可修改
pt = &s;					// 企图修改指向对象的常指针的指向,非法

4. 指向常对象的指针变量

下面通过指向常变量的指针变量的知识,引申指向常对象的指针变量,在内容上两者的概念和使用时类似的,只要将“变量”改为“对象”即可。定义指向变量的指针变量的一般形式为:const 类型名 * 指针变量名

  1. 如果一个变量已被声明为常变量,只能用指向常变量的指针变量指向它,而不能用非const的指针变量指向它

    const char c[] = "boy";		// 定义const型的char数组
    const char * p1;			// 定义p1为指向const型的char变量的指针
    p1 = c;						// 合法,指向常变量
    char * p2 = c;				// 非法,p2不是只想常变量的指针变量
    
  2. 指向常变量的指针变量不仅可以指向常变量,还可以指向未被声明为const的变量。此时不能通过此指针变量修改该变量的值

    char c1 = 'a';
    const char * p;			// 定义了一个指向常变量的指针变量p
    p = &c1;				// 使p指向字符变量c1
    * p = 'b';				// 非法,不能通过p改变变量c1的值
    c1 = 'b';				// 合法,没有通过p访问c1,c1不是常变量
    
    

下表为:用指针变量作形参时形参和实参的对应关系

形参 实参 合法? 改变指针所指向得变量得值
指向非const型变量的指针 非const变量的地址 合法 可以
指向非const型变量的指针 const变量的地址 非法 /
指向const型变量的指针 const变量的地址 合法 不可
指向const型变量的指针 非const变量的地址 合法 不可

5. 对象的常引用

一个变量的引用就是变量的别名

实质上,变量名和引用名都是指向同一段内存单元。如果形参为变量的引用名,实参为变量名,则在调用函数进行虚实结合时,并不是为形参另外开辟一个存储空间,而是把实参变量的地址传给形参,这样引用名也指向实参变量

#include 
using namespace std;

class Time
{
	public:
		Time(int ,int ,int );
		int hour;
		int minute;
		int sec;
};
Time::Time(int h,int m,int s)
{
	hour = h;
	minute = m;
	sec = s;
}
void fun1(Time &t)
{
	t.hour = 18;
}
void fun2(const Time &t)		// 对象的常引用,不可修改对象t的值
{
	t.hour = 19;    
}

int main()
{
	Time t1(1,2,3);				
	fun1(t1);					// 实参是Time类对象,可以通过引用来修改实参t1的值
	cout << t1.hour << endl;	
    fun2(t1);					// 非法,因为形参为const型,不可修改实参对应的值
	return 0;
}

6. CONST型数据小结

形式 含义
Time const t1;const Time t1; t1是常对象,其值再任何情况下都不可改变
void Time::fun() const fun是Time类中的常成员函数,可以引用,但不能修改类中的数据成员
Time * const p p是指向Time对象的常指针,p的值不可改变
const Time * p p是指向Time类常对象的指针,指向的对象的值不能通过该指针来改变
Time &t1 = t t1是Time类对象t的引用,t和t1指向同一段内存空间

下一章:静态成员
C++笔记(四)——Const修饰符_第2张图片

你可能感兴趣的:(C++学习,c++,开发语言,后端)