const是衡量一个程序员是否老道的一个标准,除了修饰变量之外,还可以修饰函数,主要有以下几种形式

const int& fun(int& a); //修饰返回值
int& fun(const int& a); //修饰形参
int& fun(int& a) const{} //const成员函数

const返回值

这种多是修饰返回值是引用类型的情况下,为了避免返回值被修改的情况。

解释下:返回值是引用的函数, 可以肯定的是这个引用必然不是临时对象的引用, 因此一定是成员变量或者是函数参数, 所以在返回的时候为了避免其成为左值被修改,就需要加上const关键字来修饰。

举个例子:

#include<iostream>using namespace std;class A
{private:int data;
public:A(int num):data(num){}~A(){};int& get_data(){return data;}
};int main()
{A a(1);a.get_data()=3;cout<<a.get_data()<<endl; //data=3return 0;
}

那么这个时候为了避免成员函数被修改就需要加上const关键字,这个时候如果试图改变返回值是不允许的:

error: cannot assign to return value because function 'get_data' returns a const value

需要指出的是,如果函数的返回类型是内置类型,比如 int char 等,修改返回值本身就是不合法的!所以 const 返回值是处理返回类型为用户定义类型的情况。

const 修饰实参

多数情况下,我们都会选择 pass by reference,这样可以节省内存,并且可以起到改变实参的目的。不过有的时候我们并不希望改变实参的值,就要加上const关键字。

这个不仔细说了,很容易理解。不过在构造接口之前一定要思考函数是否会修改参数,如果不会修改的话一定要加上const,这个是代码写的是否大气的一个标准(侯捷大师原话。。)。

const成员函数

这种情况多数情形下很容易被忽视,其实这个是非常重要的一个内容。

设想这样一种场景:

const String str("hello world");
str.print();

假设在string类中有一个成员函数叫做print, 如果这个函数在定义的时候没有加上const 关键字,上述的代码是无法通过编译的,下面举个具体的例子:

#include<iostream>using namespace std;class A
{private:int data;
public:A(int num):data(num){}~A(){};int& get_data(){return data;}
};int main()
{const A a(1);a.get_data();return 0;
}

毫不意外的出错了:

error: 'this' argument to member function 'get_data' has type 'const A', but function is not marked const。

我们敏锐的发现了一个“this"指针,这个从何说起?

其实任何成员函数的参数都是含有this 指针的,好比py中的 self ,只不过c++中规定全部不写这个参数, 其实这个参数就是对象本身, 即谁调用成员函数, 这个 this 就是谁!

我们的例子中 a 是一个const 对象, 它调用了 get_data 方法,所以函数签名应该是:

get_data(a){}

而 a是一个 const 对象, 我们默认的 this 指针并不是 const 类型,所以参数类型不匹配, 编译无法通过!

这下我们终于清楚了, const 修饰成员函数, 根本上是修饰了 this 指针。

下面摘取侯捷PPT中的一张图片, 介绍了string源码中的一些片段:

这两个成员函数都重载了[]符号,而前者是const ,不必担心修改参数, 而后者由于引用计数的问题, 多个变量指向一个内存, 一旦修改就必须copy后修改,cow。

需要指出的是, 这俩函数确实是不同的函数, 加了这个const 之后函数签名是不一样的。

有如下的规则:

补充一点,如果成员函数同时具有 const 和 non-const 两个版本的话, const 对象只能调用const成员函数, non-const 对象只能调用 non-const 成员函数。

