const 成员函数

Posted jingyigang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
[email protected]:~/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 }
[email protected]:~/share/mytest/cpp_test$ g++ -std=c++11 test.cpp 
[email protected]:~/share/mytest/cpp_test$ ./a.out 
with const
1
without const
without const
2

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

以上是关于const 成员函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥 const 函数可以使用静态成员对象的非常量函数?

NO.3 尽量使用const

寻找成员函数的常数

在构造函数中反序列化 const 成员对象

成员函数

为啥即使对于“写入时复制”的 const 成员函数也返回代理类?