函数新特性、内联函数、const详解
一、函数回顾与后置返回类型
函数定义中,形参如果在函数体内用不到的话,则可以不给形参变量名字,只给其类型。
函数声明时,可以只有形参类型,没有形参名
把函数返回类型放到函数名字之前,这种写法,叫前置返回类型。
C++11中,后置返回类型,在函数声明和定义中,把返回值类型放到参数列表之后。
前面放auto,表示函数返回类型放到参数列表之后,而放在参数列表之后的返回类型是通过 -> 开始的。
#include <iostream>
using namespace std; void func123(int , int); // 函数声明(函数原型);
void func123(int a,int b)// 函数实现
{
return;
} // C++11后置返回类型
auto func(int a , int b) -> void; // 函数声明
auto func(int a , int b) -> void
{
return;
} inline int myfunc(int testv) // 函数定义前加inline,这个函数为内联函数
{
return;
} int main()
{
//函数定义中,形参如果在函数体内用不到的话,则可以不给形参变量名字,只给其类型。
func123(,);
return ;
}
二、内联函数
在函数定义前加关键字inline,导致该函数变成内联函数。
函数体很小,调用很频繁,引入inline(内联函数)
(1)inline影响编译器,在编译阶段对inline这种函数进行处理,系统尝试将调用该函数的动作替换为函数本体。通过这种方式来提升性能。
int abc = myfunc(5); //==> int abc = 1;
(2)inline只是我们开发者对编译器的一个建议,编译器可以尝试去做,也可以不做,这取决于编译器的诊断功能。
(3)内联函数的定义放到头文件中。这样需要用到这个函数的时候能够通过#include 把这个内联函数的源代码#include进来,以便找到这个函数的本体源代码并尝试将该函数的调用替换为函数体内的语句。
优缺点:
代码膨胀的问题;所以内联函数函数体尽量要小。
注意:各种编译器对inline的处理各不相同,inline函数尽量简单,代码尽量少。循环,分支,递归调用尽量不要出现在inline函数中,否则的话编译器很可能会因为你写这些代码的原因拒绝让这个函数称为inline函数。
constexpr int mf()
{
// ..写的特别简单
}
constexpr函数可以看成为更严格的内联函数。
#define 宏展开也类似于inline(内联函数)。
三、函数杂合用法总结
(1)函数返回类型为void,表示函数不返回任何类型。但是我们可以调用一个返回类型为void的函数,让它作为另一个返回类型是void的函数的返回值。
void funa(){}
void funb()
{
return funa();
//return;
}
(2)函数返回指针和返回引用的情况
//返回指针
int* myfunc()
{
// 存在隐患
int tmpval = ;
return &tmpval; // 这个地址出了这个函数,地址被系统回收。
} int main()
{
int *p = myfunc();
*p = ; // 你向一个不存的地址写了数据
} //返回引用
int& myfunc()
{
int tmpval = ;
cout << &tmpval << endl;
return tmpval; // 也存在隐患 返回已经回收了地址的引用
} int main()
{
int& k =myfunc();
cout << &k << endl;
k = ; //你向一个不存的地址写了数据 // 返回值
int x = myfunc(); // 这种写法是OK的
cout << &x << endl;
x = ; return ;
}
(3)不带形参的函数定义()、(void)
int myfunc(void)
{
return ;
}
(4)如果一个函数如果不调用的话,则该函数只有声明部分,没有定义部分。
int a();
int b();
int c();
(5)普通函数定义只能定义(.cpp)一次,声明可以声明(.h)多次。
(6)void func(int& a,int& b); 函数可以通过参数引用来实现返回多个值。
(7)C++中,函数允许同名,但是形参列表的参数类型或者数量必须有明显区别。
void fs(int i);
void fs(float i);
void fs(int i , int b);
四、const char*、char const*、char* const三者的区别
(1)const char* p;
int main()
{
char str[] = “I Love China”;
const char* p; // p指向的东西不能通过p来修改(p所指向的目标,目标中的内容不能通过p来改变)
p = str;
//*p = ‘Y’; // 语法错误
p++; str[] = ‘Y’;
return ;
}
(2)char const* 与 const char*等价
(3)char* const
int main()
{
char str[] = “I Love China”;
char* const p = str; // 定义的时候必须初始化
// p一旦指向了一个东西之后,就不能再指向其他东西了。
*p = ‘Y’; // 但是可以修改p指向的目标中的内容 //char const* const p = str;
const char* const p =str; // p的指向不能变,p指向的内容也不能通过p来改变 int i = ;
const int& a =i // 代表a的内容不能通过a自己来修改;
i=;
//a = 50; // 不合法 //int &b = 3; // 错误
const int &b = ; // OK
//b = 45; // 错误
cout << b << endl; return ;
}
五、函数形参中带const
把形参写成const的好处:
(1)可以防止你无意中修改了形参值导致实参值无意被修改;
(2)实参类型可以更灵活。
struct student{int num;};
void fs(const student &stu)
{
//stu.num = 1010; // 加const stu不可以修改
}
void fs2(const int i)
{
//i=100; // 不可以修改
}
int main()
{
student student1;
student1.num = ;
fs(student1);
cout << student1.num << endl;
return ;
}
函数新特性、内联函数、const详解的更多相关文章
- 关于Haxe3新特性“内联构造方法”的解释
学习过C/C++的童鞋们应该了解inline即内联机制的意义,Haxe语言也很好的支持内联机制,让开发者可以自己在空间效率和时间效率上进行取舍. 从Haxe3开始,构造方法也可以使用inline关键字 ...
- java8新特性(四)_Stream详解
之前写过一篇用stream处理map的文章,但是对stream没有一个整体的认识,这次结合并发编程网和ibm中介绍stream的文章进行一个总结,我会着重写对list的处理,毕竟实际工作中大家每天进行 ...
- CSS 块状元素和内联元素的详解
我们先来分析一下块级元素.内联级元素的定义和解析: 块元素(block element)一般是其他元素的容器元素,块元素一般都从新行开始,它可以容纳内联元素和其他块元素,常见块元素是段落标签'P&q ...
- (转) html块级元素和内联元素区别详解
http://blog.csdn.net/chen_zw/article/details/8713205 块级元素(block)特性: 总是独占一行,表现为另起一行开始,而且其后的元素也必须另起一行显 ...
- html块级元素和内联元素区别详解
块级元素(block)特性: 总是独占一行,表现为另起一行开始,而且其后的元素也必须另起一行显示; 宽度(width).高度(height).内边距(padding)和外边距(margin)都可控制; ...
- ASP.NET MVC5 新特性:Attribute路由使用详解 (转载)
1.什么是Attribute路由?怎么样启用Attribute路由? 微软在 ASP.NET MVC5 中引入了一种新型路由:Attribute路由,顾名思义,Attribute路由是通过Attrib ...
- Java新特性之Nashorn的实例详解
Nashorn是什么 Nashorn,发音“nass-horn”,是德国二战时一个坦克的命名,同时也是java8新一代的javascript引擎--替代老旧,缓慢的Rhino,符合 ECMAScrip ...
- ASP.NET MVC5 新特性:Attribute路由使用详解
1.什么是Attribute路由?怎么样启用Attribute路由? 微软在 ASP.NET MVC5 中引入了一种新型路由:Attribute路由,顾名思义,Attribute路由是通过Attrib ...
- 特殊用途语言特性——默认参数、内联函数和constexptr函数
1 默认实参 某些函数有这样一些参数,在函数的很多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参.调用含有默认实参的函数时,可以包含该实参,也可以省略该实参. 我们可 ...
- 特殊用途语言特性(默认实参/内联函数/constexpr函数/assert预处理宏/NDEBUG预处理变量)
默认实参: 某些函数有这样一种形参,在函数的很多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参.调用含有默认实参的函数时,可以包含该实参,也可以省略该实参. 需要特别 ...
随机推荐
- KVC的底层实现原理
KVC是OC特有的,本质是在运行时动态的给对象发送setValue:forKey 消息,设置数值 -调用super.init 保证对象已经被创建完成 .当给对象发送setValue:forKey 消息 ...
- Linux 基金会宣布联合 edX 提供免费 Linux 课程
edX 是一个由麻省理工学院和哈佛大学创建的大规模开放在线课堂平台.它免费给大众提供大学教育水平的在线课堂.” edX 学习平台” 就像 开源软件似的发展,它使得其它院校机构也可以提供其高级学习的 ...
- oracle运行的服务介绍
oracle正常运行的话,所需要启动的服务是这几个: Oracle ORCL VSS Writer Service,OracleDBConsoleorcl,OracleJobSchedulerORCL ...
- Openssl errstr命令
一.简介 errstr命令用于查询错误代码 二.语法 errstr [-stats] <errno> 选项 -stats:打印哈希表状态 errno:错误号 三.实例 1.查看错误信息 : ...
- 回顾2017系列篇(三):UX设计大会,都预示了哪些设计趋势
2017已接近尾声,在这一年中,无数的UX大会和设计大会在世界各地召开.每一场会议的召开,都是界内精英人士经验的交流和智慧的碰撞.虽然2017年的会议都已过去,但每场会议上的话题探讨,尤其是界内精英们 ...
- redhad系统配置daocloud加速器
一.注册daocloud账户网址:http://www.daocloud.io/ 配置加速器需要在daocloud上注册一个用户.注册之后,登陆进去可以看到[加速器]选项. 点击加速器选项之后,就可以 ...
- linux命令的笔记
1.改变目录的用户组和所有者 chown 命令 如下图: 可以看到test1与test2的的所有者和所属组都是root,其中 第三个字段是说明目录拥有者, 第四个字段是文件拥有者所在的组, 第五个字段 ...
- CodeForces 682C Alyona and the Tree (树上DFS)
题意:给定一棵树,每个叶子有一个权值,每条边也有一个权值,现在让你删最少的结点,使得从任何结点出发到另一个结点的边上权值和都小于两个结点的权值. 析:很明显是DFS,不过要想找出最少的结点可能不太容易 ...
- ubuntu同时安装Qt4.8和Qt5.7[认真写每篇博客^-^]
这是ubuntu默认安装(从apt安装)的路径和相关文件,建议编译安装到/opt目录下. 从APT安装的默认文件夹 以下是我的安装情况,配置为qt4.8为默认. 安装包或源码下载地址: qt4:htt ...
- GitHub 出现这样的问题怎么办
一开始以为是被墙,憋个半死. 后来自己好了(大概过了一上午),虚惊一场.