§通常,如果一个对象通过引用方式传到函数f中,而函数f又不会通过修改对象的数据成员的值改变该对象的状态,那么,我们最好将f的参数标记为const,这样可以预防对参数的误写,同时有些编译器还可对这种情况进行一些优化。

  如下:将函数setName的string类型参数n标记为const,表明setName不会改变n,只是将n赋值给数据成员name。

 class  C
{
public:
void setName(const string &n)
{
name = n;
}
//...other public members
private:
string name;
};

  §如果一个成员函数不需要直接或间接(通过调用其他的成员函数考改变其队形状态)地改变该函数所属对象的任何数据成员,那么最好将这个成员函数标记为const。

  如下,由于get成员函数不需要改变类C 的任何数据成员,因此将get成员函数标记为const。

 class C  {
public:
void set(int n) { num = n;}
int get() const {return num;}
private:
int num;
};

  说明:

    <1>由于get成员函数不更改任何数据成员,因此这种类型的函数被称为只读函数。

    <2>将成员函数标记为const可以预防对该函数所属对象的数据成员的误写,同时有些编译器还可以对这种情况进行一些优化。

    <3>一个const成员函数仅能调用其他const成员函数;因为const成员函数不允许直接或间接地改变对象的状态,而调用非const成员函数可能会间接地改变对象的状态。

    例如:

 class  C {
public:
void m1(int x) const {
m2(x); //***error
} void m2(int x){dm = x;}
private:
int dm;
};

  §const关键字三种不同的用法实例

  ——在成员函数set中,因为set不改变string类型参数n,n被标记为const。

  ——成员函数get返回数据成员name的一个const型引用,此处的const表明谁也不能通过这个引用来修改数据成员name的值。

  ——成员函数get本身被标记为const,因为get不会改变类C唯一的数据成员name的值。

  例如:

 class  C{
public:
void set(const string &n) {name = n;}
const string &get() const {return name;}
private:
string name;
};

  因此有:

    (1)某函数如果采用const返回,则其返回值只能付给一个const类型的局部变量。

    (2)如果该const返回值是一个类的指针或者引用的话,则不能用该指针或引用调用该类的non-const成员函数,因为这些函数可能会改变该类的数据成员的值。

综合以上我们来看这样一个例子:

 #include<iostream>
using namespace std;
class sz
{
public:
int &f1() //可修改mazT,可修改返回值
{mszT = ; return mszT;} int f2() cosst //不能修改mszT,可修改返回值
{return mszT;} const int &f3() //可修改mszT, 不可修改返回值
{mszT = ; return mszT;} const int& f4 const //不可修改mszT, 不可修改返回值
{return mszT;} void print()
{cout<<mszT<<endl;} private:
int mszT;
}; int main()
{
sz f;
int &s1 = f.f1(); //OK
cout<<s1<<endl; //输出:5
s1 = ; //可修改返回值
f.print(); //输出:20 int &s3 = f.f3(); //Error, 返回const值,但s3不是const
const int & s3 = f.f3() //OK
cout<<s3<<endl; //输出:5
s3 = ; //Error,修改返回值 return ;
}

