![]() |
1
29
因为默认的
编辑:这个答案是回答
问题的一部分。这里的其他答案引用了标准中说你做不到的部分,但这很可能是 为什么? 标准的那一部分是这样写的。 |
![]() |
2
36
首先,应该注意,这与作为 明确地。它实际上是作为成员函数或作为非成员(独立)函数实现复制分配。这个独立的函数是否是一个朋友是完全不相关的:它可能是,也可能不是,这取决于它想在类中访问什么。 现在,这个问题的答案在D&E手册中给出了( The Design and Evolution of C++ ). 原因是编译器总是声明/定义类的成员复制赋值运算符(如果您没有声明自己的成员复制赋值运算符)。 如果该语言还允许将copy assignment operator声明为独立(非成员)函数,那么您可能会得到以下结果
如上面的例子所示,复制赋值的语义将在翻译单元的中间发生变化-在声明独立运算符之前,编译器的版本将被使用。在声明之后,将使用您的版本。程序的行为将根据放置独立副本分配运算符声明的位置而改变。 这被认为是不可接受的危险(它是),所以C++不允许拷贝赋值操作符被声明为独立函数。 确实,在您的特定示例中,碰巧使用 朋友 函数,运算符在类定义中很早就声明了(因为这就是声明friends的方式)。所以,在您的情况下,编译器当然会立即知道您的运算符的存在。然而,从C++语言的角度来看,一般问题与朋友功能无关。从C++语言的观点来看,它是关于成员函数与非成员函数的,并且由于上面描述的原因,完全禁止复制成员的非成员过载。 |
![]() |
3
8
$13.5.3-“赋值运算符应由一个非静态成员函数实现,该函数只有一个参数。 因为如果用户没有声明,则会为类隐式声明copy assignment operator=运算符(12.8),因此派生类的copy assignment operator始终隐藏基类赋值运算符。” |
![]() |
4
7
因为有些运算符必须是成员。这些操作员是:
和类型转换运算符,如
尽管有人可以解释为什么operator=必须是成员,但他们的论点不能应用于列表中的其他人,这使我相信“为什么”的答案是“仅仅因为”。 高温高压 |
![]() |
5
3
|
![]() |
6
1
简短回答: 只是因为 . 稍微长一点的答案是:语法就是这样固定的。几个操作员 必须是成员函数 . 赋值运算符是, |
![]() |
7
0
目的
考虑一个LHS是整数或其他类型的情况。这个案子是由
因此避免了。 |
![]() |
8
0
因为有 已经是“=”的隐式运算符重载函数 在课堂上做 浅拷贝 . 所以即使你使用了一个friend函数 正如我们所做的任何调用都将调用隐式浅复制方法,而不是重载的friend函数。 |
![]() |
9
0
此职位适用于C++ 11
为什么会有人想要一个非会员
因为现在prvalue
但是,在C++ 11中,现在有一种方法指定成员函数只能在LValk上调用,因此通过编写成员函数可以实现相同的目标:
现在,上面带有悬挂引用的代码将无法编译。
注意。
|
![]() |
Noah Wilder · Swift中元组的操作符重载 6 年前 |
![]() |
Salman · 指向具有数组索引运算符重载的类的指针 6 年前 |
![]() |
Nom OnTheCookie · 使用向量重载C++输出 6 年前 |
![]() |
J. Doe · C++重载:从友元函数切换到成员函数 6 年前 |
![]() |
Ana · 使用操作符重载添加存储在vector中的类对象 7 年前 |
![]() |
Matthew · 重载运算符|用于固定大小的阵列? 7 年前 |
![]() |
Martin Žid · 重载运算符+=具有两个类 7 年前 |