【C/C++】中const函数详解

形参带默认值的函数

给默认值的时候从右向左给
定义处可以给形参默认值,声明也可以给默认值
形参给默认值时,不管定义处给,还是声明处给,形参默认值只能给一次
调用有默认值的函数效率会增大

inline内联函数

inline内联函数: 在编译过程中就没有函数的调用开销了,在函数的调用点直接·把函数的代码进行展开处理了。
同时内联函数不再生成相应的函数符号。
inline只是建议 编译器把这个函数处理成内联函数。不一定会把所有的inline标志的函数处理成内联函数。

在debug版本上inline内联函数是不会起作用的,还是有mov,push,call指令。
在release版本下才可以实现
此处可以在Linux下验证:

g++ -c main.cpp -O2 
objdump -t main.o

这里面就找不到sum产生的符号了。

inline内联函数 和普通函数的区别

普通函数有标准的函数调用开销,相反内联函数没有。

如果函数在短时间内大量调用,并且函数十分简单可以声明成内联函数。

const

  1. 怎么理解const?
    const修饰的变量不能够再作为左值
    初始化完成后,初始化的值不能够再修改。

  2. 在C与C++中const的区别?

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

在C中
const修饰的量可以不用初始化,但是后边也就无法赋值了。其实它不叫常量,叫做常变量。
const int a = 20;
const只是保持a不能作为左值赋值,但是
可以通过指针访问里面的内存,修改a的值
或者通过添加汇编指令修改。

const int a = 20;
int *p = (int*)&a;
*p = 30;
printf("%d %d %d",a,*p,*(&a));
//打印出来的值都是30

在C++中
const 必须进行初始化。叫做常量
可以用于作为数组的下标。

const int a = 20;
int *p = (int*)&a;
*p = 30;
printf("%d %d %d",a,*p,*(&a));
		// 结果:20  30  20
		注意:内存a的值已经被修改了,之所以没有打印出来,因为没有访问a的地址

当初始值不是一个立即数,是一个变量的时候,就叫做常变量了。

int b =20;
const int a = b; //a叫做常变量。
int *p = (int*)&a;
*p = 30;
printf("%d %d %d",a,*p,*(&a));//这的运行结果也就都是30了
  1. cosnt修饰的量常出现的错误·:
    1.cosnt修饰的量不能再作为左值(直接修改const修饰的量)
    2.不能把cosnt修饰的量的地址泄漏给一个普通的指针或者普通的引用变量。(可以间接修改)

  2. const和一级指针的结合
    C++语言规范:cosnt修饰的是离它最近的类型。
    const int *p ; == int const *p;
    可以指向不同的int类型的内存,但是不能通过指针间接修改指向的内存的值,

int *const p = &a;
这个指针p现在是常量,不能再指向其他内存,但是可以通过指针解引用修改指向的内存的

const int *const p = &a;
都不可以修改

总结

int* <= const int* (不可以)
const int* <= int* (可以)
const如果右边没有指针*的话,const是不参与类型

int** <= const int** (错误)
const int** <= int**(错误)
int ** <=int * const*(错误)
int * const * <= int ** (正确)

cosnt和二级指针(多级)的结合

int a = 10;
int* p = &a;
int**q = &p;

const int **q; //**q不能赋值
int * const* q; //*q不能赋值
int **const q; //q不能赋值
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洁洁!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值