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