一、声明为const的原因:

  • 把函数不会改变的形参定义成普通的引用会带给函数的调用者一种误导,即函数可以修改它的实参的值;
  • 限制函数所能接受的实参类型,如不能把const对象、字面值或者需要类型转换的对象传递给普通引用的实参。

举例:对于附录中的“find_char函数”,由于我们把其中的string类型的形参定义成普通的string&,故只能将find_char函数作用于string对象,对于下面这样的调用,将在编译时发生错误。

	find_char("Hello World", 'o');

二、声明为引用的原因:

避免拷贝,除了考虑效率问题,某些类型并不支持拷贝操作,此时只能使用引用形参

使用引用形参可返回额外信息

三、注意事项

const形参的顶层const将被忽略,故要注意不要如下重载函数:

void func(const int x)      // 顶层const
{
cout << x << endl;
} /*
void func(int x)
{
cout << x << endl;
}
*/

解释:因为顶层const将被忽略,我们传入两个func函数的实参可以完全一样,这样编译器将不知调用哪个函数。

附录:

【find_char程序】

#include <iostream>
#include <string> using namespace std; string::size_type find_char(string &s, char c)
{
int ret = s.size(); // 最大索引值 + 1
return ret = s.find(c);
} int main()
{
string ss("hello");
int first_pos = find_char(ss, 'a');
if (first_pos == -1) {
cout << "Not find!\n";
}
else {
cout << "first find at " << first_pos << endl;
}
return 0;
}

推荐形参使用常量引用:void func(const T &);的更多相关文章

  1. 常量引用 const T&

    1.引用本身不是对象,只是引用对象的别名,没有内存空间产生 2.引用必须严格类型匹配 3.而常量引用 const T& 可以引用字面值常量及表达式 其实也就是右值,且常量引用的不同与T类型对象 ...

  2. 【C/C++】引用&的含义/语法/作为函数参数/函数返回值/本质/常量引用

    含义 引用不产生副本,只是给原变量起了别名. 对引用变量的操作就是对原变量的操作. 基本语法 数据类型 &别名 = 原名 e.g. int a = 10; int &b = a; // ...

  3. 常量函数、常量引用参数、常量引用返回值[C++]

    1. 关于常量引用正像在C语言中使用指针一样,C++中通常使用引用 有一个函数... foo()并且这个函数返回一个引用...... & foo()...., 一个指向位图(Bitmap)的引 ...

  4. C++ 非常量引用无效

    /* 非常量引用无效 */ #include <iostream> using namespace std; /* C++标准的规定:非常量的引用不能指向临时对象: 为了防止给常量或临时变 ...

  5. 转 C++的常量引用

    C++的常量引用 如果是对一个常量进行引用,则编译器首先建立一个临时变量,然后将该常量的值置入临时变量中,对该引用的操作就是对该临时变量的操作.对常量的引用可以用其它任何引用来初始化:但不能改变. 关 ...

  6. C++ —— 非常量引用不能指向临时对象

    目录 举例 分析 解决 1.举例 非常量引用 指向 临时对象 —— 即:将 临时对象 传递给 非常量引用类型. 如以下情况就会出现: 实现实数Rational类,实数可以使用+号相加,运算的结果要可以 ...

  7. 两种常量类型-readonly和const

    C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景. 工作原理 readonly 为运行时常量(动态常量), ...

  8. const引用与非const引用

    void print1(int a) { cout<<a<<endl; } void print2(const int& a) { cout<<a<& ...

  9. void fun() const{}; const void fun(){}; 和void const fun(){}; 的区别?

    void fun() const{}; const void fun(){}; 和void const fun(){}; 的区别? const void fun(){};和void const fun ...

随机推荐

  1. Ansible实现主备模式的高可用(Keepalived)

    前言 Ansible是一款极其简单的IT自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序 ...

  2. Vue清除所有JS定时器

    Vue清除所有JS定时器 在webpack + vue 的项目中如何在页面跳转的时候清除所有的定时器 JS定时器会有一个返回值(数字),通过这个返回值我们可以找到这个定时器 在vue项目中可以使用路由 ...

  3. ASP.NET MVC4.0 后台获取不大前台传来的file

    <td>选择图片</td> <td> <input type="file" id="uploadImg" name=& ...

  4. Cab 安装不成功问题

    使用 iexpress.exe 成功打包了cab文件. 可下面问题来了,用静态的html调用,提示安装. 确认安装之后,却提示找不到相应的*.ocx,导致无法安装文件到系统 分析具体原因:*.ocx ...

  5. python学习笔记:第7天 深浅拷贝

    目录 1. 基础数据类型补充 2. set集合 3. 深浅拷贝 1. 基础数据类型补充 (1)join方法 join方法是把一个列表中的数据进行拼接,拼接成字符串(与split方法相反,split方法 ...

  6. Python学习手册之类和继承

    在上一篇文章中,我们介绍了 Python 的函数式编程,现在我们介绍 Python 的类和继承. 查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/100106 ...

  7. 《Mysql高级知识》系列分享专栏

    <Mysql高级知识>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201756.html 文章 MySQL数据库InnoDB引擎 ...

  8. VMWare共享文件

    windows与虚拟机的linux共享windows下的一个文件夹 1.重新安装VMware Tools,在VMware面板上选择“虚拟机-重新安装VMware tools…” 2.使用命令 Ctrl ...

  9. Go 入门 - Go中的复杂类型

    主要内容来自中文版的官方教程Go语言之旅 目的为总结要点 指针 Go 拥有指针.指针保存了值的内存地址. 类型 *T 是指向 T 类型值的指针.其零值为 nil. var p *int & 操 ...

  10. ACM数论-快速幂

    ACM数论——快速幂 快速幂定义: 顾名思义,快速幂就是快速算底数的n次幂.其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高. 原理: 以下以求a的b次方来介绍: 把b转换成 ...