【C++】const修饰的成员函数

在日常学习中总是碰到const修饰的成员函数,自己也总是稀里糊涂的,只能是靠着编译器来区分const和非const成员函数的相互调用关系,今天在这里总结以下。

一.const修饰成员函数的格式

在成员函数的后边加上const

    void display() const
	{
		swap(5);
		cout << "display()" << endl;
	}

 二.const修饰成员函数的原理

2.1.原理

const修饰成员函数时是修饰成员函数的this指针所指向的对象,也就是保证在调用这个const成员函数的对象时不会被改变。

注意:const是修饰this指针所指向的对象

2.2.编译器对const成员函数的处理(图解)

 

三.问题

3.1. const对象可以调用const修饰的成员函数,和非const修饰的成员函数吗?

 const对象可以调用const修饰的成员函数,不能调用非cosnt修饰的成员函数。

原因:

class A
{
public:
	void show()
	{
		cout << "show()" << endl;
	}

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


};

int main()
{
  	const A a;
	//a.display();
	a.show();
	system("pause");
	return 0;
}

 

我们知道c++在类的成员函数中还会隐式传入一个指向当前对象的this指针,所以在A类中,

实际的show函数应该是这样的void show(show * this)

实际的display函数应该是 void display(const display* this)

这时a对象的指针就会传递给show*this,但是a的地址被翻译为指针类型应该是const show* this,这里会出现类型不匹配的错误,在visual studio 中会出现类似于上面的错误。这里的display函数可以调用成功是因为他们参数的类型匹配。

 3.2.非const对象可以调用const修饰的成员函数,和非const修饰的成员函数吗?

非const对象可以调用const修饰的成员函数,和非const修饰的成员函数

 这是因为在c++中其实是有最小权限原则,非const对象是可以调用const成员函数的

3.3.const成员函数不能调用非const成员函数

3.4.非const成员函数能调用const成员函数 

猜你喜欢

转载自blog.csdn.net/alidada_blog/article/details/86477750