快速熟悉C++之常用语法
创始人
2024-02-02 18:49:20
0

函数重载(Overload)

规则

函数名相同 参数个数不同、参数类型不同、参数顺序不同

◼ 注意

返回值类型与函数重载无关 调用函数时,实参的隐式类型转换可能会产生二义性

◼ 本质

采用了name mangling或者叫name decoration技术 ✓ C++编译器默认会对符号名(比如函数名)进行改编、修饰,有些地方翻译为“命名倾轧” ✓ 重载时会生成多个不同的函数名,不同编译器(MSVC、g++)有不同的生成规则 ✓ 通过IDA打开【VS_Release_禁止优化】可以看到

原理

C++代码

解析代码

默认参数

规则

◼ C++允许函数设置默认参数,在调用时可以根据情况省略实参。规则如下: 默认参数只能按照右到左的顺序 如果函数同时有声明、实现,默认参数只能放在函数声明中 默认参数的值可以是常量、全局符号(全局变量、函数名) 如果函数的实参经常是同一个值, 可以考虑使用默认参数 函数重载、默认参数可能会产生冲突、二义性(建议优先选择使用默认参数)

原理:

C++代码

汇编代码:

 备注:E8是call的指令,E8后面的一串是根据下一条指令算出来的,具体参见intel的汇编指令白皮书。

extern “C”

规则

被extern "C"修饰的代码会按照C语言的方式去编译

 如果函数同时有声明和实现,要让函数声明被extern "C"修饰,函数实现可以不修饰

 

 有时也会在编写C语言代码中直接使用extern “C” ,这样就可以直接被C++调用

 通过使用宏__cplusplus来区分C、C++环境

#pragma once

我们经常使用#ifndef、#define、#endif来防止头文件的内容被重复包含 ◼ #pragma once可以防止整个文件的内容被重复包含 ◼ 区别 #ifndef、#define、#endif受C\C++标准的支持,不受编译器的任何限制 有些编译器不支持#pragma once(较老编译器不支持,如GCC 3.4版本之前),兼容性不够好 #ifndef、#define、#endif可以针对一个文件中的部分代码,而#pragma once只能针对整个文件

 内联函数(inline function)

规则

◼ 使用inline修饰函数的声明或者实现,可以使其变成内联函数 建议声明和实现都增加inline修饰 ◼ 特点 编译器会将函数调用直接展开为函数体代码 可以减少函数调用的开销 会增大代码体积 ◼ 注意 尽量不要内联超过10行代码的函数 有些函数即使声明为inline,也不一定会被编译器内联,比如递归函数

debubg下不会内联,只有release下优化才会出现内联

VS窥探内联的本质

内联函数与宏

◼ 内联函数和宏,都可以减少函数调用的开销 ◼ 对比宏,内联函数多了语法检测和函数特性 ◼ 思考以下代码的区别 #define sum(x) (x + x) inline int sum(int x) { return x + x; } int a = 10; sum(a++);

const

◼ const是常量的意思,被其修饰的变量不可修改 如果修饰的是类、结构体(的指针),其成员也不可以更改 ◼ 以下5个指针分别是什么含义?

 int 和const是可以替换的,两者位置互换效果一致!

◼ 上面的指针问题可以用以下结论来解决: const修饰的是其右边的内容 解释如下:

 demo如下:

引用(Reference)

规则

◼ 在C语言中,使用指针(Pointer)可以间接获取、修改某个变量的值 ◼ 在C++中,使用引用(Reference)可以起到跟指针类似的功能 ◼ 注意点 引用相当于是变量的别名(基本数据类型、枚举、结构体、类、指针、数组等,都可以有引用) 对引用做计算,就是对引用所指向的变量做计算 在定义的时候就必须初始化,一旦指向了某个变量,就不可以再改变,“从一而终” 可以利用引用初始化另一个引用,相当于某个变量的多个别名 不存在【引用的引用、指向引用的指针、引用数组】 ◼ 引用存在的价值之一:比指针更安全、函数返回值可以被赋值

引用的本质

◼ 引用的本质就是指针,只是编译器削弱了它的功能,所以引用就是弱化了的指针 指令代码一模一样

◼ 一个引用占用一个指针的大小

 

常引用(Const Reference)

◼ 引用可以被const修饰,这样就无法通过引用修改数据了,可以称为常引用 const必须写在&符号的左边,才能算是常引用 ◼ const引用的特点 可以指向临时数据(常量、表达式、函数返回值等) 可以指向不同类型的数据 作为函数参数时(此规则也适用于const指针) ✓ 可以接受const和非const实参(非const引用,只能接受非const实参) ✓ 可以跟非const引用构成重载 ◼ 当常引用指向了不同类型的数据时,会产生临时变量,即引用指向的并不是初始化时的那个变量

数组的引用

◼ 常见的2种写法

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...