请问C++中的引用符号到底怎么使用

2020-11-23 19:38:02 字数 5999 阅读 9993

1楼:匿名用户

按照 c 语言比较优雅的「声明模仿使用」规则:

int foo; // foo 是 int,所以 foo 的类型是 intint *foo; // *foo 是 int,所以 foo 的类型是 int 指针int foo[42]; // foo[42] 是 int,所以 foo 的类型是 int 数组int foo(); // foo() 是 int,所以 foo 的类型是返回 int 的函数

那么 c++ 的「引用」呢:

int ?foo?; // 怎样的「?foo? 是 int」,才能让 foo 是一个对 int 的引用呢?

按照「声明模仿使用」的规则,我们应该参考「如何使用引用」,但是坑爹的是,int 引用的用法实际上和 int 没什么两样:

int foo;int& ref = foo;foo = 4; // 使用 intref = 2; // 使用 int 引用

所以理论上,如果按照 c 语言的规则,引用的声明方法应该是:

int ref; // error: 瞎子都看得出来的歧义

所以,c 语言的传统声明规则已经没法解决 c++ 的引用该如何声明的问题了。此时问题就变成了:如何在尽可能遵守 c 语言规则的前提下,把 c++ 的引用声明出来?

那么回到 c 语言,你会发现:

a pointer type may be derived from a function type, an object type, or an in***plete

type, called the referenced type. a pointer type describes an object whose value

provides a reference to an entity of the referenced type.

以上引用自 c99 §6.2.5/20,歌词大意是:

可以从若干中类型中推导出「指针类型」,指针类型所指向的类型称作「被引用类型」。指针类型的作用为「提供被引用类型对象的引用」。你看,c 语言里也有「引用」的概念,这也是为什么我们常把「*p」读作「将 p 解除引用」。

有了这样的背景情报,既然 * 是「解除引用」,那么用来取地址的 & 就可以理解为「进行引用」。所以,如果一定要从 c 语言的资产中找一个符号来区分「int」和「int 引用」,那么最直观的显然是 & 无误了。

请问c++中的引用符号“&”到底怎么使用?

2楼:苑

c++中的引用符号“&”的使用方法是,类型标识符 &引用名=目标变量名。

c++是c语言的继承,它可进行过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。引用(reference)就是c++对c语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。

3楼:西西哩的小马甲

引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。

引用的声明方法:类型标识符 &引用名=目标变量名;

【例1】:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名 ;

说明:(1)&在此不是求地址运算,而是起标识作用。

(2)类型标识符是指目标变量的类型。

(3)声明引用时,必须同时对其进行初始化。