深入浅出const的更多相关文章

  1. openssl 1.1.1 reference

    openssl 1.1.1 include/openssl aes.h: # define HEADER_AES_H aes.h: # define AES_ENCRYPT 1 aes.h: # de ...

  2. 深入浅出ES6(十四):let和const

    作者 Jason Orendorff  github主页  https://github.com/jorendorff 回溯到1995年,当Brendan Eich在设计第一版JavaScript时, ...

  3. ES6深入浅出-1 新版变量声明:let 和 const-2.视频 let和const

    以前的var方式声明不好用 a=1回声明一个全局变量, 输出了1 说明a=1确实声明了一个全局变量. 但是你把放在其他的地方,就不是声明全局变量了. 如果外面有个全局变量a 那么函数里面就是给a赋值 ...

  4. 深入浅出Alljoyn——实例分析之远程调用(Method)篇

    深入浅出就是很深入的学习了很久,还是只学了毛皮,呵呵! 服务端完整代码: #include <qcc/platform.h> #include <assert.h> #incl ...

  5. VC++动态链接库(DLL)编程深入浅出(zz)

    VC++动态链接库(DLL)编程深入浅出(zz) 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用 ...

  6. [深入浅出Windows 10]模拟实现微信的彩蛋动画

    9.7 模拟实现微信的彩蛋动画 大家在玩微信的时候有没有发现节日的时候发一些节日问候语句如“情人节快乐”,这时候会出现很多爱心形状从屏幕上面飘落下来,我们这小节就是要模拟实现这样的一种动画效果.可能微 ...

  7. 深入浅出OOP(五): C#访问修饰符(Public/Private/Protected/Internal/Sealed/Constants)

    访问修饰符(或者叫访问控制符)是面向对象语言的特性之一,用于对类.类成员函数.类成员变量进行访问控制.同时,访问控制符也是语法保留关键字,用于封装组件. Public, Private, Protec ...

  8. 深入浅出ES6(六):解构 Destructuring

    作者 Jason Orendorff  github主页  https://github.com/jorendorff 什么是解构赋值? 解构赋值允许你使用类似数组或对象字面量的语法将数组和对象的属性 ...

  9. [深入浅出Cocoa]详解键值观察(KVO)及其实现机理

    一,前言 Objective-C 中的键(key)-值(value)观察(KVO)并不是什么新鲜事物,它来源于设计模式中的观察者模式,其基本思想就是: 一个目标对象管理所有依赖于它的观察者对象,并在它 ...

随机推荐

  1. Do less things

    就这样,选择做更少的事情,我觉得挺好,至少能睡得很踏实,吃饭很香,也不会觉得难受! 就这样,节制自己的欲望,但是却能很平静,安安静静走自己的路,我觉得生活有希望,也有快乐! 早上,已经可以八点十分起床 ...

  2. NSSet、NSMutableSet

    NSSet和NSArray功能性质一样,用于存储对象,属于集合:只能添加cocoa对象,基本数据类型需要装箱. NSSet . NSMutableSet是无序的集合,在内存中存储方式是不连续的,而NS ...

  3. No.012 Integer to Roman

    12. Integer to Roman Total Accepted: 71315 Total Submissions: 176625 Difficulty: Medium Given an int ...

  4. 开源项目:libbpg

    1 ubuntu下编译libbpg(编译机器64bit) 安装cmake,libpng,yasm,gcc,g++ cmake版本最低为2.8.8,安装完毕后使用cmake --version查看是否安 ...

  5. Oracle笔记 十二、PL/SQL 面向对象oop编程

    ------------------------抽象数据类型----------- --创建地址类型,一定要加as object,还可以在类型中加过程或方法 create or replace typ ...

  6. Windows phone 8 学习笔记(5) 图块与通知(转)

    基于metro风格的Windows phone 8 应用提到了图块的概念,它就是指启动菜单中的快速启动图标.一般一个应用必须有一个默认图块,还可以有若干个次要图块.另外,通知与图块的关系比较密切,我们 ...

  7. SQL 数据库 复制 与订阅 实现数据同步

    摘自: http://www.jb51.net/article/18039.htm

  8. SVN创建资源与分支详解

    创建分支的意义: 简单说,分支就是用于区分开发版本与当前发布版本的. 1. 主干负责新功能的开发 2..分支负责修正当前发布版本的bug(对于可以放入下个发布版本的改进性bug可以直接在主干上开发) ...

  9. 2.2安装JDK

    在Ubuntu下安装JDK的步骤: (1)首先需要自己安装的Ubuntu系统是多少位的,可以使用命令[getconf LONG_BIT]获取这个信息: (2)在JDK官网下载相应(选取和Linux系统 ...

  10. final 的用法总结

    1.修饰成员变量 修饰普通变量 表明这个变量是一个常量,不可以修改这个变量的值,一般这样的变量的变量名都要大写 修饰引用变量 表明这个引用不能够指向别的对象了,只能够指向指定的这个对象 2.修饰方法 ...