【发布时间】:2017-11-05 20:52:34
【问题描述】:
我正在阅读Stroustrup's 第 4 版:The C++ Programming Language。我有一个python/java 背景,所以到目前为止前 4 章都很好。
在Chapter 3我看到了:
complex& operator+=(complex z) { re+=z.re , im+=z.im; return ∗this; }
开始了一天的尝试写这个问题:
首先我发现它返回的是对对象的引用而不是副本。正如我在question 中确认的那样。
而且我能够理解将引用返回到 reference variable 与来自 question 的常规变量之间的区别
我自己做了试验
class Test {
public:
Test():x{5}{}
int x;
void setX(int a) {x = a;}
Test& operator+=(Test z) {x+=z.x; return *this;}
// the keyword this is a pointer
Test* getTest() {return this;}
// but I can return the reference by *this
Test& getTest1() {return *this;}
// or I can return a copy
Test getTest2() {return *this;}
};
这让我质疑为什么它被称为de-reference,所以我做了这个试验
int x = 8;
int* p = &x;
int y = *p;
int& z = *p;
x++; // let's have some fun
std::cout << y << std::endl;
std::cout << z << std::endl;
正如预期的y = 8 和z = 9,那么de-reference 如何在一种情况下返回address,而在另一种情况下返回value?更重要的是,C++ 是如何做到这一点的?
【问题讨论】:
-
引用可以被认为是一个自动取消引用的指针,但它根本不是一个地址。
-
@iksemyonov 如果不是地址或值,那是什么?
-
@SamHammamy 地址就是一个值。
-
@melpomene 内存中的地址是一个值吗?
-
"首先我发现它返回的是对象的地址而不是副本。" - 不,它正在返回对对象的引用。如果它返回一个地址,则返回类型为
complex*。