C++:const成员函数的使用细则


const 修饰类的成员函数

将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际 修饰该成员函数隐含的this指针,表明在该成员函数中 不能对类的任何成员进行修改
在这里插入图片描述

注意:

this指针类型为:类类型 * const

  1. this 指针始终指向调用成员函数对象的地址,其地址不能变,对值无限制。
  2. 成员函数经const修饰,其值也不能改变
  3. const 关键字不能与 static 关键字同时使用,因为 static 关键字修饰静态成员函数,静态成员函数不含有 this 指针,即不能实例化,const 成员函数必须具体到某一实例。

请思考下面的几个问题:

  1. const对象可以调用非const成员函数吗? ————> 不可以
  2. 非const对象可以调用const成员函数吗? ————> 可以
  3. const成员函数内可以调用其它的非const成员函数吗? ————> 不可以
  4. 非const成员函数内可以调用其它的const成员函数吗? ————> 可以

要点总结:

权限可以被缩小但不能被放大,普通对象可以调用普通成员函数,也可以调用const成员函数,只是在调用const成员函数时,无法进行’写’操作。而const对象一定不能进行写操作,所以不能调用普通成员函数。并且,普通成员函数内部可以调用const成员函数,而const成员函数内部不能够调用普通成员函数。

解答如下:

class Date {
public:
	Date(int year, int month, int day) {
		_year = year;
		_month = month;
		_day = day;
	}
	Date(const Date& d) {
		_year = d._year;
	}
	void display() const {     // 相当于 void display(const Date* const this)
		cout << _year << "display() const" << endl; // 可读
	}
 
	void display() {
		cout << _year << "display()" << endl;
	}
 
private:
	int _year;
	int _month;
	int _day;
};
 
int main() {
	Date d1(2019, 4, 1);             // 普通对象
	const Date d2(2019, 3, 31);      // const对象
	d1.display();
	d2.display();

	return 0;
}

创建了两个对象,d1、d2,其中d1为普通对象,d2为const对象。在调用display函数时,d1就调用普通的成员函数,d2因为为const对象,不可改写,调用const成员函数。实质上,这两个成员函数构成了重载函数。
在这里插入图片描述

class Date {
public:
	Date(int year, int month, int day) {
		_year = year;
		_month = month;
		_day = day;
	}
	Date(const Date& d) {
		_year = d._year;
	}
	void display() const {     // 相当于 void display(const Date* const this)
		cout << _year << "display() const" << endl; // 可读
	}
 
	//void display() {
	//	cout << _year << "display()" << endl;
	//}
 
private:
	int _year;
	int _month;
	int _day;
};
 
int main() {
	Date d1(2019, 4, 1);             // 普通对象
	const Date d2(2019, 3, 31);      // const对象
	d1.display();
	d2.display();

	return 0;
}

测试结果:编译通过,普通对象也调用const成员函数。
在这里插入图片描述

那么我们把const成员函数注释掉,调用关系又该怎样变化呢?

class Date {
public:
	Date(int year, int month, int day) {
		_year = year;
		_month = month;
		_day = day;
	}
	Date(const Date& d) {
		_year = d._year;
	}
	//void display() const {     // 相当于 void display(const Date* const this)
	//	cout << _year << "display() const" << endl; // 可读
	//}

	void display() {
		cout << _year << "display()" << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};

int main() {
	Date d1(2019, 4, 1);             // 普通对象
	const Date d2(2019, 3, 31);      // const对象
	d1.display();
	d2.display();

	return 0;
}

测试结果:报错,编译不通过。const对象,调用非const成员函数,直接报错。因为可能内容会被修改,导致直接报错。
在这里插入图片描述

const习题

  1. print()函数是一个类的常成员函数,它无返回值,下列表示中正确的是()

A. const void print();
B. void const print();
C. void print() const;
D. void print(const);

正确答案

C

答案解析:

const void print(const int num)const 第一个const修饰返回类型 第二个const修饰参数 第三个const修饰调用对象

const修饰类的成员函数,一般放在函数体后,如 void fun() const;
常成员函数声明:形如 void funcName(参数表) const;
对于常成员函数需要注意:
1、其实现部分也要带const关键字;
2、不能修改类的成员变量,不能调用类中没有被const修饰的成员函数(即只能调用常成员函数);


如果有不同见解,欢迎留言讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值