2012-01-13 53 views
2

这里是我的代码:为什么我不得不在C++中重载赋值运算符?

class Example { 
...declarations/definitions... 
}; 

Example operator + (Example e) 
{ 
Example temp; 
...do addition... 
return temp; 
} 

//main 
void main() 
{ 
Example a(1,2); 
Example b(3,4); 
Example c; 
c = a+b; 
} 

现在是什么让我困惑的是,我不得不超负荷+运营商为它与向量工作,但如何对等于“=”号?我正在分配一个向量到另一个,我不应该超载吗?还是它已经提供给我们? 谢谢。

+2

该定义看起来像一元'+'算子,而不是加法。 – Pubby 2012-01-13 18:56:35

+0

@Azza,关闭,但不完全。它分配每个成员,但不是按位。此外,编译器会自动创建默认构造函数,析构函数,移动构造函数和移动赋值运算符。 – 2012-01-13 18:58:23

回答

4

语言自动提供一个默认的operator=你,如果你的类是自动分配(例如,如果它通过你有任何引用成员也不会分配,但不特殊的工作)。它所做的只是分别指定基础和每个成员。

3

wikipedia page

缺省版本[的赋值运算符]执行成员复制,其中每个构件通过其自身的拷贝赋值运算符复制(其也可以是程序员声明或反编译生成)。

+0

英文?我知道你在说什么,但其他人可能不会。 – ThatOtherPerson 2012-01-13 18:56:03

+2

呃?它出什么问题了? – 2012-01-13 18:57:03

+0

@ThatOtherPerson如果我见过任何人,那就是英文。 – 2012-01-13 18:59:10

0

A std::vector?如果是这样,默认情况下,std::vector实现赋值运算符。从手册页:

“分配向量x的副本作为矢量对象的新内容

包含在调用之前的向量的元素被丢弃,并通过向量x的拷贝替换。 ,如果有的话

对这个成员函数的调用之后,矢量对象和矢量x将具有相同的大小并且彼此相等。

编辑 - 这些天我要先提交一个答案!

1

赋值运算符默认情况下与复制构造函数和默认构造函数一起提供。它将每个数据成员的值分配给其他对象中相应的数据成员(即浅拷贝)。

2

如果您没有在您的类中声明复制赋值运算符,则会为您隐式声明一个(如果您曾经使用它,则隐式定义)。

如果可能,隐式运算符将分配对象的每个成员;否则(如果某个成员是引用,或const,或者有私有或删除的复制赋值操作符),则会发生编译错误。

同样,如果你没有声明一个拷贝构造函数,那么你会得到一个隐式的,它将复制每个成员。您的代码正在使用operator+中的代码来复制参数和返回值。