网站建设推广刘贺稳1,公司网站网络营销是什么,广州 济南网站建设公司 网络服务,厦门网站建设模拟一、引用
1、基本概念与定义
引用不是新定义一个变量#xff0c;而是给已存在的变量起一个别名#xff0c;编译器不会为引用变量开辟内存空间#xff0c;它和它所引用的变量公用同一块内存空间#xff1b;
引用的写法#xff1a;变量类型 引用别名 变量#xff…一、引用
1、基本概念与定义
引用不是新定义一个变量而是给已存在的变量起一个别名编译器不会为引用变量开辟内存空间它和它所引用的变量公用同一块内存空间
引用的写法变量类型 引用别名 变量 ###代码示例
#includeiostream
using namespace std;int main()
{int a 10;int b a;//b是a的别名cout a的地址 a endl;cout 别名b的地址 b endl;cout a的值 a endl;cout b的值 b endl;a;cout a的值 a endl;cout b的值 b endl;b;cout a的值 a endl;cout b的值 b endl;return 0;
} 别名b和a公用一块内存地址改变ab也改变改变ba也改变
2、引用的特性
1引用在定义的时候必须初始化
2一个实体可以被多次引用即一个变量可以有多个别名
3引用一旦引用一个实体就不能再去引用其他的实体。 ###代码示例
不初始化就会报错
反例 一个实体可以有多个别名对别名起别名实际上就是对那个实体再起一个别名
int main()
{int a 10;int b a;int c a;int d b;cout a的地址 a endl;cout 别名b的地址 b endl;cout 别名c的地址 b endl;cout 别名d的地址 b endl;return 0;
} 引用只能对一个实体引用
反例 3、引用的使用
1引用作为形参当传实参地址时让函数的形参为实参的别名而不是指针类型的形参这样可以简化代码量在改变引用变量时别实体也会发生改变
###代码示例
void Swap(int x, int y)
{int tmp x;x y;y tmp;
}
int main()
{int a 10;int b 30;cout 交换之前的 a a endl;cout 交换之前的 b b endl;Swap(a, b);cout 交换之后的 a a endl;cout 交换之后的 b b endl;
} 可以看到不使用指针作为形参也能让实参发生改变
2引用作为函数的返回值一般的返回值都是在内存的临时开辟再拷贝的使用引用作为返回值可以提高效率更重要的一点是可以在改变引用对象的同时改变被引用的对象
###代码示例
int Func(int x)
{return x;
}
int main()
{int a 10;int b 200;Func(a) b;cout a的值 a endl;
} 当返回类型是别名时Funca实际上就是a的别名给这个别名赋值200那么a的值也会改变 4、const引用
1对一个const对象引用时必须要用const引用的类型对一个非const对象引用时可以用const引用也可以不用这里涉及到访问权限放大和缩小的问题通过代码来介绍
###代码说明 这是因为const int a的访问权限是只读也就是a的值不能被修改但是写成int xax是a的别名但是int x前面没有const这样写有这个意思x是的值可以被改变 那就和a不能修改相悖了因为x、a是共用一块空间
若是这样写那么就把a的访问权限放大了由只读变为可读可写这样是不允许的
要这样写才对 当用const int去给一个非const对象起别名时却是可以的此时原本可读可写的访问权限变为只读这里是访问权限的缩小当然缩小的访问权限只是别名不会影响到原本的对象
###代码示例 虽然x被const限定了但是可以通过改变a来改变x反过来就不行了。
可以这样理解int a 10; 是先写的那么就默认了a可以改变的事实之后写const int x只是x不能被修改但是a之前就默认了可以修改。 2 下面几种等号右边的式子都具有常性是不能被修改的若是给它们起非const的别名那么就是访问权限被放大了是不行的
###代码示例
反例
##1、 30是一个常量具有常性这样给它起别名那么30的访问空间由只读变为可读可写了显然是不行的
正确的写法 ##2、 ab看似是一个等式但是ab的值会保存在一个临时对象中实际上传给ry的时这个临时对象临时对象的性质是具有常性常性表示是不能被修改的 正确写法 ##3、
同样地在涉及到隐式类型转换时也会给等号右边地值建立一个临时对象而临时对象具有常性
###代码示例
用int 类型的去给double的变量起别名double类型的变量会隐式转换类型转换之后的是一个临时对象临时对象是在内存上重新开辟的且具有常性 正确写法 5、指针和引用的关系
指针和引用在C中相辅相成在不同的场景具有不同的优势两者配合使用
1引用不需要开辟空间但是指针存储一个变量的地址需要开辟空间
2引用只能对一个变量起别名但是指针可以改变指向指向多个不同的变量
3引用在使用时必须初始化但是指针没有强制规定是否要初始化
4引用在使用时直接用指针需要解引用
5指针的大小与平台有关而引用的大小是被引用对象的大小
6指针在使用时由解引用空指针和野指针的问题出现风险相对引用较大 二、内联函数inline
在函数名前面加上inline就是内联函数内联函数在调用函数的地方直接展开函数不需要像一般调用函数那样需要开辟函数栈帧。这样一来提高了效率
内联函数主要是和宏函数相比宏函数也不需要开辟函数栈帧直接展开之后替换但是和内联函数相比宏函数相对很容易出错所以这也是内联函数的优势
举几个宏函数易出错的示例 但是使用函数就可以避免这些因为实参的石式子会在传参时就完成在进入函数内部时已经成了一个值
内联函数多使用在调用很多次短小函数的场景首先相比于宏函数内联函数不易出错相较于普通函数内联函数不需要开辟函数栈帧调用了很多次只需要展开一次就好了汇编中会有一个call指令展开函数时只需要展开一次之后再调用这个函数时call指令会直接使用展开好的指令在函数定义代码量很多时展开就不是那么好了
所以说内联函数用在多次调用短小函数的地方。
三、nullptr
NULL实际上是一个宏在传统的C头文件stddef.h中有
#ifndef NULL#ifdef __cplusplus#define NULL 0#else#define NULL ((void *)0)#endif
#endif
在C中NULL被定义为常量 0 或者C中被定义为无类型指针void*的常量无论哪种定义在调用空值的指针时都会遇到不可避免地麻烦
所以在C中引入了关键字nullptr它可以转换成任意一种类型的指针。