02 C++基础

01 形参带默认值的函数

  1. 给函数形参默认值的时候,只能从右向左给;举例如下:
int sum(int a = 10,int b); // 错误
int sum(int a,int b = 20); // 正确
int sum(int a = 10,int b = 20); // 正确
  1. 调用的效率问题(涉及栈堆处理);
  2. 定义处和声明处都可以给形参默认值;
  3. 形参给默认值时,无论是定义处给,还是声明处给,形参默认值只能出现一次。

02 inline内联函数

inline内联函数与普通函数的区别:
inline内联函数在编译过程中,没有函数的调用开销。在函数的调用点直接就把函数的代码进行展开处理。(函数的调用包括参数压栈,函数栈帧的开辟和回退的过程。函数代码行过大时,调用的开销会较大。)
inline内联函数不会产生函数符号(如*.o;.text等)。

inline只是建议编译器把这个函数处理成内联函数,但是不是所有的inline内联函数都会被编译器处理成内联函数,例如递归函数。

debug版本上,inline是不起作用的;inline在release版本下效果才能显示出来。
debug 版本是为开发和调试阶段准备的编译模式,release 版本是为产品发布准备的编译模式。

03 函数重载

  1. 一组函数,其中函数名相同,参数列表的个数或者类型不同,那么这一组函数就被称作函数重载。
  2. 一组函数要称得上重载,一定是在同一作用域中。
  3. const或者volatile的时候,是怎样影响形参类型的。
  4. 一组函数,函数名相同,参数列表也相同,仅仅返回值不同,就不是重载。
  • C调用C++无法直接调用,要把C++源码扩在extern "C";C++调用C代码要把C函数的声明扩在extern "C"里面。
  • C++编译器中都内置了_cplusplus这个宏名。

C++为什么支持函数重载,C不支持函数重载?

  • C++代码产生函数符号的时候,是由函数名+参数列表类型组成的。
  • C代码产生函数符号的时候,是由函数名来决定的。

04 const

const修饰的变量叫常量,在C++中与普通变量有两点区别:

  1. 编译方式不同;
  2. 不能再作为左值,即初始化完成后,值不能再被修改!举例如下:
const int a =20;
a = 30;  // 作为左值修改,错误

const修饰的常量常出现的错误:

  1. 作为左值修改常量的值(直接修改常量的值);
  2. 把常量的地址泄露给一个普通的指针或者普通的引用变量(可以间接的修改常量的值)。

C和C++中const的区别:
在C中const修饰的量可以不初始化,叫常变量;在C++中const修饰的量可以必须初始化,叫常量。举例如下:

int a = 20const int b = a;
这在C++中叫常变量,因为初始值不是常数,是一个变量。

const的编译方式不同
C中,const就是当作一个变量来编译生成指令的;C++中,所有出现const常量的地方,都被常量的初始化替换了。

05 const和一级(二级)指针的结合

C++语言规范:const修饰的是离它最近的类型。

const int *p;
int const *p;

上面的声明方式是等价的,只是位置不同。它们都表示p是一个指向 const int 的指针,不能通过p修改它所指向的整数的值,但可以指向不同的内存地址。

int *const p;  // => p = &b;  *p = 20;

这个p是一个常量指针,它指向的内存地址不能改变,但是可以通过指针解引用修改指向的内存地址的值。

const int *const p;

第一个const修饰指针所指向的数据,表示数据是常量,不能通过指针修改数据的值;第二个const修饰指针本身,表示指针是常量,不能改变指针的指向。

const和二级指针的类型转换公式总结:

int*        <= const int*  // 错误
const int*  <= int*        // 正确
int**       <= const int** // 错误
const int** <= int**       // 错误
int**       <= int* const* // 错误
int* const* <= int**       // 正确
  • const如果右边没有指针*的话,const是不参与类型的

06 引用

引用是一种更安全的指针;引用变量相当于起别名。
引用和指针的区别:

  1. 引用必须初始化,指针可以不初始化;
  2. 引用只有一级引用,没有多级引用,指针可以有多级指针;
  3. 定义一个引用变量,和定义一个指针变量,其汇编指令是一模一样的;通过引用变量修改所引用内存的值,和通过指针解引用修改指向的内存的值,其底层指令也是一模一样的。

左值引用和右值引用:

int a = 10// 左值,它有内存,有名字,值可以修改
int &b = a;

int &c = 20; // 20是右值,没内存,没名字
int &&c = 20// C++11提供了右值引用
  • 临时量都看做右值
    右值引用:
  1. int &&c = 20;专门用来引用右值类型,指令上,可以自动产生临时量,然后直接引用临时量c = 40(可以修改);
  2. 右值引用变量本身是一个左值,只要用左值引用来引用它;
  3. 不能用一个右值引用变量,来引用一个左值。

07 new和delete

malloc和free,称作C的库函数
new和delete,称作运算符

new不仅可以做内存开辟,还可以做内存的初始化操作
malloc开辟内存失败,是通过返回值和nullptr做比较;而new开辟内存失败,是通过抛出bad_alloc类型的异常来判断的

// new的种类
int *p1 = new int(20);
int *p2 = new (nothrow) int;
const int *p3 = new const int(40);

// 定位new
int data = 0;
int *p4 = new(&data) int(50); // 指定内存开辟
cout << "data:" << data <<endl; // data:50

C++不是类型安全的,类型之间可以进行隐式类型转换。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值