C++中类成员函数参数前const,返回值前加const 以及 函数声明后面加const作用及区别
在看公司C++的source code时,我们发现在一个类class里面的成员函数,有3个地方都有可能加const关键字
1. 第1个地方是函数内的形参前面加const
int fun(const int a) => 这个是表示参数a在函数fun内部不能被修改, 如果在函数内的语句试图修改a,编译器就会报错
2. 第2个地方是函数的返回值前面加const
const int* fun() => 函数返回的指针或者引用,加const规定返回值不能修改
eg:
int& GetNum(); => 返回的是一个左值,它引用的内容可以修改 , 比如可以这样写 GetNum() = 6; GetNum()在等号的左边,所以说返回一个左值. 这点和C#很不一样,C#中肯定不能这样写
const int& GetNumConst(); => 返回的是一个右值, 它引用的内容不可以被修改. 你不能写 GetNumConst() = 8, 否则编译器会报错
#include <iostream> using namespace std; class NumberHandle { public: int& GetNum() { return m_num; } const int& GetNumConst() { return m_num; } void ShowNum() { cout << "Number: " << m_num << endl; } private: int m_num = 0; }; int main() { NumberHandle stu; stu.ShowNum(); stu.GetNum() = 5; // 会修改成员变量的值 stu.ShowNum(); stu.GetNumConst() = 6; // 编译器会报错 stu.ShowNum(); return 0; }
所以,很多时候,在C++代码编写中, 为了安全起见,在函数的返回值加上 const,使得函数体不能作为左值。
3. 第3个地方是函数后面加上const => const 修饰函数体时,放到函数体的行尾处,表明在该函数体内,不能修改对象的数据成员,且不能调用非 const 成员函数。
int fun() const => 这个表明这是个只读函数,在这个只读函数内部,是不能够去改变这个函数所在的类中的成员变量的, 也不能够去调用这个函数所在的类中的其他非const成员函数.
#include <iostream> using namespace std; class NumberHandle { public: void SetNum(int num) { m_num = num; } void SetNumConst(int num) const { m_num = num; } void ShowNum() { cout << "Number: " << m_num << endl; } private: int m_num = 0; }; int main() { NumberHandle stu; stu.ShowNum(); stu.SetNum(6); // 正确 stu.ShowNum(); stu.SetNumConst(8); // 编译器会报错 stu.ShowNum(); return 0; }
在C++中,const强大的地方就是在于这里,它不像C#中那样,只是用来定义常量。而是在C++中可以用来修饰函数参数,函数返回值,函数体
被const修饰的东西都会受到强制保护,可以防止意外改动,提供了程序的健壮性. 所以通常都建议: use const whenever you need.