返回const int&

时间:2015-10-03 12:16:46

标签: c++

const int z1 = 5;
const int & giveMeNumber1(){
    return z1;
}

int z2 = 6;
const int & giveMeNumber2(){
    return z2;
}

int main(){
    int y = giveMeNumber1();
}
  1. 两个函数的返回类型似乎都是const int。我对么?如果是,那么我为什么要分配int y = giveMeNumber1();

  2. 为什么这些函数不会分别返回z1z2的实际地址。我写的时候:

    int x = 3; cout << &x << endl;
    

    打印x变量的地址,所以:

    cout << giveMeNumber1() << endl;
    

    也应打印地址(const int & return type),但会打印5

3 个答案:

答案 0 :(得分:5)

哇,误解了。好的,让我们看看我们能做些什么。

  

两个函数的返回类型似乎都是const int&。我是对的吗?

没有。两个函数的返回类型是const。参考int int y = giveMeNumber1();

  

如果是,那么我为什么要分配y

因为您要复制到const?您可以将const对象复制到非const对象中。 z1事件无法修改,但复制内容不会修改它。

  

为什么这些函数不会分别返回z2z1的实际地址。

因为他们不应该这样做。他们返回对z2cout << giveMeNumber1() << endl; 的引用。

const int &
     

也应打印地址(const int&返回类型)

完全废话。您使用的是哪本C ++书?返回类型cout << giveMeNumber1()(这次至少你说得对)表示引用。引用不是指针或“地址”。我不知道你在哪里得到{{1}}会打印任何地址的概念,但......它不会。

有关详细信息,请重新阅读your C++ book ...这一次,封面以涵盖

答案 1 :(得分:-1)

  
      
  1. 两个函数的返回类型似乎是const int。我   正确?如果是这样,为什么我能够分配int y = giveMeNumber1();?
  2.   

不,你不对。这些函数的返回类型是const int &。请注意最后的&符号&amp; 。它是 const-reference to int

giveMeNumber1()返回const int &,它引用整数左值(即z1)。您不能通过const-reference修改引用的对象(这是const背后的含义)。但您可以复制该值。那么所发生的是将引用的值复制到y

  
      
  1. 为什么这些函数不会分别返回z1和z2的实际地址。
  2.         

    当我写:

         

    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。