C++中const在函数名前面和函数后面的区别

class Test(){
public:
	Test(){}
	const int foo(int a);
	const int foo(int a) const;
};

一、概念

当const在函数名前面的时候修饰的是函数返回值,在函数名后面表示是常成员函数,该函数不能修改对象内的任何成员,只能发生读操作,不能发生写操作。


二、原理:

我们都知道在调用成员函数的时候编译器会将对象自身的地址作为隐藏参数传递给函数,在const成员函数中,既不能改变this所指向的对象,也不能改变this所保存的地址,this的类型是一个指向const类型对象的const指针。


三、Overload时const的作用:

继续使用上面的test类:

int main(int argc, _TCHAR* argv[])
{
    Test obj;
    const Test obj1;
    obj.foo(3);//使用非const函数
    obj1.foo(3);//使用const函数
}

在VS中如果对象不是const,则调用非const的函数。

<think>嗯,用户问的是为什么在的成员函数后面const。我得先回忆一下C++的相关知识。首先,const成员函数的作用是什么?记得const关键字放在成员函数末尾,表示这个函数不会修改的成员变量,也就是不会改变对象的状态。 那为什么要这样做呢?可能有两个原因。第一,是为了保证函数的常量正确性,让编译器能够检查是否有意外修改成员变量的操作。第二,当对象被声明为const时,只能调用其const成员函数,这样能确保对象的不可变性。 比如,假设有一个Student,里面有一个获取年龄的函数getAge()。如果这个函数被声明为const,那么无论是const还是非const的Student对象,都可以调用这个函数,而不会修改对象内部的状态。这增加了代码的灵活性安全性。 另外,可能用户在实际编程中遇到了问题,比如试图在const对象上调用非const成员函数,导致编译错误。这时候,将函数声明为const就可以解决问题。或者用户在设计的时候,想要明确哪些函数会修改对象状态,哪些不会,以提高代码的可读性可维护性。 不过,用户可能对const成员函数的具体使用场景好处不太清楚,需要进一步解释。比如,const成员函数可以重载非const版本,根据对象的常量性选择不同的实现。还有,在const成员函数中,所有成员变量默认都是const的,除非被mutable修饰。 可能需要举一个例子来说明。例如,一个Counter,increment()函数不应该被const修饰,因为它会改变计数器的值,而getCount()函数应该被const修饰,因为它只是返回当值,不会修改对象。 总结一下,加const主要是为了确保成员函数不修改对象状态,增强型安全,并允许在const对象上调用这些函数。这样设计可以让代码更健壮,减少错误,同时提高接口的清晰度。</think>在C++中,成员函数后的`const`关键字表示这是一个**常量成员函数**。这是C++型安全系统的重要机制,主要有以下作用: --- ### 1. **保证对象状态不被修改** ```cpp class Student { int age; public: // 常量成员函数 int getAge() const { return age; // ✔️ 允许读取 // age = 20; ❌ 编译错误!不能修改成员变量 } }; ``` - 编译器会阻止在`const`函数中修改成员变量 - 例外:用`mutable`修饰的变量仍可修改 --- ### 2. **允许const对象调用** ```cpp const Student s1; s1.getAge(); // ✔️ 只能调用const成员函数 s1.setAge(20); // ❌ 编译错误!非const成员函数 ``` --- ### 3. **函数重载依据** ```cpp class Data
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值