c++入门(下)

c++入门(下)
目录一、引用的使用1、const的引用2.引用和指针的关系3.inline( 内联函数)4.nullptr我们书接上回一、引用的使用1 引用的本质是用于引用传参和引用做返回值中减少拷贝提高效率改变引用对象的同时也改变被引用对象原对象引用不需要开辟空间2 引用传参和地址传参类似 但是引用传参比较好用如果引用做返回值如果是传值调用的话 那么就是在销毁前找一个临时空间拷贝数据结果就是报错如果我们把引用符号加上就是下面情况 后此时的2变成了3当然是用指针也可以 但是不如引用好用注意越界是不一定报错的。3用c引用传参 目的是为了简化程序1、const的引用可以引用一个const对象但是必须用const引用。const引用也可以引用普通对象因为对象的访 问权限在引用过程中可以缩小但是不能放大。那么如何来写权限的缩小呢大家看看下面的这个是权限放大还是缩小答案都不是 这个是从x中拷贝值存到y中这个也是权限的缩小所谓临时对象就是编译器需要一个空间暂存表达式的求值结果时临时创建的一个未命名的对象 C中把这个未命名对象叫做临时对象 具有常性那么这么为什么会报错呢因为a*3是临时变量 临时变量具有常性 所以加上const 即可2.引用和指针的关系1.指针是变量的地址要开辟空间 引用给变量取别名不用开辟空间2.引用必须初始化 指针建议初始化这里的引用r没法编译成功引用在初始化时引用一个对象后就不能再引用其他对象而指针可以在不断地改变指向对象。• 引用可以直接访问指向对象指针需要解引用才是访问指向对象。• sizeof中含义不同引用结果为引用类型的大小但指针始终是地址空间所占字节个数(32位平台下 占4个字节64位下是8byte)• 指针很容易出现空指针和野指针的问题引用很少出现引用使用起来相对更安全一些。3.inline( 内联函数)1 用inline修饰的函数叫做内联函数编译时C编译器会在调用的地方展开内联函数这样调用内联 函数就需要建立栈帧了就可以提高效率。加了inline编译器也可以选择在调用的地方不展 开不同编译器关于inline什么情况展开各不相同.inline适用于频繁 调用的短小函数对于递归函数代码相对多一些的函数加上inline也会被编译器忽略。C语言实现宏函数也会在预处理时替换展开但是宏函数实现很复杂很容易出错的且不方便调 试C设计了inline目的就是替代C的宏函数。• vs编译器 debug版本下面默认是不展开inline的这样方便调试debug版本想展开需要设置一下 以下两个地方。• inline不建议声明和定义分离到两个文件分离会导致链接错误。因为inline被展开就没有函数地 址链接时会出现报错。那么如何来打开这个开关呢最后我们点应用 即可编译器建议用inline 最终决定权在编译器内联展开会导致可执行程序指令变大4.nullptrC中NULL可能被定义为字面常量0或者C中被定义为无类型指针(void*)的常量。不论采取何种 定义在使用空值的指针时都不可避免的会遇到一些麻烦本想通过f(NULL)调用指针版本的 f(int*)函数但是由于NULL被定义成0调用了f(int x)因此与程序的初衷相悖。f((void*)NULL); 调用会报错。C11中引入nullptrnullptr是一个特殊的关键字nullptr是一种特殊类型的字面量它可以转换 成任意其他类型的指针类型。使用nullptr定义空指针可以避免类型转换的问题因为nullptr只能被 隐式地转换为指针类型而不能被转换为整数类型下面我们来猜一下这个走的哪个你猜对了吗#include iostream #include assert.h using namespace std; int mai3n() { //这里就是权限的缩小 int b 10; int pa b; const int ps pa; cout pa endl; return 0; } void fun(const int pa) { //... } int mai3τn() { //int a 2; //const int rb a * 3; //double a 3.14;//这里的int是临时对象 //int b a; int a 10; const int ps a; double c 12.3; const int pa c;//这里的int也是临时对像 fun(a);//这里传的 权限就相当于权限缩小 fun(ps); fun(c);//这里也是 fun(pa); return 0; } int maier2rn() { int a 10; int ps 10; int ra; int* pa ps; r; *(pa); //cout sizeof(r) endl;//数据类型 //cout sizeof(pa) endl;//64 位 8 字节 return 0; } inline int Add(int x, int y) { return x y; } int mainew() { int x 10; int y 30; int rr Add(x, y); cout rr endl; return 0; } void fun1( int X) { cout fun1(x) endl; //... } void fun1(int* x) { cout fun1(*x) endl; } int main() { fun1(0); //fun1((void)0); fun1(NULL); return 0; }