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

一、函数回顾与后置返回类型

函数定义中,形参如果在函数体内用不到的话,则可以不给形参变量名字,只给其类型。

函数声明时,可以只有形参类型,没有形参名

把函数返回类型放到函数名字之前,这种写法,叫前置返回类型。

C++11中,后置返回类型,在函数声明和定义中,把返回值类型放到参数列表之后。

前面放auto,表示函数返回类型放到参数列表之后,而放在参数列表之后的返回类型是通过 -> 开始的。

 1 #include <iostream>
 2 using namespace std;
 3
 4 void func123(int , int); // 函数声明(函数原型);
 5 void func123(int a,int b)// 函数实现
 6 {
 7     return;
 8 }
 9
10 // C++11后置返回类型
11 auto func(int a , int b) -> void; // 函数声明
12 auto func(int a , int b) -> void
13 {
14     return;
15 }
16
17 inline int myfunc(int testv) // 函数定义前加inline,这个函数为内联函数
18 {
19     return;
20 }
21
22
23 int main()
24 {
25     //函数定义中,形参如果在函数体内用不到的话,则可以不给形参变量名字,只给其类型。
26     func123(12,13);
27     return 0;
28 }

二、内联函数

在函数定义前加关键字inline,导致该函数变成内联函数。

函数体很小,调用很频繁,引入inline(内联函数)

(1)inline影响编译器,在编译阶段对inline这种函数进行处理,系统尝试将调用该函数的动作替换为函数本体。通过这种方式来提升性能。

int abc = myfunc(5); //==> int abc = 1;

(2)inline只是我们开发者对编译器的一个建议,编译器可以尝试去做,也可以不做,这取决于编译器的诊断功能。

(3)内联函数的定义放到头文件中。这样需要用到这个函数的时候能够通过#include 把这个内联函数的源代码#include进来,以便找到这个函数的本体源代码并尝试将该函数的调用替换为函数体内的语句。

优缺点:

代码膨胀的问题;所以内联函数函数体尽量要小。

注意:各种编译器对inline的处理各不相同,inline函数尽量简单,代码尽量少。循环,分支,递归调用尽量不要出现在inline函数中,否则的话编译器很可能会因为你写这些代码的原因拒绝让这个函数称为inline函数。

1 constexpr int mf()
2 {
3     // ..写的特别简单
4 }

constexpr函数可以看成为更严格的内联函数。

#define 宏展开也类似于inline(内联函数)。

三、函数杂合用法总结

(1)函数返回类型为void,表示函数不返回任何类型。但是我们可以调用一个返回类型为void的函数,让它作为另一个返回类型是void的函数的返回值。

1 void funa(){}
2 void funb()
3 {
4     return funa();
5     //return;
6 }

(2)函数返回指针和返回引用的情况

 1 //返回指针
 2 int* myfunc()
 3 {
 4     // 存在隐患
 5     int tmpval = 9;
 6     return &tmpval; // 这个地址出了这个函数,地址被系统回收。
 7 }
 8
 9
10 int main()
11 {
12     int *p = myfunc();
13     *p = 6; // 你向一个不存的地址写了数据
14 }
15
16 //返回引用
17 int& myfunc()
18 {
19     int tmpval = 9;
20     cout << &tmpval << endl;
21     return tmpval; // 也存在隐患 返回已经回收了地址的引用
22 }
23
24 int main()
25 {
26     int& k =myfunc();
27     cout << &k << endl;
28     k = 10;  //你向一个不存的地址写了数据
29
30     // 返回值
31     int x = myfunc(); // 这种写法是OK的
32     cout << &x << endl;
33     x = 20;
34
35     return 0;
36 }

(3)不带形参的函数定义()、(void)

1 int myfunc(void)
2 {
3     return 1;
4 }

