Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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++ const int&;的返回类型;_C++ - Fatal编程技术网

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;