1.const引用:

但是加上const之后是可以的,const int &a=100;就不会报错了。

2.函数占位参数:

如果给最后的占位参数加上默认值:

3.内联函数

内联只是对编译器发起一个申请,编译器可以拒绝用户的请求。内联函数只用在普通函数的开头加上inline关键字。

当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置。这样做的好处是省去了调用的过程,加快程序运行速度。节省时间但是消耗空间。

inline函数的规则

(1)含有递归调用的函数不能设置为inline;

(2)使用了复杂流程控制语句:循环语句和switch语句,无法设置为inline;

(3)由于inline增加体积的特性,所以建议inline函数内的代码应很短小。最好不超过5行。

(4)inline仅做为一种“请求”,特定的情况下,编译器将不理会inline关键字,而强制让函数成为普通函数。出现这种情况,编译器会给出警告消息。

(5)在你调用一个内联函数之前,这个函数一定要在之前有声明或已定义为inline,如果在前面声明为普通函数,而在调用代码后面才定义为一个inline函数,程序可以通过编译,但该函数没有实现inline。比如下面代码片段: 
//函数一开始没有被声明为inline: 
void foo(); 
//然后就有代码调用它: 
foo(); 
//在调用后才有定义函数为inline: 
inline void foo() 

...... 

代码是的foo()函数最终没有实现inline;

如果一开始foo函数被声明成了inline,但是定义的时候没有inline关键字,同样不能内联。

C++ inline函数是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。一般地,用户可以阅读函数的声明,但是看不到函数的定义。尽管在大多数教科书中内联函数的声明、定义体前面都加了 inline 关键字,但我认为 inline 不应该出现在函数的声明中。这个细节虽然不会影响函数的功能,但是体现了高质量C++/C 程序设计风格的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需要内联。STM32中也是这样的,程序设计风格应该是只用定义即可,可放在头文件中。

(6)为了调试方便,在程序处于调试(release版本可以)阶段时,所有内联函数都不被实现。

(7)定义在类声明之中的成员函数将自动地成为内联函数

内联函数,和其他函数还有不同在于,内联函数可以定义在头文件中。

constexpr函数:函数的返回值和参数类型必须是字面值类型(如int ,指针,引用等,类 类型不属于字面值类型),而且函数体中只有一条return语句。

除了内联函数之外,c++还有constexpr函数,这个感觉是语法糖,一般我们使用不到,constexpr函数和内联函数一样,定义在头文件中也可以。

对于给定的内联函数或者constxepr函数,它的多个定义必须完全一致(c3p书上这样的说,内联函数和constxepr函数可以被多次定义,不是很理解),基于这个原因,他们通常被定义在头文件中。头文件依旧需要使用#ifndef保护,定义两个一模一样的内联函数也是会报错的。测试了,定义相同的内联函数会报错,也打开了gcc、g++的内联选项。不过,内联函数一般而言我们也用不到,只是不明白这里为什么和书上说的不一致。

猜测书上说的多次定义,实际上并不是我们理解的可以多次定义(多次定义必然报错),放在头文件中,还是应该加上头文件保护,并加上static关键字,这样保证不出错。

当然,使用#pragma once的头文件保护措施更好。

