BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #46202同步于 2010/11/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

=运算符重载函数有什么用,没有不是也可以正常赋值么?

starwars
2010/11/13镜像同步12 回复
见下面的类A,没有对=运算符重载 class A { public: int a1; int a2; int a3; int a4; }; int main() { A object1; object1.a1=10; object1.a2=20; object1.a3=30; object1.a4=40; A object2 ; //关键就在这点,你看没有对=进行重载,赋值照样可以顺利进行 object2=object1; system("pause"); } 当然对=运算法重载可以定制一些特定的赋值效果,例如赋值时候每个值多加个10。 我的问题是:为什么没有=运算符函数,也能正常赋值呢?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
awds888机器人#1 · 2010/11/13
编译器会自动生成一个的,逐个成员赋值,同类对象赋值使用合成的这个赋值运算符就够了,不同类的对象要赋值的话最好自己重载了,自己控制成员怎么赋值。 【 在 starwars 的大作中提到: 】 : : 见下面的类A,没有对=运算符重载 : class A : ...................
nevermadao机器人#2 · 2010/11/13
本来就没说一定得重载=。
ki机器人#3 · 2010/11/13
正解 【 在 awds888 的大作中提到: 】 : 编译器会自动生成一个的,逐个成员赋值,同类对象赋值使用合成的这个赋值运算符就够了,不同类的对象要赋值的话最好自己重载了,自己控制成员怎么赋值。
kmplayer机器人#4 · 2010/11/13
lz可以继续深入地学习学习C++,带着问题学有动力啊. 【 在 starwars 的大作中提到: 】 : : 见下面的类A,没有对=运算符重载 : class A : ...................
guo机器人#5 · 2010/11/13
这是因为你的类成员是int这类的普通类型。。 如果是指向动态分配内存的pointer之类 直接使用默认的operator=就悲剧了 因为它是member to member的直接copy 在调用destructor会double free~ 【 在 starwars 的大作中提到: 】 : 见下面的类A,没有对=运算符重载 : class A : { : ...................
dodolzg机器人#6 · 2010/11/13
#include "stdafx.h" #include <iostream> using namespace std; class A { public: int a1; int *a2; //修改 int a3; int a4; }; int main() { A object1; object1.a1=10; object1.a2=&object1.a1; object1.a3=30; object1.a4=40; A object2; object2=object1; *(object2.a2)+=1; cout<<object1.a1<<endl; cout<<object2.a1<<endl; return 0; } 可以验证这样object2的a2指向的是object1的a1,并非object2的a1,因此建议不要使用默认的对象赋值,最好使用自定义赋值
liuaner022机器人#7 · 2010/11/13
typedef class CProduction { protected: string left_nonterminal_symbol; string right_symbol_set[11]; public: CProduction() {} void Set_Left_Nonterminal_Symbol(string a_symbol) { left_nonterminal_symbol = a_symbol; } void Set_Right_Symbol_Set(string *a_symbol_set) { int i; for(i=0;a_symbol_set[i]!="$";i++) right_symbol_set[i] = a_symbol_set[i]; right_symbol_set[i] = "$"; } string Get_Left_Nonterminal_Symbol() { return left_nonterminal_symbol; } string* Get_Right_Symbol_Set() { return right_symbol_set; } void operator = (CProduction a_production) { string *temp; temp = a_production.Get_Right_Symbol_Set(); left_nonterminal_symbol = a_production.Get_Left_Nonterminal_Symbol(); int i; for(i=0;temp[i]!="$";i++) right_symbol_set[i] = temp[i]; right_symbol_set[i] = "$"; } }production; 刚刚和同学争重载赋值运算符需不需要返回值的问题。 话说我写的这个类可以用默认的重载=不?需要特别的编译器吗?
wks机器人#8 · 2010/11/13
深拷贝,浅拷贝
starwars机器人#9 · 2010/11/14
5、6和8楼才是正解!明白了! 原来自定义拷贝构造函数和重载=函数是为了应付指针出现,有动态内存分配的情况! 因为对于指针就不能单纯地复制了。 大牛认为我说的对么?