§通常,如果一个对象通过引用方式传到函数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. 用Asroute解决复杂状态切换问题

    项目地址:https://github.com/boycy815/asroute 首先明确几个概念 状态: 很多情况下,一个复杂的UI组件可能会有很多种不同的“状态”,不同的“状态”下组件本身对外界会 ...

  2. Centos6.5 minicom安装与配置

    Linux下的Minicom的功能与下的超级终端功能相似,适于在通过超级终端对设备的管理以及对嵌入操作系统的升级 1.minicom的安装 查看是否安装:   rpm -qa | grep minic ...

  3. 把数组转换成sql中能使用的字符串

    1.数组对象转换成字符串,拼接成符合sql语句的语法 2.代码如下例子 public static void testString(){        String[] str=new String[ ...

  4. ASP.NET 数据库页面访问简单工具

    在工作中,有很多项目已上线后,很多项目的数据库服务器都不会对外开放的,外网想直接访问客户数据库服务器时,可能会出现困难. 这时就需要一个可以查询,更新数据库操作的页面了: 本来用sql语句直接操作数据 ...

  5. SQL Server 数据库设计

    一.数据库设计的必要性 在实际的软件项目中,如果系统中需要存储的数据量比较大,需要设计的表比较多,表与表之间的关系比较复杂,那我们就需要进行规范的数据库设置.如果不经过数据库的设计,我们构建的数据库不 ...

  6. WP8_检测列表是否滑动

    One of the UI features of lists on Windows Phone 7 is that the "scroll bars" don't really ...

  7. 关于原生js的一些研究

    搬砖,原文地址:http://segmentfault.com/a/1190000002911253 callee和caller function inner(){ console.log(argum ...

  8. MariaDB之基于Percona Xtrabackup备份大数据库[完整备份与增量备份]

    MariaDB之基于Percona Xtrabackup备份大数据库[完整备份与增量备份] 1.Xtrabackup的安装 percona-xtrabackup-2.2.3-4982.el6.x86_ ...

  9. 使用css实现全兼容tooltip提示框

    在上一篇文章中,使用css实现了一个全兼容的三角形图标,这个三角型图标可以使用于多种场景,比如下拉图标.多级菜单等,这篇文章我们使用这个图标通过纯css来实现一个我们常见的tooltip提示框. 最终 ...

  10. LINUX下网站压力测试工具webbench

    wget http://blog.s135.com/soft/linux/webbench/webbench-1.5.tar.gz tar zxvf webbench-1.5.tar.gz cd we ...