C ++中引用变量的简要定义是什么?
答案 0 :(得分:19)
引用是另一个对象的别名实体。
引用不是变量,因为变量仅由对象的声明引入。 对象是一个存储区域,在C ++中,引用不会(必然)占用任何存储空间。
由于对象和引用是C ++中不同的实体组,因此术语“引用变量”没有意义。
答案 1 :(得分:14)
引用变量为先前定义的变量提供别名(替代名称)。 例如:
float total=100;
float &sum = total;
这意味着total
和sum
都是相同的变量。
cout<< total;
cout << sum;
两者都会给出相同的值100
。这里&
运算符不是地址运算符; float &
表示对float的引用。
答案 2 :(得分:10)
答案 3 :(得分:6)
Wikipedia article的第一段可以很容易地作为一个简短的定义:
在C ++编程语言中,引用是一种简单的引用数据类型,它比从C继承的指针类型更强大但更安全。
引用同一篇文章:
C ++引用在几个基本方面与指针不同:
定义后无法直接引用参考对象;任何出现的名称都直接引用它引用的对象。
创建引用后,以后无法引用其他对象;它不能重新安置。这通常用指针完成。
引用不能为null,而指针可以为;每个引用都指某个对象,尽管它可能有效也可能无效。
参考文献不能未初始化。由于无法重新初始化引用,因此必须在创建引用后立即初始化它们。特别是,必须在定义它们的地方初始化局部变量和全局变量,并且必须在类的构造函数的初始化列表中初始化作为类实例的数据成员的引用。
进一步阅读:
答案 4 :(得分:3)
答案 5 :(得分:3)
C ++引用允许您为变量创建第二个名称,您可以使用该名称来读取或修改存储在该变量中的原始数据
更多详情访问:
答案 6 :(得分:3)
参考变量是变量名称的别名。
它与以下方式的指针不同:
答案 7 :(得分:2)
引用变量允许两个变量名称来寻址相同的内存位置:
int main()
{
int var1;
// var2 is a reference variable, holds same value as var1
int &var2 = var1;
var1 = 10;
std::cout << "var1 = " << var1 << std::endl;
std::cout << "var2 = " << var2 << std::endl;
}
资源:LINK
答案 8 :(得分:1)
引用是另一个标签,一个别名,用于初始化它的对象。初始化引用后,不能将其更改为其他对象的替代标签或别名。在初始化之后,引用或对象变量可以互换使用。
引用具有指向对象的const指针的一些特征,因为它在定义时被初始化。虽然它引用或指向的内容可以更改,但引用或const指针本身不能更改。但是,由于引用是替代标签或别名,它可能或可能不实际作为数据对象存在,这与const指针不同,const指针可能存在,除非编译器可以将其优化掉。即使编译器将引用创建为实际实体,也就是编译器内务处理,应该忽略它,因为它正式不存在,就像翡翠城幕后的人一样。
以下代码示例给出了与指针和const指针进行比较和对比的示例:
int myInt; // create a variable of type int, value not initialized
int myInt2 = 3; // create a second variable of type int with a value of 3
int &rInt = myInt; // create a reference to the variable of type int, myInt
rInt = 5; // myInt now has a value of 5, the reference is an alias for myInt
rInt++; // myInt now has a value of 6, the reference is an alias for myInt
rInt = myInt2; // myInt now has the same value as myInt2, a value of 3
int *pInt = &rInt; // pInt points to myInt
(*pInt)++; // increments myInt
pInt++; // increments the pointer which formerly pointed to myInt
int &rInt2; // error C2530: 'rInt2' : references must be initialized
int *pInt2; // just fine, uninitialized pointer is ok
int * const pInt3; // error C2734: 'pInt3' : const object must be initialized if not extern
int * const pInt4 = &myInt; // define and initialize const pointer
pInt4 = &myInt2; // error C3892: 'pInt4' : you cannot assign to a variable that is const
实际上有两种引用:lvalue
引用和rvalue
引用。
lvalue
引用与C ++ 11之前的C ++语言中的引用相同。在C ++ 11中引入了rvalue
引用,以允许引用临时对象来帮助执行移动而不是复制以及其他一些操作,其中副本是错误的方法但是移动是正确的方法
例如,在以下简单源代码行中对左值引用和右值引用进行比较。因为这些是int
引用,这意味着赋值非整数值会导致编译器执行转换,从而产生临时变量。 rvalue
引用可以绑定到临时变量,而lvalue
引用则不能。
// assign a double to an int causing creation of temporary
int &rIntd1 = 1.2; // error C2440: 'initializing' : cannot convert from 'double' to 'int &'
int &&rIntd2 = 1.2; // warning C4244: 'initializing' : conversion from 'double' to 'int', possible loss of data
rInt = rIntd2; // myInt from the code above now has a value of 1, 1.2 was truncated when converting from double to int
答案 9 :(得分:0)
引用变量和指针变量与机器完全相同(编译器将生成相同的机器代码)。
在我的知识中使用引用变量而不是指针变量的最明显优势:
在下面的代码中,左侧使用引用变量,右侧使用指针变量。它们对于机器来说是一样的,但是你看到使用引用变量可以节省一些输入。
Reference variable Pointer variable
int a = 1; ~~~~~~ int a = 1;
int &b = a; ~~~~~~ int *b = &a;
b = 2; ~~~~~~ *b = 2;
cout << a << '\n' ~~~~~~ cout << a << '\n'
==============================================
2 ~~~~~~ 2
答案 10 :(得分:0)
引用变量(let a
),只是为了便于理解,另一个变量名称(let x
),它与x
保持相同的内存位置。
int &a = x;
表示a与x
保持相同的内存位置。
例如,假设两个室友共用同一个房间。一个朋友的姓名是x
,另一个朋友的姓名是a
。如果a
更改了放置在会议室中的桌子的位置,从位置(x,y,z)
到(x1,y1,z1)
,则对朋友x
也可以看到更改,反之亦然。
答案 11 :(得分:0)
引用是对象的替代名称。引用变量为先前定义的变量提供别名。参考声明由基本类型和&amp;组成。引用变量等同于变量名。
答案 12 :(得分:0)
Page 79~80 C ++ Primer 5th ed。
对象:具有类型
的内存区域变量:命名对象或引用
参考:另一个对象的别名。