我们知道,在成员函数中,如果没有修改成员变量,应该给成员函数加上 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 成员函数

const 成员函数的更多相关文章

  1. const成员函数

    尽管函数名和参数列表都相同,void foo( ) const成员函数是可以与void foo( )并存的,可以形成重载! 我们假设调用语句为obj.foo(),如果obj为non-const对象,则 ...

  2. c++ 学习之const专题之const成员函数

    一些成员函数改变对象,一些成员函数不改变对象. 例如: int Point::GetY() { return yVal; } 这个函数被调用时,不改变Point对象,而下面的函数改变Point对象: ...

  3. 关于 const 成员函数

    成员函数如果是const意味着什么? 有两个流行概念:物理常量性和逻辑常量性. C++对常量性的定义采用的是物理常量性概念,即const 成员函数不可以更改对象内任何non-static成员变量.例如 ...

  4. C++ Const成员函数

    一些成员函数改变对象,一些成员函数不改变对象. 例如:  int Point::GetY() { return yVal; }  这个函数被调用时,不改变Point对象,而下面的函数改变Point对象 ...

  5. C++类的const成员函数、默认的构造函数、复制形参调用函数(转)

    C++类的const成员函数 double Sales_item::avg_price() const { } const关键字表明这是一个const成员函数,它不可以修改Sales_item类的成员 ...

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

    const 是constant 的缩写,“恒定不变”的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:“Use const whe ...

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

    实验原因 说明如何使用const描述保护类数据不会意外修改. 编译环境 vc6sp6 + win7x64 工程下载 copyConstruction_constMemberFunction.zip   ...

  8. 12.C++-构造函数与析构函数调用顺序,const成员函数,const对象

    单个对象创建时,构造函数的调用顺序 1.首先判断该对象的类是否拥有父类,若有则先调用父类的构造函数 2.判断该对象的成员是否是其它类的成员,若是则调用成员变量的构造函数(调用顺序和声明顺序相同) 3. ...

  9. Item 16: 让const成员函数做到线程安全

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果我们在数学领域里工作,我们可能会发现用一个类来表示多项式会很方 ...

随机推荐

  1. Python——socketserver编程(客户端/服务器)

    一.socketserver是标准库中的高级模块,它的目标是简化很多多样板代码,是创建网络客户端和服务器所必须的代码.(事件驱动) 二.模块类 BaseServer :包含核心服务器功能和mix-in ...

  2. Java爬取12306余票

    一.前言 今年国庆和中秋一起放,虽然很欢快,但是没有票了!!! 于是自己倒腾了一个查询余票的小程序. 二.准备工作 1.先打开12306的页面 2.然后右键检查,点network 3.再点一下1230 ...

  3. ICPC中国南昌国家邀请赛和国际丝绸之路规划大赛预选赛 I J

    I. Max answer 链接:https://nanti.jisuanke.com/t/38228 思路: 枚举最小值,单调栈确定最小值的边界,用线段树+前缀和维护最小值的左右区间 实现代码: # ...

  4. GOOGLE RANKBRAIN 完整指南

    [译]GOOGLE RANKBRAIN 完整指南 ( 2018 最新版 ) 2018.01.29    来源  http://www.zhidaow.com/post/google-rankbrain ...

  5. 使用Spring Boot Actuator将指标导出到InfluxDB和Prometheus

    使用Spring Boot Actuator将指标导出到InfluxDB和Prometheus   Spring Boot Actuator是Spring Boot 2发布后修改最多的项目之一.它经过 ...

  6. 通过Visualizing Representations来理解Deep Learning、Neural network、以及输入样本自身的高维空间结构

    catalogue . 引言 . Neural Networks Transform Space - 神经网络内部的空间结构 . Understand the data itself by visua ...

  7. java 使用for循环打印杨辉三角形

    首先需要说明的问题: 什么是杨辉三角形? 如图所示:杨辉三角形由数字排列,基本的特点是两侧的数值均为1,其它位置的数值是基正上方的数值与其左上方的数值之和. 代码实现: package test; i ...

  8. Spring的事务机制

    ---恢复内容开始--- 内定的=>(只需要在xml 中添加一个bean) 在xml 中添加 <bean id="listener" class="com.t ...

  9. c#根据文件路径启动进程

    //根据文件路径启动进程 private static void StartProcessByFilePath(string path) { Process p = new System.Diagno ...

  10. [物理学与PDEs]第3章习题4 理想磁流体的能量守恒方程

    试证明: 对理想磁流体, 能量守恒方程 (4. 14) 可以写为如下形式: $$\beex \bea \cfrac{\p}{\p t}&\sex{\rho e+\cfrac{1}{2}\rho ...