const引用和函数占位参数遇上默认参数以及内联函数的更多相关文章

  1. C++命名空间、函数重载、缺省参数、内联函数、引用

    一 .C++入门 1.C++关键字 2.命名空间 3.C++输入&输出 4.缺省参数 5.函数重载 6.引用 7.内联函数 8.auto关键字 9.基于范围的for循环 10.指针空值null ...

  2. C++学习笔记之——内联函数,引用

    本文为原创作品,转载请注明出处 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/ 作者:晨凫 ...

  3. 函数新特性、内联函数、const详解

    一.函数回顾与后置返回类型 函数定义中,形参如果在函数体内用不到的话,则可以不给形参变量名字,只给其类型. 函数声明时,可以只有形参类型,没有形参名 把函数返回类型放到函数名字之前,这种写法,叫前置返 ...

  4. [ 随手记 1 ] C/C++宏,普通函数,内联函数

    函数定义 C 语言中的函数定义的一般形式如下: return_type function_name( parameter list ) { body of the function } 在 C 语言中 ...

  5. (inline)内联函数在IOS开发中的使用

    今天在阅读YYKit源码(https://github.com/ibireme/YYKit.git)时发现在YYKitMacro.h组件中大量使用的内联函数,例如此文件中的一个函数 static in ...

  6. 从汇编看c++内联函数评估求值

    在c++中,一个inline函数实体,在整个class 声明未被完全看到之前,是不会被评估求值的,也就是说,对于类里面内联的成员函数本身的分析,要等到class的声明完全结束之后才开始.下面试c++源 ...

  7. C++内联函数与宏定义

    用内联取代宏: 1.内联可调试: 2.可进行类型安全检查或自动类型转换: 3.可访问成员变量. 另外,定义在类声明中的成员函数自动转化为内联函数. 文章(一) 内联函数与宏定义 在C中,常用预处理语句 ...

  8. c++中函数的参数传递,内联函数和默认实参的理解

    1.参数传递 1)函数调用时,c++中有三种传递方法:值传递.指针传递.引用传递. 给函数传递参数,遵循变量初始化规则.非引用类型的形参一相应的实参的副本初始化.对(非引用)形参的任何修改仅作用域局部 ...

  9. C/C++之宏、内联函数和普通函数的区别

    内联函数的执行过程与带参数宏定义很相似,但参数的处理不同.带参数的宏定义并不对参数进行运算,而是直接替换:内联函数首先是函数,这就意味着函数的很多性质都适用于内联函数,即内联函数先把参数表达式进行运算 ...

随机推荐

  1. C#数组和集合整理

    写起来还是有些勉强的,还有很多用法没有完全理解,只整理了一些基本点. Array ArrayList List Hashtable Dictionary Stack Queue Array 也就是数组 ...

  2. XamarinSQLite教程创建数据表

    XamarinSQLite教程创建数据表 新创建的数据库没有任何表.开发者需要手动添加数据表,并添加测试所需的数据. 1.创建数据表 为了存储数据,开发者需要添加自己的表,并设计表的结构.操作步骤如下 ...

  3. Xamarin Essentials教程检查网络连通性Connectivity

    Xamarin Essentials教程检查网络连通性Connectivity   网络连通性其实就是检测当前设备有没有连接网络.网络连通性在很多与网络相关的应用程序中会使用到.在Xamarin中如果 ...

  4. 《动物世界》的剪刀石头布 HDU --- 6418

    题目连接: https://vjudge.net/problem/1812686/origin emmm 这一题的资料来自<动物世界>这一个李易峰演的电影.. 主要的思路就是概率,但是会牵 ...

  5. python 函数定义及调用

    1.什么是函数? 在程序中,函数就是具备某一功能的工具,事先将工具准备好即函数的定义:遇到应用场景拿来就用即函数的调用:函数必须遵循先定义后调用的原则 2.为什么要用函数 不用函数的问题是: 程序冗长 ...

  6. 华容道 [NOIP 2013]

    Describltion 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 ...

  7. 自己遇到过的出现java.lang.StackOverflowError的原因

    public static JSONArray geth24Weather(String result) {//获取当天24小时以及第二天的天气结果对象        JSONObject fromO ...

  8. Some interesting facts about static member functions in C++

    Ref http://www.geeksforgeeks.org/some-interesting-facts-about-static-member-functions-in-c/ 1) stati ...

  9. 避免 Deepin 15.4 系统 界面卡顿、假死等现象:隐藏自带的“任务栏”,安装轻量级的“任务栏tint2”

    使用 Deepin 过程中,发现当点击“任务栏”上面的按钮,尤其是右键单击,选择菜单时,界面很容易卡顿,再也动弹不了. 好吧,,,就不使用自带的“任务栏”了,换成一个轻量级的“任务栏tint2”, 1 ...

  10. RabbitMQ 可靠投递

    RabbitMQ 可靠投递 标签: RabbitMQ shovel-plugin ConfirmCallback RabbitMQ消息投递 背景 confirmCallback 确认模式 return ...