const int z1 = 5;
const int & giveMeNumber1(){
return z1;
}
int z2 = 6;
const int & giveMeNumber2(){
return z2;
}
int main(){
int y = giveMeNumber1();
}
两个函数的返回类型似乎都是const int
。我对么?如果是,那么我为什么要分配int y = giveMeNumber1();
?
为什么这些函数不会分别返回z1
和z2
的实际地址。我写的时候:
int x = 3; cout << &x << endl;
打印x
变量的地址,所以:
cout << giveMeNumber1() << endl;
也应打印地址(const int & return type
),但会打印5
。
答案 0 :(得分:5)
两个函数的返回类型似乎都是
const int&
。我是对的吗?
没有。两个函数的返回类型是const
。参考int
int y = giveMeNumber1();
。
如果是,那么我为什么要分配
y
?
因为您要复制到const
?您可以将const
对象复制到非const
对象中。 z1
事件无法修改,但复制内容不会修改它。
为什么这些函数不会分别返回
z2
和z1
的实际地址。
因为他们不应该这样做。他们返回对z2
和cout << giveMeNumber1() << endl;
的引用。
const int &
也应打印地址(
const int&
返回类型)
完全废话。您使用的是哪本C ++书?返回类型cout << giveMeNumber1()
(这次至少你说得对)表示引用。引用不是指针或“地址”。我不知道你在哪里得到{{1}}会打印任何地址的概念,但......它不会。
有关详细信息,请重新阅读your C++ book ...这一次,封面以涵盖!
答案 1 :(得分:-1)
- 两个函数的返回类型似乎是const int。我 正确?如果是这样,为什么我能够分配int y = giveMeNumber1();?
醇>
不,你不对。这些函数的返回类型是const int &
。请注意最后的&符号&amp; 。它是 const-reference to int 。
giveMeNumber1()
返回const int &
,它引用整数左值(即z1
)。您不能通过const-reference修改引用的对象(这是const
背后的含义)。但您可以复制该值。那么所发生的是将引用的值复制到y
。
- 为什么这些函数不会分别返回z1和z2的实际地址。
醇>当我写:
int x = 3; cout << &x << endl;
打印x变量的地址,所以:
cout << giveMeNumber1() << endl;
也应打印地址(
const int & return type
),但会打印5。
同样,这些函数会将 const-reference返回给int 。他们不会返回地址。
您似乎对使用&
指针/地址和引用感到困惑。
指针将地址存储到另一个内存位置。所以你可以说他们“指向一个对象”。
引用有点像指针,但它们就像对象本身一样。您只能使用左值初始化它们,不能使用int& ref = 1
这样的文字值初始化引用。
您可以使用引用对原始对象执行的任何操作。但是你无法重新分配引用,一旦它引用了一个你不能改变它的对象,尽管有standard wrappers可以用来克服它。
使用像对象本身一样的引用包括获取其地址。由于函数返回引用,因此您还可以获取引用对象的地址。您可以像这样编写cout
行,
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线就会直接打印地址
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
编辑:编辑以正确解决OP的问题。
答案 2 :(得分:-4)
用于返回z1作为参考
return &z1;
实际上,您将返回由变量z1中包含的值表示的地址。不是内存中z1的地址。
该值很好地融入了一个int。