【C++】const 成员函数

const(常)成员函数是一种获取对象状态的成员函数,并且不能改变对象的状态(也就是不能修改对象的成员的值)。声明和定义如下:

class A
{
public:
	void func() const;
};

A::void func() const
{
	// 常成员函数
}

问题一:如果有两个同名函数,只是其中一个是常成员函数,这样的写法有错吗?

class A
{
public:
	void func();
	void func() const;
};

编译器并没有报错!

问题二:形参列表应该是一样的,调用的时候,计算机怎么知道是调的哪一个函数?

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

int main()
{
	A a1;
	const A a2;

	a1.func();
	a2.func();
}

输出:
func()
func() const

说明const对象才能调用const成员函数

要弄清这个问题,首先要明白不同的对象是如何共用同一个成员函数的。我们暂且不谈const成员函数,以普通成员函数为例:

int main()
{
	A a1;
	A a2;

	a1.func();
	a2.func();
}

当a1和a2分别调用成员函数时,func()是如何辨别这两个对象的呢?

实际上,成员函数有一个隐藏参数——this指针!也就是说,编译器对成员函数的处理实际上是这样的:

class A
{
public:
	void func(A *this);
};

A::void func(A *this)
{
	// this指针
}

这样,便能分辨是哪个对象调用了成员函数。我们再回头看这个问题,就很清楚了,实际上编译器处理如下:

class A
{
public:
	void func(A *this);
	void func(const A *this);	// const成员函数
};

很明显,这两个函数互为重载!重载函数当然同名,而且const对象a2传入的this指针是const指针,才能调用const成员函数。

发布了15 篇原创文章 · 获赞 1 · 访问量 1663

猜你喜欢

转载自blog.csdn.net/weixin_43465579/article/details/99705234