我们知道,在成员函数中,如果没有修改成员变量,应该给成员函数加上 const 修饰符,例如
#include <iostream> using namespace std; class Foo
{
public:
Foo(int x) : _x(x) {}
int getX() const { return _x; }
private:
int _x;
}; int main()
{
Foo f();
cout << f.getX() << endl;
return ;
}
如果不加 const 修饰符,当使用 const 对象调用成员函数时,编译报错:
#include <iostream> using namespace std; class Foo
{
public:
Foo(int x) : _x(x) {}
int getX() { return _x; }
private:
int _x;
}; int main()
{
const Foo f();
cout << f.getX() << endl;
return ;
}
jingyg@jingyg:~/share/mytest/cpp_test$ g++ -std=c++ test.cpp
test.cpp: In function ?.nt main()?.
test.cpp::: error: passing ?.onst Foo?.as ?.his?.argument of ?.nt Foo::getX()?.discards qualifiers [-fpermissive]
由测试可知:
const 对象 | 非 const 对象 | |
const 成员函数 | 成功 | 成功 |
非 const 成员函数 | 失败 | 成功 |
const 对象有一个隐藏含义:保证成员变量不变。
const 变量还可以作为函数签名的一部分:
#include <iostream> using namespace std; class Foo
{
public:
Foo(int x) : _x(x) {}
int getX() const { cout << "with const" << endl; return _x; }
int& getX() { cout << "without const" << endl; return _x; }
private:
int _x;
}; int main()
{
const Foo f();
cout << f.getX() << endl; Foo f1();
int& x = f1.getX();
x = ;
cout << f1.getX() << endl;
return ;
}
jingyg@jingyg:~/share/mytest/cpp_test$ g++ -std=c++ test.cpp
jingyg@jingyg:~/share/mytest/cpp_test$ ./a.out
with const without const
without const
可以看到 const 对象调用 const 成员函数,非 const 对象调用非 const 成员函数