Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 赋值后,引用和变量之间有实际区别吗?_C++_Variables_Pointers_Reference - Fatal编程技术网

C++ 赋值后,引用和变量之间有实际区别吗?

C++ 赋值后,引用和变量之间有实际区别吗?,c++,variables,pointers,reference,C++,Variables,Pointers,Reference,我的理解是,引用基本上是一个指针,其值不变,并且总是被取消引用。如果我有密码 int& thisIsAReference = someVariable; 然后基本上会创建一个指向someVariable位置的指针,该指针永远不会指向另一个位置,并且总是被取消引用 但这似乎和变量是一样的。据我所知,变量指的是一个特定的内存位置,不能指不同的内存位置,而是隐式指的是某个位置的值,而不是位置本身 那么,除了声明的不同语法之外,thisisaference和someVariable之间有什么区

我的理解是,引用基本上是一个指针,其值不变,并且总是被取消引用。如果我有密码

int& thisIsAReference = someVariable;
然后基本上会创建一个指向
someVariable
位置的指针,该指针永远不会指向另一个位置,并且总是被取消引用

但这似乎和变量是一样的。据我所知,变量指的是一个特定的内存位置,不能指不同的内存位置,而是隐式指的是某个位置的值,而不是位置本身

那么,除了声明的不同语法之外,
thisisaference
someVariable
之间有什么区别吗

那么,除了声明的不同语法之外,
thisisaference
someVariable
之间有什么区别吗

不考虑读取访问的解析值或写入的解析地址

实际上,您可以将
thisIsAReference
视为
someVariable
的别名

然后基本上会创建一个指向
someVariable
位置的指针,该指针永远不会指向另一个位置,并且总是被取消引用

不,这是一个未指定的实现细节,但可以用作思维导图模型

那么,除了声明的不同语法之外,
thisisaference
someVariable
之间有什么区别吗

不考虑读取访问的解析值或写入的解析地址

实际上,您可以将
thisIsAReference
视为
someVariable
的别名

然后基本上会创建一个指向
someVariable
位置的指针,该指针永远不会指向另一个位置,并且总是被取消引用

不,这是一个未指定的实现细节,但可以用作思维导图模型。

之后

int& thisIsAReference = someVariable;
thisareference
someVariable
之间没有区别。引用是一个别名,即每当您编写
someVariable
时,您也可以编写
thisIsAReference
。然而,引用不是“与变量相同的东西”,因为

int thisIsNotAReference = someVariable;
thisIsNotAReference = 20; // someVariable still has the old value
虽然有一个参考

int& thisIsAReference = someVariable;
thisIsAReference = 20;    // now someVariable == 20 
之后

thisareference
someVariable
之间没有区别。引用是一个别名,即每当您编写
someVariable
时,您也可以编写
thisIsAReference
。然而,引用不是“与变量相同的东西”,因为

int thisIsNotAReference = someVariable;
thisIsNotAReference = 20; // someVariable still has the old value
虽然有一个参考

int& thisIsAReference = someVariable;
thisIsAReference = 20;    // now someVariable == 20 

您是对的,变量引用特定位置的值,指针将引用该位置的地址。与指针相反,引用的一个独特之处是,您永远不会有空值。引用必须在创建时初始化,并且一旦初始化就不能更改。与变量相比,这是一个巨大的差异,因为我可以不断地更改变量的值,这就是变量如此有用的原因。

你是对的,变量引用特定位置的值,指针引用该位置的地址。与指针相反,引用的一个独特之处是,您永远不会有空值。引用必须在创建时初始化,并且一旦初始化就不能更改。与变量相比,这是一个巨大的差异,因为我可以不断更改变量的值,这就是变量如此有用的原因。

有一种方法可以区分引用和非引用:当应用于名称时,它将生成该名称声明为具有的类型:

template<typename T>
class foo; //Incomplete type to force compiler error

int main()
{
    int i;        
    int& j = i;

    foo<decltype(i)> x;
    foo<decltype(j)> y;
}
模板
foo类//类型不完整,强制编译器出错
int main()
{
int i;
int&j=i;
富x;
福伊;
}
错误:聚合
foo x
的类型不完整,无法定义
错误:聚合
foo y
的类型不完整,无法定义


有一种方法可以区分引用和非引用:当应用于名称时,它将生成该名称声明为具有的类型:

template<typename T>
class foo; //Incomplete type to force compiler error

int main()
{
    int i;        
    int& j = i;

    foo<decltype(i)> x;
    foo<decltype(j)> y;
}
模板
foo类//类型不完整,强制编译器出错
int main()
{
int i;
int&j=i;
富x;
福伊;
}
错误:聚合
foo x
的类型不完整,无法定义
错误:聚合
foo y
的类型不完整,无法定义


是的,你完全正确。在概念层面上,您可以将引用视为同一变量的另一个名称(如Stroustrup在TC++PL中所说)。另一种方法是:你可以把任何变量想象成一个伪装的引用——这个名称实际上属于这个引用,这个引用绑定到同一个未命名的存储区域

然而,这就是它在概念层面上的样子

实际上,情况可能会大不相同。从实用的角度来看,通常情况下,引用是作为指针在引擎盖下实现的。这意味着通过引用进行访问需要隐式地取消对该指针的引用。这使得引用访问的执行速度比“普通”直接变量访问慢


然而,在许多情况下,编译器可能足够聪明,能够弄清楚引用绑定到什么,并消除指针取消引用,而代之以直接访问目标变量。在这种情况下,上述概念(“引用只是变量的另一个名称”)在实践中得到了充分实现。

是的,您完全正确。在概念层面上,您可以将引用视为同一变量的另一个名称(如Stroustrup在TC++PL中所说)。另一种方法是:你可以把任何变量想象成伪装中的引用-t