(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;

 1 int main()
 2 {
 3     char str[] = “I Love China”;
 4     const char* p; // p指向的东西不能通过p来修改(p所指向的目标,目标中的内容不能通过p来改变)
 5     p = str;
 6     //*p = ‘Y’; // 语法错误
 7     p++;
 8
 9     str[0] = ‘Y’;
10     return 0;
11 }

(2)char const* 与 const char*等价

(3)char* const

 1 int main()
 2 {
 3     char str[] = “I Love China”;
 4     char* const p = str; // 定义的时候必须初始化
 5     // p一旦指向了一个东西之后,就不能再指向其他东西了。
 6     *p = ‘Y’; // 但是可以修改p指向的目标中的内容
 7
 8     //char const* const p = str;
 9     const char*  const p =str; // p的指向不能变,p指向的内容也不能通过p来改变
10
11     int i = 100;
12     const int& a =i // 代表a的内容不能通过a自己来修改;
13     i=1000;
14     //a = 50; // 不合法
15
16     //int &b = 3; // 错误
17     const int &b = 3; // OK
18     //b = 45; // 错误
19     cout << b << endl;
20
21     return 0;
22 }
23
24  

五、函数形参中带const

把形参写成const的好处:

(1)可以防止你无意中修改了形参值导致实参值无意被修改;

(2)实参类型可以更灵活。

 1 struct student{int num;};
 2 void fs(const student &stu)
 3 {
 4     //stu.num = 1010; // 加const stu不可以修改
 5 }
 6
 7 void fs2(const int i)
 8 {
 9     //i=100; // 不可以修改
10 }
11
12
13 int main()
14 {
15     student student1;
16     student1.num = 100;
17     fs(student1);
18     cout << student1.num << endl;
19     return 0;
20 }

原文地址:https://www.cnblogs.com/hs-pingfan/p/10424707.html

时间: 2024-10-26 03:17:34

函数新特性、内联函数、const详解的相关文章

虚函数可以是内联函数吗?

虚函数是通过指针或引用调用函数时,通过虚函数表来确定调用的函数,在运行时确定. 内联函数是在编译时,将调用函数处插入内联函数的代码,省去了函数调用时的开销. 表面上看,虚函数不能为内联函数.我们在类中定义的函数都是内联函数,析构函数经常在类中定义,而析构函数又经常声明为虚函数,以前没有发现什么问题. 其实虚函数可以为内联函数,这与内联函数的定义没什么冲突. 内联函数到底要不要在调用处展开取决于怎么调用内联函数. class A { A(){} ~A(){} virtual void foo()

CSS 中 block 元素(块级元素)与 inline 元素(内联元素)详解

块元素 (block element) 一般是其他元素的容器元素,块元素一般都从新行开始,它可以容纳内联元素和其他块元素 , 常见块元素是段落标签“P”.“form”这个块元素比较非凡,它只能用来容纳其他块元素. 假如没有 CSS 的作用,块元素会顺序以每次另起一行的方式一直往下排.而有了 CSS 以后,我们可以改变这种 HTML 的默认布局模式,把块元素摆放到你想要的位置上去.而不是每次都愚蠢的另起一行.需要指出的是,table 标签也是块元素的一种,Table Based Layout 和 

Java新特性之Nashorn的实例详解

Nashorn是什么 Nashorn,发音"nass-horn",是德国二战时一个坦克的命名,同时也是java8新一代的javascript引擎--替代老旧,缓慢的Rhino,符合 ECMAScript-262 5.1 版语言规范.你可能想javascript是运行在web浏览器,提供对html各种dom操作,但是Nashorn不支持浏览器DOM的对象.这个需要注意的一个点. 关于Nashorn的入门 主要是两个方面,jjs工具以及javax.script包下面的API: jjs是在j

ASP.NET MVC5 新特性:Attribute路由使用详解

1.什么是Attribute路由?怎么样启用Attribute路由? 微软在 ASP.NET MVC5 中引入了一种新型路由:Attribute路由,顾名思义,Attribute路由是通过Attribute来定义路由.当然,MVC5也支持以前定义路由的方式,你可以在一个项目中混合使用这两种方式来定义路由. 在以前的版本中我们通常在 RouteConfig.cs 文件中通过以下方式来定义路由: routes.MapRoute( name: "ProductPage", url: &quo

ASP.NET MVC5 新特性:Attribute路由使用详解 (转载)

1.什么是Attribute路由?怎么样启用Attribute路由? 微软在 ASP.NET MVC5 中引入了一种新型路由:Attribute路由,顾名思义,Attribute路由是通过Attribute来定义路由.当然,MVC5也支持以前定义路由的方式,你可以在一个项目中混合使用这两种方式来定义路由. 在以前的版本中我们通常在 RouteConfig.cs 文件中通过以下方式来定义路由: routes.MapRoute( name: "ProductPage", url: &quo

内联函数详解

什么是内联性和外联函数 类的成员函数可以分为内联函数和外联函数.内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内.而说明在类体内,定义在类体外的成员函数叫外联函数.外联函数的函数体在类的实现部分. 内联函数在调用时不是像一般的函数那样要转去执行被调用函数的函数体,执行完成后再转回调用函数中,执行其后语句,而是在调用函数处用内联函数体的代码来替换,这样将会节省调用开销,提高运行速度. 内联函数与前面讲过的带参数的宏定义进行一下比较,它们的代码效率是一样的,但是内联函数要优于宏定义

java内联函数

在说内联函数之前,先说说函数的调用过程. 调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到  转去执行该函数前的地方.这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保  存地址继续执行.也就是通常说的压栈和出栈.因此,函数调用要有一定的时间和空间方面的开销.那么对于那些函数体  代码不是很大,又频繁调用的函数来说,这个时间和空间的消耗会很大. 那怎么解决这个性能消耗问题呢,这个时候需要引入内联函数了.内联函数

内联函数的定义及说明

一.什么叫inline函数? inline(小心,不是online),翻译成"内联"或"内嵌".意指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置.这样做的好处是省去了调用的过程,加快程序运行速度.(函数的调用过程,由于有前面所说的参数入栈等操作,所以总要多占用一些时间).这样做的不好处:由于每当代码调用到内联函数,就需要在调用处直接插入一段该函数的代码,所以程序的体积将增大.拿生活现象比喻,就像电视坏了,通过

内联函数

一.什么叫inline函数? inline(小心,不是online),翻译成“内联”或“内嵌”.意指:当编译器发现某段代码在调用一个内联函数时,它不是去调用该函数,而是将该函数的代码,整段插入到当前位置.这样做的好处是省去了调用的过程,加快程序运行速度.(函数的调用过程,由于有前面所说的参数入栈等操作,所以总要多占用一些时间).这样做的不好处:由于每当代码调用到内联函数,就需要在调用处直接插入一段该函数的代码,所以程序的体积将增大.拿生活现象比喻,就像电视坏了,通过电话找修理工来,你会嫌慢,于是

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

本文为原创作品,转载请注明出处 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/ 作者:晨凫追风 一直想开始写C++的学习笔记,学习C++已经两个月了,今天开始写一下引用,内联函数,的一些概念和作用吧.那么开始吧! ????内联函数: 我们写的程序最终都是要用编译器,进行编译链接形成一段机器可以知道的二进制代码,接着存到一个内存中,这时候每一段程序代码都会有自己的一个地址,计算机按照地址增