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 成员函数

时间: 2024-08-28 01:30:13

const 成员函数的相关文章

拷贝构造函数和const成员函数

实验原因 说明如何使用const描述保护类数据不会意外修改. 编译环境 vc6sp6 + win7x64 工程下载 copyConstruction_constMemberFunction.zip 使用非const成员函数,引起的拷贝构造函数报错 [cpp] view plain copy class CStudent { /// 常量定义 public: enum {NAME_SIZE_MAX = 64}; /// 构造, 拷贝构造, 析构函数 public: CStudent(); CStu

const成员函数

本文结论: const对象.指向const对象的指针或引用只能用于调用其const成员函数. 实例说明: class A { public: void mf1(){ cout<<"Function Call"<<endl; } void mf2() const{ cout<<"const Function Call"<<endl;} }; int main() { A a; a.mf1(); //ok a.mf2();

C++类const成员函数

c++类中可以用const关键字来声明不修改对象的成员函数,它使用时需要注意: 1.常量对象只能调用const成员函数 2.非常量对象可以调用const成员函数 以下列代码为例,来解释: 1 class Person{ 2 public: 3 void print(){ 4 cout<<"I am a common function!"<<endl; 5 } 6 void show()const{ 7 cout<<"I am a const

mutable用于修改const成员函数中的成员变量

http://no001.blog.51cto.com/1142339/389840/ mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词. 在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中. 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的.但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,

C++ Primer 学习笔记_24_类与数据抽象(10)--static 与单例模式、auto_ptr与单例模式、const成员函数、const 对象、mutable修饰符

C++ Primer 学习笔记_24_类与数据抽象(10)--static 与单例模式.auto_ptr与单例模式.const成员函数.const 对象.mutable修饰符 前言 [例]写出面向对象的五个基本原则? 解答:单一职责原则,开放封闭原则,依赖倒置原则,接口隔离原则和里氏替换原则 里氏替换原则:子类型必须能够替换他们的基类型. 设计模式分为三种类型:创建型模式.结构型模式和行为型模式 一.static 与单例模式 1.单例模式 单例模式的意图:保证一个类仅有一个实例,并提供一个访问它

(转)函数后面加const--C++ const成员函数

类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变. 在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const.所以 const 关键字对成员函数的行为作了更加明确的限定:有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员:没有 const 修饰的成员函数,对数据成员则是可读可写的.

c++中的const参数,const变量,const指针,const对象,以及const成员函数

const 是constant 的缩写,“恒定不变”的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:“Use const whenever you need”. 1.用const 修饰函数的参数 如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const 修饰,否则该参数将失去输出功能.const 只能修饰输入参数: 如果输入参数采用“指针传递”,那么加const 修饰可以防止意外地

C++中const对象和const成员函数

1?  成员函数可以声明成const函数(声明后加const) 2?  对于const对象,只能调用const成员函数 3?  Const函数和非const函数可以形成重载 4?  对于非const对象的函数调用优先选择非const成员函数 5?  对于类中的mutable数据成员,可以被const成员函数修改 // // main.cpp // Const // // Created by 06 on 15/1/24. // Copyright (c) 2015年 黄永锐. All right

关于 const 成员函数

成员函数如果是const意味着什么? 有两个流行概念:物理常量性和逻辑常量性. C++对常量性的定义采用的是物理常量性概念,即const 成员函数不可以更改对象内任何non-static成员变量.例如: 1 class CTextBlock 2 { 3 public: 4 ...... 5 std::size_t length() const; 6 7 private: 8 char* pText; 9 std::size_t textLength; 10 bool lengthIsValid;