#include <iostream>
class Bar
{
protected:
public:
int & x;
Bar(int & new_x)
:x(new_x)
{}
Bar & operator = (const Bar toCopy)
{
x = toCopy.x;
return *this;
}
};
int main()
{
int x1(1);
int x2(2);
Bar bar = Bar(x1);
std::cout << bar.x << std::endl;
bar = Bar(x2);
std::cout << bar.x << std::endl;
bar.x = 5;
std::cout << bar.x << std::endl;
std::cout << x1 << std::endl;
std::cout << x2 << std::endl;
}
输出是:
1
2
5
5
2
我想做的是复制 x
并将其保存在对象bar
中。
输出向我表明赋值运算符在复制和获取新对象的值方面都没有发挥它的魔力。我关注了this link .
将 x
更改为值而不是引用是不可能的,因为在实际程序中 x
是一个抽象类。
请尽可能避免使用堆分配。
编辑: 1. 我意识到我刚刚屠杀了 C++ 语言。我想向所有使用“C++ian”的计算机道歉。我的动机是在堆栈上分配一个成员抽象变量。据我了解,它不能在堆栈上完成,因为在编译时不知道派生类的大小。 2. 好吧...我完全是 n00b...(不,Sherlock!)。 “有效的 C++ 编程”@rhalbersma 是必备的。它包含必需品,但您不会在任何地方找到它们(复制构造、复制初始化器),..无论如何都在一个地方。
最佳答案
引用可能会造成混淆。 const
指针也可以。我会尝试通过同时谈论它们来澄清事情。我能说什么,我是一个乐观主义者。
首先,const
指针。
我们将从名为 Foo
的类开始。我们可以有一个指向这个类的指针——Foo*
。我们可以有一个指向此类的 const
实例的指针——Foo const*
。我们可以有一个指向此类的非 const
实例的 const
指针 -- Foo*const
。
Foo const*
是一个您可以更改为您无法更改的数据的指针。
Foo*const
是一个您无法更改的指向您可以更改的数据的指针。
我假设你明白了。毕竟,我是一个乐观主义者。接下来,让我们看看引用资料。
虽然引用确实是别名,但有时在事物根据其他类型具有具体实现的世界中思考它们会有所帮助。
Foo&
类似于 Foo*const
-- 一个不可更改的“指针”,指向您可以更改的 Foo
实例.所以你所说的 Foo
总是同一个,但你可以改变它的状态。
现在,它远不止于此。有一些语法糖。当您创建对另一个变量的引用时,它会自动执行 &
- 因此当您执行 Foo& f = a;
时,这类似于 Foo* const f = &a;
.
其次,当您使用 .
时,它的作用与指针情况下的 ->
相同。 (对于(大多数?)其他运营商也是如此)
第三,当你进行赋值时,它显然不能改变指针的值——因为它是const
——而是改变指向的东西的值。所以 Foo& f = a; a = b;
相当于 Foo*const f = &a; *f = b;
.
当您使用 operator=
时,它将指向 的东西分配给,而不是指针。但是当你初始化它时,它不使用 operator=
,即使你有一个 =
标记。
初始化与一般的赋值不同,&
引用和 *
指针在初始化和赋值中发生的语义非常不同。
Foo& f = a; f = b;
做了两件完全不同的事情。引用的初始化会初始化“const
指针”部分——对引用的赋值会修改指向的内容。
关于初始化和赋值与引用的不同含义,我个人的名字是“引用语义”,而不是“指针语义”,在“指针语义”中,初始化和赋值都会改变所指向的东西。在“引用语义”中,初始化选择被指向的事物,赋值改变被指向事物的状态。
这非常令人困惑,我希望我以不同的方式帮助它变得困惑。
关于c++ - 为非静态引用成员类写入 `operator=`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14340552/