一、声明为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. ABAP术语-SAP GUI for HTML

    SAP GUI for HTML 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/14/1104996.html An ITS impleme ...

  2. 执行SQL查询导致磁盘耗尽故障演示

            a fellow in IMG wechat group 2 met an error about running out of disk space when using MySQL ...

  3. 学习 Linux_kernel_exploits 小记

    Linux_kernel_exploits+ 功能:自动生成UAF类型漏洞exp文件的工具,目前缺少文档介绍,可以参考test文件下的使用实例,但是源码中缺少dataflowanalyzer模块+ 相 ...

  4. 09JavaScript函数

    函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. 实例1: <!DOCTYPE html> <html> <head> <meta charset ...

  5. 解决echarts 鼠标悬浮提示 文本提示问题。

    参考文章:https://www.jianshu.com/p/aa585c304660 官方文章样式详解:http://echarts.baidu.com/option.html#tooltip.fo ...

  6. 【sql server常用操作{增删改查}】

    use DB_x   go   drop database DB_y   create database DB_y --创建数据库   on primary --指定主数据文件   (   name= ...

  7. itertools.groupby()分组字典列表

    ## itertools.groupby()分组字典列表数据 from operator import itemgetter from itertools import groupby student ...

  8. PHPExcel 导入Excel数据 (导出下一篇我们继续讲解)

    一:使用composer下载 phpoffice/phpexcel 或者直接下载安装包 composer require phpoffice/phpexcel 二 1:导入数据 原理:读取文件,获取文 ...

  9. Python3爬虫(十五) 代理

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.设置代理 1.urllib #HTTP代理类型 from urllib.error import URLErr ...

  10. Go 入门 - 控制流

    主要内容来自中文版的官方教程Go语言之旅 目的为总结要点 循环 Go 只有 for循环 for 由三部分组成,用分号间隔开 初始化语句:在第一次迭代之前执行,通常为一句短变量声明(i:=0) 条件表达 ...