private修饰的变量如何调用_梳理c++ const 修饰函数相关推荐

  1. python 私有变量怎么调用_我的Python学习笔记(三):私有变量

    一.私有变量的定义 在Python中,有以下几种方式来定义变量: xx:公有变量 _xx:单前置下划线,私有化属性或方法,类对象和子类可以访问,from somemodule import *禁止导入 ...

  2. 梳理c++ const 修饰函数

    const是衡量一个程序员是否老道的一个标准,除了修饰变量之外,还可以修饰函数,主要有以下几种形式 const int& fun(int& a); //修饰返回值 int& f ...

  3. php 动态彩码辨色 接口的调用_好用的云函数!后端低代码接口开发,零基础编写API接口...

    前言 在开发项目过程中,经常需要用到API接口,实现对数据库的CURD等操作. 不管你是专业的PHP开发工程师,还是客户端开发工程师,或者是不懂编程但懂得数据库SQL查询,又或者是完全不太懂技术的人, ...

  4. 时间序列交叉验证法_sklearn调用_及prophet交叉验证函数实现

    文章目录 1. 时间序列特定的交叉验证方法简介 2. sklearn时间序列交叉验证包TimeSeriesSplit 递增窗口交叉验证Example 固定窗口交叉验证Example sklearn T ...

  5. const int *p说明不能修改_随时随地学习C语言之6—const修饰的变量真的不能修改吗?...

    学习C语言的时候我们都知道,const修饰词可以防止程序中被const修饰的变量遭到修改,但事实上真的是不能修改吗?我们先来看一段代码: 注意第5行的变量p被const修饰,在第8行对p变量进行了修改 ...

  6. const 修饰函数参数,返回值,函数体,保护数据

    一.const 介绍 1.const 定义 const 修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的. 2.const 目的 const 推出的初始目的,正是为了取代预编译指令,消除 ...

  7. const 修饰函数参数,返回值,函数体

    看到const 关键字,C++程序员首先想到的可能是const 常量.这可不是良好的条件反射.如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮.const 更大的魅力是它可以修饰函数的 ...

  8. 我对const修饰符应用的理解

    先说说我对编译器对const处理的理解:const修饰符定义一个常量,const变量在整个程序中只有一个拷贝.编译器会跟踪所有用到这个常量的地方,一旦发现任何一个操作可能会改变这个它是常量这个属性,那 ...

  9. const修饰指针和引用的用法【转贴】

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

最新文章

  1. 【RocketMQ工作原理】消息的消费
  2. 网络编程 -- gethostbyname() 函数解析
  3. 未能找到路径“..”的一部分
  4. Linux下find命令的用法
  5. 【机器学习】GitHub 标星17.4K:机器学习 100 天!
  6. zblog php版调用代码,zblog PHP分类列表调用方法
  7. Mac升级自带ruby方法
  8. linux shell数组参数传递参数,在bash中将数组作为参数传递
  9. Mysql支持中文全文检索的插件mysqlcft-应用中的问题
  10. php程序员需要精通js的程度_PHP程序员基本要求和必备技能
  11. python制作一个桌面小工具
  12. html轮播图背景色,轮播图的做法(更换背景颜色)
  13. Android 仿微信小程序开屏页加载loading
  14. [SCOI2009]windy数
  15. 中关村e谷为产业搭台:中关村论坛(空天专场)黑科技亮相现场
  16. 5 kyu some egyptian fractions
  17. 【Linux】在当前目录下创建文件夹
  18. 二进制取位操作。(愚蠢的人:书到用时方恨少)
  19. 【计算机网络基础】-- OSI的七层模型和TCP/IP的五层模型
  20. AOP系列:切面编程框架 : AspectJ

热门文章

  1. 惊闻谢文离职雅虎中国
  2. 云数据保护需要增强应对复杂环境的能力
  3. 定时器里面的作用域问题
  4. leetcode笔记(一)309. Best Time to Buy and Sell Stock with Cooldown
  5. java导出csv文件使用Excel打开乱码问题
  6. EOS绑定以太坊地址
  7. python学习第十节(yield表达式的应用+内置函数)
  8. C#-WinForm-无边框窗体的移动和阴影-API
  9. springmvc+log4j操作日志记录,详细配置
  10. HDU4000Fruit Ninja【树状数组+组合数】