C++ const int&;的返回类型;
这两个函数的返回类型似乎都是C++ const int&;的返回类型;,c++,C++,这两个函数的返回类型似乎都是const int。我说得对吗?如果是这样,那么为什么我能够分配int y=giveMeNumber1() 为什么这些函数不分别返回z1和z2的实际地址。当我写作时: const int z1 = 5; const int & giveMeNumber1(){ return z1; } int z2 = 6; const int & giveMeNumber2(){ return z2; } int main(){ int
const int
。我说得对吗?如果是这样,那么为什么我能够分配int y=giveMeNumber1()代码>
为什么这些函数不分别返回z1
和z2
的实际地址。当我写作时:
const int z1 = 5;
const int & giveMeNumber1(){
return z1;
}
int z2 = 6;
const int & giveMeNumber2(){
return z2;
}
int main(){
int y = giveMeNumber1();
}
也应该打印地址(const int&return type
),但它会打印5
哇,这些误解。好吧,让我们看看我们能做些什么
这两个函数的返回类型似乎都是const int
。我说得对吗
否。两个函数的返回类型都是const int&
。参考const
int
如果是这样,那么为什么我能够分配int y=giveMeNumber1()代码>
因为您正在复制到y
?您可以将const
对象复制到非const
对象中。常量
对象不能修改,但复制对象不会修改它
为什么这些函数不分别返回z1
和z2
的实际地址
因为他们不应该这么做。它们返回对z1
和z2
的引用
cout
这两个函数的返回类型似乎都是const int
对的如果是这样,那么为什么我能够分配int y=giveMeNumber1()李>
不,你错了。这些函数的返回类型是const int&
。请注意结尾处的符号和。它是对int的常量引用
giveMeNumber1()。不能通过常量引用修改引用的对象(这是此处const
的含义)。但您可以复制该值。因此,所发生的情况是,引用值被复制到y
为什么这些函数不分别返回z1和z2的实际地址
当我写作时:
const int z1 = 5;
const int & giveMeNumber1(){
return z1;
}
int z2 = 6;
const int & giveMeNumber2(){
return z2;
}
int main(){
int y = giveMeNumber1();
}
intx=3;cout用于返回z1作为参考
int x = 16;
int* p = &x; // Pointer p initialized with the address of x
int& r = x; // r is a reference to x
const int& cr = x; // const reference to x
std::cout << x << std::endl; // x's value = 16
std::cout << &x << std::endl; // x's address
std::cout << p << std::endl; // p's value = address of x
std::cout << *p << std::endl; // int value that's in the address pointed to by p == x == 16
std::cout << &p << std::endl; // p´s address (p is a variable as well)
std::cout << r << std::endl; // x's value = 16
std::cout << &r << std::endl; // x's address (you can't get the address of the reference itself)
r = 2; // r is a reference of x, so now x = 2
cr = 2; // This won't do, you can't assign to a const reference
int y = r; // Ok, copying the value in x, 2, to y
int z = cr; // Ok, copying 2 to z
实际上,您正在返回由变量z1中包含的值表示的地址。不是内存中z1的地址
这个值将很好地塞进一个int中。部分混淆可能是因为int常量&
(或者const int&
,没有区别)是一个非常无用的东西,并且几乎总是可以被简单的int
替换。常量引用与“大”数据类型相关,例如std::string
或std::vector
&z1
生成一个指针,该指针不能作为int常量返回&
。“现实”中发生的是编译器实现细节,与C++语言语义无关。最后,如果你做了&z1
,那么不管变量中包含什么值,你都会得到z1
变量的地址。显然,这是可以实际完成的,因为我以前做过,他现在正在做。但结果不正确。这个建议与参考资料无关。此外,您对指针的描述是错误的。哦,假设所有指针都在int
s中也是错误的。我不知道这是如何回答这个问题的,尽管有一个大的绿色记号。您只是重复了一本关于指针和引用语法的非常简短的书,没有做太多的工作来解决问题中显示的更基本的误解。此外,在书写类型时,将星号和符号左对齐也不会使你丧命,因为这将使区别变得清晰。@Lightness Race Sinorbit我也不知道为什么我的答案被接受。别怪我。实际上,我自己写了“代码”。我修复了缩进,您已经解决了您在回答中提到的这些问题。我没有什么要补充的。我不是在“责备”任何人,我只是在提出我的批评,就像我对任何问题的任何回答那样。不幸的是,您误读/误解了我关于校准的建议。@Lightness Race Sinorbit我希望这次校准是正确的。谢谢你的建议。他们不会“回复地址”。本,你知道,不要传播对引用语义和C++抽象的有害的几十年的误解!它们确实返回地址,您可以通过打印表达式的地址来确定地址。这种困惑来自于认为使用不能的operator@BenVoigt:否,引用不是地址。函数返回引用,而不是地址。被引用者的地址和,呃,被引用者的地址相同是不相关的。返回引用会将地址信息传递给调用方。“返回值”不是地址,而是返回的地址。@BenVoigt:你可以这样说,从函数返回的每个值。这使它成为一个空洞的陈述,在这个特殊的例子中,是一个危险的误导性陈述。如果没有别的,有一个很好的原因,C++抽象出实现细节,那么为什么我们现在放弃它,当它最有害的时候这样做?关于引用和指针的误解已经够多了,在这个问题上肯定是这样(否,当原语按值返回时,返回过程中没有传输地址信息。无法
cout << giveMeNumber1() << endl;
cout << &giveMeNumber1() << endl; // The & here gets the address of the left value
// returned by the function.
// The returned type is a "pointer to const int", note the *
const int* giveMeNumber1() {
return &z1;
}
cout << giveMeNumber1() << endl;
cout << *giveMeNumber1() << endl;
int x = 16;
int* p = &x; // Pointer p initialized with the address of x
int& r = x; // r is a reference to x
const int& cr = x; // const reference to x
std::cout << x << std::endl; // x's value = 16
std::cout << &x << std::endl; // x's address
std::cout << p << std::endl; // p's value = address of x
std::cout << *p << std::endl; // int value that's in the address pointed to by p == x == 16
std::cout << &p << std::endl; // p´s address (p is a variable as well)
std::cout << r << std::endl; // x's value = 16
std::cout << &r << std::endl; // x's address (you can't get the address of the reference itself)
r = 2; // r is a reference of x, so now x = 2
cr = 2; // This won't do, you can't assign to a const reference
int y = r; // Ok, copying the value in x, 2, to y
int z = cr; // Ok, copying 2 to z
return &z1;