首页 > 代码库 > const 成员函数

const 成员函数

我们知道,在成员函数中,如果没有修改成员变量,应该给成员函数加上 const 修饰符,例如

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 class Foo
 6 {
 7 public:
 8     Foo(int x) : _x(x) {}
 9     int getX() const { return _x; }
10 private:
11     int _x;
12 };
13 
14 int main()
15 {
16     Foo f(1);
17     cout << f.getX() << endl;
18     return 0;
19 }

 

如果不加 const 修饰符,当使用 const 对象调用成员函数时,编译报错:

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 class Foo
 6 {
 7 public:
 8     Foo(int x) : _x(x) {}
 9     int getX() { return _x; }
10 private:
11     int _x;
12 };
13 
14 int main()
15 {
16     const Foo f(1);
17     cout << f.getX() << endl;
18     return 0;
19 }
jingyg@jingyg:~/share/mytest/cpp_test$ g++ -std=c++11 test.cpp 
test.cpp: In function ?.nt main()?.
test.cpp:17:17: error: passing ?.onst Foo?.as ?.his?.argument of ?.nt Foo::getX()?.discards qualifiers [-fpermissive]

由测试可知:

  const 对象 非 const 对象
const 成员函数 成功 成功
非 const 成员函数 失败 成功

const 对象有一个隐藏含义:保证成员变量不变。

 

const 变量还可以作为函数签名的一部分:

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 class Foo
 6 {
 7 public:
 8     Foo(int x) : _x(x) {}
 9     int getX() const { cout << "with const" << endl; return _x; }
10     int& getX() { cout << "without const" << endl; return _x; }
11 private:
12     int _x;
13 };
14 
15 int main()
16 {
17     const Foo f(1);
18     cout << f.getX() << endl;
19 
20     Foo f1(3);
21     int& x = f1.getX();
22     x = 2;
23     cout << f1.getX() << endl;
24     return 0;
25 }
jingyg@jingyg:~/share/mytest/cpp_test$ g++ -std=c++11 test.cpp 
jingyg@jingyg:~/share/mytest/cpp_test$ ./a.out 
with const
1
without const
without const
2

可以看到 const 对象调用 const 成员函数,非 const 对象调用非 const 成员函数

const 成员函数