C++对C语言的扩展(二)
来源:互联网 发布:网络大电影 编辑:程序博客网 时间:2024/06/05 20:22
(一)C++中的const
1)C语言与C++中的const 比较:
1° C语言中const变量是只读变量,有自己的存储空间
2° C++中的const常量可能分配存储空间,也可能不分配存储空间
C语言中的const#includeint main(){ // C语言中 const修饰的变量是一个 常变量,本质还是变量,有自己的地址空间 const int a = 10; int *p = (int *)&a; *p = 5; printf ("%d\n", a); return 0;}C++中的const#include int main(){ // C++中 const 变量声明的是一个真正的常量,不是变量,所以编译器不会为该常量分配空间 // const 修饰的常量会被放到 符号表 中 const int a = 10; // 这里对 const 常量取地址,这一步操作会让编译器为该变量分配空间,分配的空间并不会被 a 使用 int *p = (int *)&a; // 通过指针改变指向的空间的值,这个空间是编译器为常量分配的空间,但是常量的值并不在这个空间内 // 所以即使通过指针修改了这个空间的值,也不会影响到 a 本身 *p = 5; // a 的值不变,因为它的值在符号表中,不在程序运行的空间内 printf ("%d, %p\n", a, *p); return 0;}
2)const与define的比较:
C++中的const常量与宏定义不同 const常量是由编译器处理的,提供类型检查和作用域检查
宏定义由预处理器处理,单纯的文本替换
(二)c++的引用:
1普通引用:
1)变量名回顾:
变量名实质上是一段连续存储空间的别名,是一个标号(门牌号)
程序中通过变量来申请并命名内存空间
通过变量的名字可以使用存储空间
2)C++引用定义:引用可以看作一个已定义变量的别名,引用的语法:Type& name = var
3)引用的定义:;
1°引用作为其它变量的别名而存在,因此在一些场合可以代替指针
2°引用相对于指针来说具有更好的可读性和实用性
4)引用本质:
引用在C++中的内部实现是一个常指针: Type& name = Type* const name
C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。
从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏
5)函数返回值为引用:若返回栈变量 不能成为其它引用的初始值 不能作为左值使用
返回全局变量或静态变量:若返回静态变量或全局变量 可以成为其他引用的初始值 即可作为右值使用,也可作为左值使用
6)指针引用:传的是指针引用
2.常引用:分为俩种情况
1)用变量初始化 常引用
{
int a1 = 20;
const int& b1 = a1; // a1 变量去初始化常引用
}
2)用常量去初始化常引用
{
const int a = 40; // C++编译器把a放在符号表中
int& b = 41; // 普通引用,相当于 int *const b引用一个常量,常量是没有地址空间的,这样的做法是不合法的
// 使用常量去初始化常引用是合法的,C++编译器会为该引用分配空间,常量的值存储到分配的空间中去
// 使用常量对 const引用 初始化后,将生成一个只读变量
const int& b = 42;
(三)c++中c函数扩展
1.内联函数:
1)C++中推荐使用内联函数替代宏代码片段
72)C++中使用inline关键字声明内联函数(必须和函数定义放在一起)
3)C++编译器可以将一个函数进行内联编译(inline函数执行时间要尽量短,不要有循环,不要有复杂的判断)
4)被C++编译器内联编译的函数叫做内联函数(没有被inline修饰的普通函数也有可能被编译器内联)
5)内联函数在最终生成的代码中是没有定义的
6)C++编译器直接将函数体插入在函数调用的地方 (宏代码片段 由预处理器处理, 进行简单的文本替换,没有任何编译过程)
7)内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)
8)内联函数是对编译器的一种请求,C++编译器不一定准许函数的内联请求!
例如:C++中内联函数的实现机制
inline int func(int a, int b){ return a < b ? a : b;}int main(){ int r = func(1,2); return 0;}
2.默认参数:
3占位参数:
占位参数只有参数类型声明,而没有参数名声明,一般情况下,在函数体内部无法使用占位参数
4函数重载:
1)定义:函数名相同 根据函数的参数不同会调用不同的函数
2)规则:1°函数返回值不能作为函数重载的判定
2°参数类型不同,参数个数不同,参数的顺序不同
3)注意点:1°函数重载和函数默认参数一起使用,可能会导致调用关系不明确
2°重载函数赋值给一个函数指针,要精确匹配函数指针的类型
- C++对C语言的扩展(二)
- C++语言(二)——C++对C语言基础语法的扩展
- ARM编译器对C语言的扩展
- GCC 对C语言的扩展
- C++对C语言的扩展
- GCC 对C语言的扩展(1)
- c++对C语言的扩展(一)
- gcc对C语言扩展
- 2.2.2 GNU C对标准C语言的扩展
- C++与C语言的区别——C++是对C语言的扩展(二)——输入cin与输出cout
- Keil C51对C语言的关键词扩展之二: alien
- OC基础回顾(一)Objective-C是对C语言的扩展
- 对C语言数据处理和指针的理解(二)
- gcc对标准C/C++语言的扩展
- gcc对标准C/C++语言的扩展
- gcc对C语言的扩展:函数参数构造
- Keil C51对C语言的关键词扩展
- Keil C51对C语言的关键词扩展之一: _at_
- qt窗口坐标
- UWP(2) How to access the Sqlite db(如何访问Sqlite数据库文件)
- srpingBoot +mybatis 出现不能批量插入的问题,解决方法
- CodeForces 455A:Boredom (动态规划)
- iOS-未读消息的小红点展示
- C++对C语言的扩展(二)
- Redis发布与订阅以及日常存取源码分享
- CSS中可以和不可以继承的属性
- Linux 搭建redis
- spring boot 拦截器 注入dao 操作数据库时dao 为null
- Linux机器间同步文件脚本
- java学习初探2之语言基础(2)
- 卡尔曼滤波学习(一)
- APP跳转到设置中