C++基础【2】-创新互联

目录

创新互联建站2013年开创至今,先为新华等服务建站,新华等地企业,进行企业商务咨询服务。为新华企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

前言

一、引用

1.1 引用的概念

1.2 引用特性

1.3 常引用

1.4 引用传参和引用作返回值

1.5 传值、传引用效率比较

1.6 引用和指针的区别

1.7引用和指针的不同点:

二、auto

2.1 auto简介

2.2 auto使用

1.auto与指针和引用结合起来使用

2. 在同一行定义多个变量

2.3 不能使用auto的场景

总结


前言

auto和引用


提示:以下是本篇文章正文内容,下面案例可供参考

一、引用 1.1 引用的概念

从语法层面来说,引用相当于对一个变量取别名,例如 int a = 10 ; int& b = a;

b就是a的别名,b并没有被定义成一个新的变量,b和a指向同一片地址空间;

1.2 引用特性

引用的三个特性:1.引用在定义时必须初始化

                  2. 一个变量可以有多个引用

3. 引用一旦引用一个实体,再不能引用其他实体

 1.3 常引用
int main()
{
 
	const int a = 10;
	int& b = a;
	int& b = 10; 
	//上两个引用语句在实现时会出现权限的放大(a本身是常量,无法改值,
	//但是被引用后,a的别名b变成了int型,b的改变会同时改变a的值),会在编译阶段报错
	const int& b = a;
	//这样写就不会出现权限冲突
	double d = 12.34;
	int& rd = d;
	//因为在发生隐式类型转换时会产生临时变量,而临时变量是const变量,所以上式也会报错,
	const int& rd = d;
	return 0;
}
1.4 引用传参和引用作返回值
1.作参数   void Swap ( int & left , int & right ) {   int temp = left ;   left = right ;   right = temp ; } 2.作函数返回值 int & Add ( int a , int b ) {     int c = a + b ;    static int c = a+b;     return c ; //因为add函数栈帧在函数运行结束后会被系统收回(大部分编译器都会直接释放) //所以直接返回c的引用,可能只是返回了一个随机值,也有可能返回正确值; //所以在使用引用做返回值时,返回值一般不能是栈上的变量,可以用malloc或者static } int main () {     int & ret = Add ( 1 , 2 );     Add ( 3 , 4 );     cout<< "Add(1, 2) is :"<< ret<< endl ;     return 0 ; }
1.5 传值、传引用效率比较 以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直 接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效 率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。 1.6 引用和指针的区别 在 语法概念上 引用就是一个别名,没有独立空间,和其引用实体共用同一块空间. 但是如果我们去看引用和指针的汇编代码对比,我们会发现在汇编层面实现它们的代码一摸一样
int main () { int a = 10 ; int & ra = a ; ra = 20 ; int* pa = & a ; * pa = 20 ; return 0 ; }

也就是说,指针和引用在底层的实现方式是一样的,但是在语法层的差异巨大。

1.7引用和指针的不同点: 1. 引用概念上定义一个变量的别名,指针存储一个变量地址。 2. 引用 在定义时 必须初始化 ,指针没有要求 3. 引用 在初始化时引用一个实体后,就 不能再引用其他实体 ,而指针可以在任何时候指向任何 一个同类型实体 4. 没有 NULL 引用 ,但有 NULL 指针 5. 在 sizeof 中含义不同 : 引用 结果为 引用类型的大小 ,但 指针 始终是 地址空间所占字节个数 (32 位平台下占 4 个字节 ) 6. 引用自加即引用的实体增加 1,指针自加即指针向后偏移一个类型的大小 7. 有多级指针,但是没有多级引用 8. 访问实体方式不同, 指针需要显式解引用,引用编译器自己处理

9. 引用比指针使用起来相对更安全

二、auto 2.1 auto简介

与早期c中的auto类型符不同,c++中的auto不再是一个存储类型指示符,而是作为一

个新的类型指示符来指示编译器, auto 声明的变量必须由编译器在编译时期推导而得 。 2.2 auto使用 1.auto与指针和引用结合起来使用 用 auto 声明指针类型时,用 auto 和 auto* 没有任何区别,但用 auto 声明引用类型时则必须 加 &
int main () {     int x = 10 ;     auto a = & x ;     auto * b = & x ;     auto & c = x ;     cout<< typeid ( a ). name ()<< endl ;     cout<< typeid ( b ). name ()<< endl ;     cout<< typeid ( c ). name ()<< endl ;     * a = 20 ;     * b = 30 ;     c = 40 ;     return 0 ; }

2. 在同一行定义多个变量 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译 器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量 。
void TestAuto () {     auto a = 1 , b = 2 ;     auto c = 3 , d = 4.0 ;   // 该行代码会编译失败,因为 c 和 d 的初始化表达式类型不同 } // 此处代码编译失败, auto 不能作为形参类型,因为编译器无法对 a 的实际类型进行推导 void TestAuto ( auto a ) {} void TestAuto () {     int a [] = {1 , 2 , 3 };     auto b [] = {4 , 5 , 6 }; }
2.3 不能使用auto的场景 1. auto 不能作为函数的参数 2. auto 不能直接用来声明数组
总结

本文简述了c++中&和auto两个关键字的使用方法和一些特殊情况。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站栏目:C++基础【2】-创新互联
网站URL:http://ybzwz.com/article/cdgdij.html