一.变量的初始化
对于c++来说,变量的初始化可以有这几种
1.int a = 10;
2.int b(10);
3.int c{ 10 };
不过用{}初始化时会有更严格的要求,
对于h来说,编译器只会报警告,而对于i来说,则会报出错误,不让它编译通过。
甚至数组和常指针也可以这样初始化。
4.int d = int (10);
5.int e = int{ 10 }
甚至可以这样
不过要注意的是,在变量已经定义好之后,不能这样赋值
二.引用
1.语法上
引用,其实就是给变量起的别名,编译器并不会给它开辟空间。
2. 本质上
让我们来看看引用的本质,
通过看汇编我们可以发现引用,在底层实际也是个指针
这行代码相当于
int * const b =&a;
3.引用要注意的点
1.没有空引用
2.定义的引用必须初始化
没有初始化的话,它会直接报错。
3.没有引用的引用
4.引用一旦引用一个实体,就不能引用其他实体
让我们来看这段代码,
假如说引用引用一个实体之后,可以引用其他实体的话,那么它是重新引用了b呐?还是用20去修改a的值? 所以这样就出现了二义性。
4. 常引用
常引用引用常变量
当变量是常变量时,只有常引用才能引用
主观上,当你不想这个变量被修改时,也可以用常引用引用它
常引用是一个万能引用
它可以引用各种变量,甚至常量10,而对于 const int & f=10,它实际是开辟了一个临时量,把10赋值给这个临时量,然后f指向的是这个临时量的地址(上面我们不是说了吗,引用的本质就是一个指针)
5.引用的其他用法
1.指针的引用
2.数组的引用
那么现在思考一个问题,可以写一个存有5个引用的数组吗?
因为我们之前说过,引用就是给变量起的别名,并不实际开辟空间,而要用一个数组,存放5个引用,那不是就矛盾了吗。
6.不可以把局部变量以引用返回
虽然它没有报错,不过,它是一种极为危险的操作。
让我们接下来往下看
temp的地址为0x007efb30
此时它是我标红的这一块空间,
当我们接下来继续向下执行,我们会发现,它把这块非法空间有给修改了(此时fun的栈帧已经被释放,这块空间已经还给系统了),这是非常危险的行为,会和野指针带来同样的危险(本质都是和野指针一样的,都操作了不属于它的空间)
三.内联函数
1.使用内联函数的原因
当函数过于简单,为函数现场保护和现场恢复消耗的资源大于直接执行这个函数时,我们就可以使用内联函数。
2.visual stdio中配置环境
但是当我们加了inlne之后,我们发现,还是会调用add这个函数。
在visual stdio上应进行这样的配置
1.
2.
配置完之后就可以了。
此时我们发现,它不会再调用这个函数了
3.多文件时使用inlne要注意的问题
当你想一下,内联函数本来就是没有函数体的,当编译器编译时,先在A.h中找,发现它是内联函数,你把函数的定义写在A.cpp中也没有用,所以我们应该把申明和定义都写在.h文件中
4.内联函数与宏的区别
1.宏是在预处理时展开
2.内联函数是在编译时展开
四.缺省函数
为了更方便的使用函数,我们可以在定义函数时为形参指定缺省值(默认值)
使用实例如下
1.缺省值只能从右向左依次给
这样的话就会报错
2.传参数的时候只能从左往右依次传
不能像这样想着把1传给a,让b使用默认值,把3传给c,把4传给4
3.当使用缺省函数时,尽量把默认值写在函数的申明中
当编译的时候,编译器会直接找fun的声名,而在.h文件中,声名中并没有给参数默认值,所以它会报错。
而当定义和声名在同一个.cpp文件中的话就可以,不过我还是建议把缺省参数写在申明中
尽管这样也可以
4.缺省的参数不一定是常量,也可以是表达式
那是getNum这个函数先执行还是getPInt这个函数先执行?
让我们依次执行代码
我们可以发现,它是先从右往左执行的。
5.不可以把左边参数的默认值赋值给右边的参数
这样会报错
😐 后续我还会更新c++的内容,未完待续-----