本文主要整理自stackoverflow上的一个对问题Meaning of “const” last in a C++ method declaration?的回答。

测试1

  对于下边的程序,关键字const的作用在哪里?

 #include <iostream>

 class MyClass
{
private:
int counter;
public:
void Foo()
{
std::cout << "Foo" << std::endl;
} void Foo() const
{
std::cout << "Foo const" << std::endl;
} }; int main()
{
MyClass cc;
const MyClass& ccc = cc;
cc.Foo();
ccc.Foo(); return ;
}

  程序输出:

Foo
Foo const

  当我们将函数“void Foo()”注释掉,测试程序将会输出:

Foo const
Foo const

  当我们将“void Foo() const”注释掉,测试程序不通过。因为“void Foo()”并不是返回一个const的MyClass,所以“const MyClass& ccc = cc”这一句是通不过编译的。

  

  综上,对函数“void Foo() const”而言,它不能够修改类MyClass的所有成员变量的值(即此时类MyClass是const的),否则将编译不通过。

  所以下边的程序也是通不过编译的:

     void Foo()
{
counter++; //this works
std::cout << "Foo" << std::endl;
} void Foo() const
{
counter++; //this will not compile
std::cout << "Foo const" << std::endl;
}

测试2

  对于测试1的程序,我们只要将成员变量counter设置为mutable就可以在“void Foo() const”函数中修改counter的值了,具体测试程序如下:

 #include <iostream>

 class MyClass
{
private:
mutable int counter;
public: MyClass() : counter() {} void Foo()
{
counter++;
std::cout << "Foo" << std::endl;
} void Foo() const
{
counter++;
std::cout << "Foo const" << std::endl;
} int GetInvocations() const
{
return counter;
}
}; int main(void)
{
MyClass cc;
const MyClass& ccc = cc;
cc.Foo();
ccc.Foo();
std::cout << "The MyClass instance has been invoked " << ccc.GetInvocations() << " times" << endl; return ;
}

类成员函数后边加const的更多相关文章

  1. c++类成员函数后边加const是为什么?

    时间是让人猝不及防的东西,晴是有风阴时有雨,争不过朝夕,又念着往昔,偷走了青丝却留住一个你 #include <iostream> #include <string> usin ...

  2. 在类成员函数后面加const

    在看开源代码时,经常会看到在类的成员函数后面加const,之前了没有太关注过,近来闲来无事,就想起这件事,网上查了一下,大概明白了是怎么回事,这里引用CSDN愽文里的段话:“编译器会自动给每一个函数加 ...

  3. 成员函数后面加const,没有const,以及使用的区别

    函数后面加const 编译器会自动给每一个函数加一个this指针.在一个类的函数后面加上const后,就表明这个函数是不能改变类的成员变量的(加了mutable修饰的除外,后面有讲).实际上,也就是对 ...

  4. 重载运算符:类成员函数or友元函数

    类成员函数: bool operator ==(const point &a)const { return x==a.x; } 友元函数: friend bool operator ==(co ...

  5. CPP-基础:非静态成员函数后面加const,以及mutable修饰成员变量

    非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误),表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,任意修改它所在的类的成员的操作都是不允许的(因为 ...

  6. 【转】C++的const类成员函数

    我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误.例如, const char blank=' '; blank='\n'; //错误 面向对象程序设计中 ...

  7. [UE4]C++的const类成员函数

    我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误.例如: const char blank = ‘’; blank = ‘\n’; // 错误 要声明一个 ...

  8. C++的const类成员函数

    转自:http://blog.csdn.net/lihao21/article/details/8634876 我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编 ...

  9. C++ 函数后加const

    1.非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误)2.表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,    任意修改它所在的类的成员的操作都是 ...

随机推荐

  1. Web自动化框架LazyUI使用手册(3)--单个xpath抓取插件详解(selenium元素抓取,有此插件,便再无所求!)

    概述 前面的一篇博文粗略介绍了基于lazyUI的第一个demo,本文将详细描述此工具的设计和使用. 元素获取插件:LazyUI Elements Extractor,作为Chrome插件,用于抓取页面 ...

  2. 如何正确使用const、static、extern

    转自:http://www.jianshu.com/p/2fd58ed2cf55 前言 本篇文章主要介绍在开发中怎么使用const.static.extern关键字. 一.const 与宏的区别: c ...

  3. Request和Response的格式

    Request和Response的格式 Request格式: HTTP请求行  (请求)头  空行  可选的消息体 注:请求行和标题必须以<CR><LF> 作为结尾(也就是,回 ...

  4. 有奖试读—Windows PowerShell实战指南(第2版)

    为什么要学PowerShell? Windows用户都已习惯于使用图形化界面去完成工作,因为GUI总能轻易地实现很多功能,并且不需要记住很多命令.使得短时间学会一种工具成为可能. 但是不幸的是,GUI ...

  5. 【Unity技巧】四元数(Quaternion)和旋转

    四元数介绍 旋转,应该是三种坐标变换--缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法--矩阵旋转和欧拉旋转. ...

  6. Android四大组件之一Service介绍-android学习之旅(十二)

    基本概念: service是android四大组件之一,运行在后台执行耗时操作,并不提供用户界面.其他组件如acticity可以通过startService启动该组件,也可以通过bindService ...

  7. Linux之mailx的使用

    mailx是UNIX系统上用来处理邮件的工具,使用它可以发送,读取邮件.下面看看如何使用它来发送邮件. 发送格式 mailx -s subject user@xxx.com < message_ ...

  8. iOS中 流媒体播放和下载 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博 iOS中关于流媒体的简介:介于下载本地播放与实时流媒体之间的一种播放形式,下载本地播放必须全部将文件下载完成后才能播 ...

  9. Android初级教程理论知识(第四章内容提供器)

    之前第三章理论知识写到过数据库.数据库是在程序内部自己访问自己.而内容提供器是访问别的程序数据的,即跨程序共享数据.对访问的数据也无非就是CRUD. 内容提供者 应用的数据库是不允许其他应用访问的 内 ...

  10. EBS预置文件作用收集整理

    在EBS之中,有很多的配置选项(profile),系统管理员只需要对它们做一些简单的配置,就可以达到控制流程开关.安全访问.个人喜好等等方面的要求. 以HR: Security Profile为例,该 ...