
- 常引用
- 标识符&引用名=目标变量名
- 外文名
- reference
- 参 数
- 传递可变参数
- 中文名
- C++引用
- 解 释
- 引用引入了对象
-
C++引用
2017-04-12 14:59:35 -
C++ —— C++引用
2016-09-26 08:57:52C++ 引用 一、普通引用 【变量名】 变量名实质上是一段连续存储空间的别名,是一个标号 程序中通过变量来申请并...1、引用是C++的概念 // 问题:C中可以编译通过吗? int main(void) { int a = 0; int &b= a; //inC++引用
一、普通引用
【变量名】
变量名实质上是一段连续存储空间的别名,是一个标号
程序中通过变量来申请并命名内存空间
通过变量的名字可以使用存储空间
问题1:对一段连续的内存空间只能取一个别名吗?【不是】
1、引用是C++的概念
// 问题:C中可以编译通过吗?
int main(void) { int a = 0; int &b= a; //int * const b = &a b=11;//*b = 11; return 0; }
// gcc编译结果
// 错误: expected identifier or ‘(’ before ‘&’token
//‘b’未声明(在此函数内第一次使用)
// 结论:请不要用C的语法考虑 b=11
2、引用概念
(1)在C++中新增加了引用的概念
(2)引用可以看作一个已定义变量的别名
(3)引用的语法:Type& name = var;
(4)引用做函数参数?(引用作为函数参数声明时不进行初始化)
int main(void) { int a = 1; int &b = a; //b是a的别名,请问c++编译器后面做了什么工作? b = 5; cout<< "b--->"<< a << endl; return 0; }
【普通引用在声明时必须用其它的变量进行初始化】
3、引用的意义
(1)引用作为其它变量的别名而存在,因此在一些场合可以代替指针
(2)引用相对于指针来说具有更好的可读性和实用性
void swap(int &a, int &b) { int t = a; a = b; b = t; } void swap(int*a, int *b) { int t = *a; *a = *b; *b = t; }
4、普通引用有自己的空间吗?
#include <stdio.h> struct stu { int &a; int &b; }; int main(void) { printf("sizeof(stu) =%d\n", sizeof(stu)); return 0; } // 8
【引用是一个有地址,引用是常量(char *const p)】
5、引用的本质
(1)引用在C++中的内部实现是一个常指针
Type&name çèType*const name
(2)C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。
(3)从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏
6、引用注意点
(1)当函数返回值为引用时
若返回栈变量
不能成为其它引用的初始值
不能作为左值使用
(2)若返回静态变量或全局变量
可以成为其他引用的初始值
即可作为右值使用,也可作为左值使用
【当实参传给形参引用的时候,只不过是c++编译器帮我们程序员手工取了一个实参地址,传给了形参引用(常量指针)】
二、常引用
1、const引用(使用变量初始化)
【const在C中是只读变量,在C++中是常量】
const Type& name = var;【const引用让变量拥有只读属性】
#include <iostream> using namespace std; int main(void) { int a = 2; const int &b = a; b= 3; cout<< a << b << &a << &b << endl; return 0; }
// 错误:向只读形参‘b’赋值
2、const引用(使用字符常量初始化)
(1)用变量对const引用初始化,const引用分配内存空间了吗?
(2)用常量对const引用初始化,const引用分配内存空间了吗?
#include <iostream> using namespace std; int main(void) { const int &a = 10; int *p = (int *)&a; *p = 12; cout << a<< endl; return 0; }
//当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将//引用名作为这段空间的别名
//使用常量对const引用初始化后将生成一个只读变量
const&相当于const int *const a;
三、引用与指针有什么区别
(1) 引用必须被初始化,指针不必。
(2) 引用初始化以后不能被改变,指针可以改变所指的对象。
(3) 不存在指向空值的引用,但是存在指向空值的指针。
-
C++引用折叠
2017-07-11 15:09:55C++引用折叠左值引用和右值引用作为参数表示方式分别为:
template <class T> void f(T&); template <class T> void f(T&&);
在调用函数f的时候,我们可能传入一个左值,也可能传入一个右值。
由于存在T&&这种未定的引用类型,当它作为参数时,有可能被一个左值引用或者右值引用的参数初始化,这时候经过类型推导的T&&类型相比右值引用会发生变化。
具体规则是:
1.所有右值引用折叠到右值引用上仍然是一个右值引用。(A&& && 变成 A&&)
2.所有的其他引用类型之间的折叠都将变成左值引用。 (A& & 变成 A&; A& && 变成 A&; A&& & 变成 A&) -
C++引用以及结构体
2019-03-04 23:00:55C++引用 引用在C++编程中极为实用。 函数的参数是属于局部变量,如果想要修改传入的参数,那就要用到指针。 在C++中,还可以使用“引用”。引用不会产生副本,相当于给原来的变量又取了个别名,二者其实都是指...C++引用
- 引用在C++编程中极为实用。
函数的参数是属于局部变量,如果想要修改传入的参数,那就要用到指针。
在C++中,还可以使用“引用”。引用不会产生副本,相当于给原来的变量又取了个别名,二者其实都是指同一个东西,且对引用变量的操作就是对原变量的操作。
引用的使用方法很简单,只需要在函数的参数类型后面加个&就可以了(或者&加在变量前面即可)。
输出:#include <iostream> using namespace std; int main() { int a = 10; cout << a << endl; int &b = a; b = 23; cout << a << endl; return 0; }
可见,程序中对a的引用b的操作,也是对变量a的操作。10 23
注意:
要把引用的&跟取地址运算符&区分开来,引用并不是取地址的意思。 - 指针的引用
在指针相关一文中提到的swap(),还可以通过将传入的地址交换来达到交换两个变量的效果。使用引用可以达到这种操作,如下:#include <iostream> using namespace std; //将 int* 型变量的引用作为参数, //相当于对原int*变量的操作 void swap(int* &p1,int* &p2){ int *temp = p1; p1 = p2; p2 = temp; } int main() { int a = 10,b = 23; int *p1 = &a,*p2 = &b; //p1 p2为指针变量,存放a b的地址 cout << *p1 << " " << *p2 << endl; swap(p1,p2);//函数参数为a b的地址,类型为int* cout << *p1 << " " << *p2 << endl; return 0; }
为了理解上的方便,可以“简单”地把int*型理解成unsigned int型,而直接交换这样的两个整型变量是需要加引用的。10 23 23 10
注意:
引用是产生变量的别名,因此常量不可使用引用。于是上面的代码中不可以写成swap(&a,&b),而必须用指针变量pl和p2存放&a和&b,然后把指针变量作为参数传入。
另外,如果想要深入了解引用,我推荐一篇文章:https://blog.csdn.net/JayRoxis/article/details/73060770 作者总结的比较用心。
结构体
-
结构体定义
可以将若干不同数据类型的数据封装在一起,可以用来储存复合数据。可以将若干不同数据类型的数据封装在一起,可以用来储存复合数据。struct Name{ //自定义的数据结构 };
struct person{ char name[10]; char gender; int age; }; person Jhon,Harry,students[10];
struct person{ char name[10]; char gender; int age; }Jhon,Harry,students[10]; //Jhon,Harry为结构体变量,students[10]为结构体数组变量
struct person{ char name[10]; char gender; int age; person* father;//结构体内可以定义结构体本身的指针类型的指针变量 }Jhon,Harry,students[10]; //Jhon,Harry为结构体变量,students[10]为结构体数组变量
-
访问结构体中的元素
方式一:
Jhon.name Jhon.gender Jhon.age
方式二:
Jhon->name Jhon->gender Jhon->age
-
结构体初始化
使用构造函数初始化#include <iostream> #include <string.h> using namespace std; struct person{ char name[10]; char gender; int age; person(char* name_,char gender_,int age_){ strcpy(name,name_); gender = gender_; age = age_;} }; int main() { person a("green",'F',20); cout << a.name << " " << a.gender << " " << a.age << endl; return 0; }
在创建时,自行初始化
#include <iostream> #include <string.h> using namespace std; struct person{ char name[10]; char gender; int age; }; int main() { person a; strcpy(a.name,"white"); a.gender = 'M'; a.age = 21; cout << a.name << " " << a.gender << " " << a.age << endl; return 0; }
- 引用在C++编程中极为实用。
-
C++引用类型
2016-05-06 20:03:08C++引用类型 说到引用,先来讲一个故事:我们生活的院子里有这样一个小盆友,他的名字叫罗XX,我们喜欢给他起一个外号,看着他营养不太好,脑袋比较大、身子比较小,于是我们就给他起了一个叫“萝卜头”的外号。那么... -
C/C++ 引用作为函数的返回值
2018-08-04 13:19:481.引用作为函数的返回值时,必须在定义函数时在函数名前将& 2.用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本 //代码来源:RUNOOB #include<iostream> using namespace ... -
C++引用传递基础
2018-11-26 16:39:31C++引用传递基础 引用变量:相当于是给变量内存块(内存单元)起别名 例如: 这里,我们存放整形变量10的内存单元名字为a,我们用过int &b = a; 让这个叫a的内存块有另外一个名字为b,从这里开始,a和b都... -
C++ 引用及vector用法
2019-07-24 14:50:00C++ vector容器对象头文件引用写法及特性vector容器对象 ...//C++引用 #include<iostream> #include<string> using namespace std; int main() { int ival = 10; int &refV... -
C++ 引用 参数传递 机制
2016-02-29 23:21:04本文主要分析C++引用赋值和引用参数传递的案例。 关于多开GDB,手懒把所有程序都编译成a.out的注意了,gdb中,不确定已经读取文件正在执行过程中会不会产生干扰。至少一次运行结束后,原来断点什么的就不存在了,... -
C++引用详解
2019-05-03 22:47:13在C++中一个很大的特色就是引用了,可以省去我们很多时间去操作复杂的指针,从使用角度,我们可以无脑的把引用当作一个变量的别名~ 1、引用概念 在C++中新增加了引用的概念 引用可以看作一个已定义变量的别名 ... -
c++引用与指针的区别
2019-01-31 20:09:02c++引用与指针的区别 ★ 相同点: 1. 都是地址的概念; 指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。 指针的权威定义: In a declaration T D where D has the form * cv-... -
C++引用形参的好处
2017-10-15 19:55:21C++引用的好处,其实最基本的就是不会产生过多的内存拷贝。比如下述情况 // 普通形参。调用f_b时,对于参数产生了多份内存拷贝 void f_b( T param) { f_c(T param); }void f_c(T param) { f_d(T param); }... -
C++ 引用与引用作为函数的参数
2017-03-05 15:49:20对一个数据建立一个“引用”,他的作用是为一个变量起一个别名。这是C++对C语言的一个重要补充。 -
C++ 引用变量
2017-04-03 11:08:55C++新增了一种复合类型--引用变量。引用是已定义变量的别名,使用引用变量的主要的用途是作为函数的参数。通过将引用变量用作参数,函数将使用原始数据,而不是副本。这样除指针之外,引用也为函数处理大型结构提供... -
C++引用优于指针
2009-10-26 09:27:00C++引用优于指针(转载请注明来源于金庆的专栏)在KOK3服务器的崩溃错误中, 十有八九是由空指针引起的.在C语言中, 空指针确实是错误的一大来源, 到处是空指针判断, 可还是会有漏网的.在C++中, 空指针错误可以大大... -
C++ 引用的本质
2015-07-08 16:33:22引用是C++引入的重要机制,它使原来在C中必须用指针实现的功能有了另一种实现的选择,在书写形式上更为简洁。那么引用的本质是什么,它与指针又有什么关系呢? -
c++引用的特点
2020-08-24 01:26:411.将“引用”作为函数参数有哪些特点? (1)传递引用给函数与传递指针的效果是一样的。 (2)使用引用传递函数的参数,在内存中并没有产生是实参的副本,它是直接对实参操作 (3)使用指针作为函数的参数虽然也能达到... -
c++引用参数
2018-08-10 20:33:56C++中参数的传递方式: 1.值传递 调用时,将实参的值传递对应的形参,即为值传递。由于形参有自己独立的存储空间,又作为函数的局部变量使用,因此在函数中对任何形参值得修改都不会改变实参变量的值。简单的... -
c++引用有没有存储空间?
2018-01-31 10:46:44c++引用有没有存储空间? 问题来自于引用与指针的区别有哪些? 答案: 1、引用定义的时候必须初始化,不能为空,也就是说必须和某对象绑定,且不能易主。但是指针可以为NULL,也可以想指谁指谁(所以他事儿多,... -
C++ 引用类型
2017-04-13 21:50:48引用类型:可以获得指针... 可以是除了void以外的任意C++类型。 如: int x=0; int &y=x;y=2;//此时x也是2 2. 引用类型 VS 指针类型 1)二者访问语法不同,指针是 * ,引用是 2)引用类型除了定义时指定 -
C++ 引用的作用和用法
2012-11-29 20:12:43【导读】介绍C++引用的基本概念,通过详细的应用分析与说明,对引用进行全面、透彻地阐述 引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确、灵活地使用引用,可以使程序简洁、高效。 引用... -
C++引用与const引用
2007-07-04 17:34:00C++引用与const引用(1)在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用.int ival = 1092;int &re = ... -
C++引用与指针
2019-03-20 21:55:12C++语法定义引用变量 引用类型 &引用变量名=被引用变量名 语法说明 引用类型是引用变量的数据类型,必须与被引用变量的类型一致; **&**是引用变量说明符。定义变量语句中,变量名前加“&”表示该变量... -
C++ 引用 什么是引用?
2019-04-15 02:00:36先举几个栗子:“及时雨”宋江、“卧龙”诸葛亮...概念:引用是为已存在的变量取了一个别名,引用和引用的变量共用同一块内存空间 格式:类型& 引用变量名(对象名) = 引用实体; int& ra = a; ra为a的引用 ... -
C++ 引用计数技术简介(1)
2016-01-31 11:21:261.引用计数的作用C++引用计数是C++为弥补没有垃圾回收机制而提出的内存管理的一个方法和技巧,它允许多个拥有共同值的对象共享同一个对象实体。C++的引用计数作为内存管理的方法和技术手段主要有一下两个作用。 ... -
C++ 引用计数器
2016-12-14 17:16:56今天讲一个实用的东西,C++类的引用计数,不废话直接上代码;#ifdef WIN32 #include #else #include <atomic> #endif using namespace std; class CCRefCounter { public: CCRefCounter(); ~CCRefCounter(){}; /... -
C++引用及常引用
2016-08-18 20:44:58一、变量的引用: 引用:就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。 引用的声明方法:类型标识符 &引用名=目标变量名; 例:char ch; char &rp=ch; 1)引用仅是...