(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。ra=1; 等价于 a=1;

(5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。

故:对引用求地址,就是对目标变量求地址。&ra与&a相等。

(6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。

4楼:匿名用户

引用是c++引入的新语言特性,是c++常用的一个重要内容之一,正确、灵活地使用引用,可以使程序简洁、高效。

引用简介

引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。

引用的声明方法:类型标识符 &引用名=目标变量名;

【例1】:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名

说明:(1)&在此不是求地址运算,而是起标识作用。

(2)类型标识符是指目标变量的类型。

(3)声明引用时,必须同时对其进行初始化。

(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。

ra=1; 等价于 a=1;

(5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。

&ra与&a相等。

(6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。

引用应用

1、引用作为参数

引用的一个重要作用就是作为函数的参数。以前的c语言中函数参数传递是值传递,如果有大块数据作为参数传递的时候,采用的方案往往是指针,因为这样可以避免将整块数据全部压栈,可以提高程序的效率。但是现在(c++中)又增加了一种同样有效率的选择(在某些特殊情况下又是必须的选择),就是引用。

【例2】:

void swap(int &p1, int &p2) //此处函数的形参p1, p2都是引用

为在程序中调用该函数,则相应的主调函数的调用点处,直接以变量作为实参进行调用即可,而不需要实参变量有任何的特殊要求。如:对应上面定义的swap函数,相应的主调函数可写为:

main( )

float &fn2(float r) //定义函数fn2,它以引用方式返回函数值

void main() //主函数

} (5)在另外的一些操作符中,却千万不能返回引用:+-*/ 四则运算符。它们不能返回引用,effective c++[1]的item23详细的讨论了这个问题。

主要原因是这四个操作符没有side effect,因此,它们必须构造一个对象作为返回值,可选的方案包括:返回一个对象、返回一个局部变量的引用,返回一个new分配的对象的引用、返回一个静态对象引用。根据前面提到的引用作为返回值的三个规则,第2、3两个方案都被否决了。

静态对象的引用又因为((a+b) == (c+d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。

4、引用和多态

引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。

【例7】:

class a;

class b:public a;

b b;

a &ref = b; // 用派生类对象初始化基类对象的引用

ref 只能用来访问派生类对象中从基类继承下来的成员,是基类引用指向派生类。如果a类中定义有虚函数,并且在b类中重写了这个虚函数,就可以通过ref产生多态效果。

引用总结

(1)在引用的使用中,单纯给某个变量取个别名是毫无意义的,引用的目的主要用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问题。

(2)用引用传递函数的参数,能保证参数传递中不产生副本,提高传递的效率,且通过const的使用,保证了引用传递的安全性。

(3)引用与指针的区别是,指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。

(4)使用引用的时机。流操作符《和》、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。

5楼:匿名用户

int x=5;

int &p=x; // p指向了x用于函数的传址参数, int test(int &m, int n)

m是传址,n是传值

6楼:匿名用户

取地址符,比如有个变量a。&a就是说a在内存的地址

请问c++中的引用符号“&”到底怎么使用?

7楼:匿名用户

引用是c++引入的新语言特性,是c++常用的一个重要内容之一,正确、灵活地使用引用,可以使程式简洁、高效。

引用简介

引用就是某一变数(目标)的一个别名,对引用的操作与对变数直接操作完全一样。

引用的声明方法:类型识别字 &引用名=目标变数名;

【例1】:int a; int &ra=a; //定义引用ra,它是变数a的引用,即别名

说明:(1)&在此不是求位址运算,而是起标识作用。

(2)类型识别字是指目标变数的类型。

(3)声明引用时,必须同时对其进行初始化。

(4)引用声明完毕後,相当於目标变数名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变数名的别名。

ra=1; 等价於 a=1;

(5)声明一个引用,不是新定义了一个变数,它只表示该引用名是目标变数名的一个别名,它本身不是一种资料类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求位址,就是对目标变数求位址。

&ra与&a相等。

(6)不能建立阵列的引用。因为阵列是一个由若干个元素所组成的集合,所以无法建立一个阵列的别名。

引用应用

1、引用作为参数

引用的一个重要作用就是作为函数的参数。以前的c语言中函数参数传递是值传递,如果有大块资料作为参数传递的时候,采用的方案往往是指标,因为这样可以避免将整块资料全部压栈,可以提高程式的效率。但是现在(c++中)又增加了一种同样有效率的选择(在某些特殊情况下又是必须的选择),就是引用。

【例2】:

void swap(int &p1, int &p2) //此处函数的形参p1, p2都是引用

为在程式中调用该函数,则相应的主调函数的调用点处,直接以变数作为实参进行调用即可,而不需要实参变数有任何的特殊要求。如:对应上面定义的swap函数,相应的主调函数可写为:

main( )

float &fn2(float r) //定义函数fn2,它以引用方式返回函数值

void main() //主函数

} (5)在另外的一些操作符中,却千万不能返回引用:+-*/ 四则运算符。它们不能返回引用,effective c++[1]的item23详细的讨论了这个问题。

主要原因是这四个操作符没有side effect,因此,它们必须构造一个物件作为返回值,可选的方案包括:返回一个物件、返回一个区域变数的引用,返回一个new分配的物件的引用、返回一个静态物件引用。根据前面提到的引用作为返回值的三个规则,第2、3两个方案都被否决了。

静态物件的引用又因为((a+b) == (c+d))会永远为true而导致错误。所以可选的只剩下返回一个物件了。

4、引用和多态

引用是除指标外另一个可以产生多态效果的手段。这意味著,一个基类的引用可以指向它的派生类实例。

【例7】:

class a;

class b:public a;

b b;

a &ref = b; // 用派生类物件初始化基类物件的引用

ref 只能用来访问派生类物件中从基类继承下来的成员,是基类引用指向派生类。如果a类中定义有虚函数,并且在b类中重写了这个虚函数,就可以通过ref产生多态效果。

引用总结

(1)在引用的使用中,单纯给某个变数取个别名是毫无意义的,引用的目的主要用於在函数参数传递中,解决大块资料或物件的传递效率和空间不如意的问题。

(2)用引用传递函数的参数,能保证参数传递中不产生副本,提高传递的效率,且通过const的使用,保证了引用传递的安全性。

(3)引用与指标的区别是,指标通过某个指标变数指向一个物件後,对它所指向的变数间接操作。程式中使用指标,程式的可读性差;而引用本身就是目标变数的别名,对引用的操作就是对目标变数的操作。

(4)使用引用的时机。流操作符《和》、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。

C++中《符号什么意思,C++ <<符号的意思

1楼 笨笨 重定向,《和》是表示输出的方向,cout 这是定向到标准输出,而如果是ofstream file file x 这则表示定向到文件里面。 2楼 兔子和小强 流操作符 或 移位运算符 左移 3楼 匿名用户 数据流输出的方向 cin 输入 cout《输出 4楼 匿名用户 在cout 中是输出...

C++中,关于NEW关键字的使用

1楼 水煮的肉片 1 前者在堆栈中分配内存,后者为动态内存分配,在一般应用中是没有什么区别的,但动态内存分配会使对象的可控性增强。 2 不加new在堆栈中分配内存 3 大程序用new,小程序直接申请 4 只是把对象分配在堆栈内存中 5 new必须delete删除,不用new系统会自动 内存 2楼 匿...

请问在c++中是什么运算符,请问c++中的"^"运算符是什么运算符.

1楼 匿名用户 和c是一样的,先对所有的数据转换成二进制, 如果对应位有一个为1,则该位为1, 是两个全为1,则为1,否则为0, 代表两位相同的话则为0,否则为1 则4 6 100 110 110, 5 7 101 111 101 8 9 1000 1001 0001 2楼 傲世修罗王 是位运算符,...