返回信息流见下面的类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。
我的问题是:为什么没有=运算符函数,也能正常赋值呢?
这是一条镜像帖。来源:北邮人论坛 / cpp / #46202同步于 2010/11/13
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
=运算符重载函数有什么用,没有不是也可以正常赋值么?
starwars
2010/11/13镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
编译器会自动生成一个的,逐个成员赋值,同类对象赋值使用合成的这个赋值运算符就够了,不同类的对象要赋值的话最好自己重载了,自己控制成员怎么赋值。
【 在 starwars 的大作中提到: 】
:
: 见下面的类A,没有对=运算符重载
: class A
: ...................
正解
【 在 awds888 的大作中提到: 】
: 编译器会自动生成一个的,逐个成员赋值,同类对象赋值使用合成的这个赋值运算符就够了,不同类的对象要赋值的话最好自己重载了,自己控制成员怎么赋值。
lz可以继续深入地学习学习C++,带着问题学有动力啊.
【 在 starwars 的大作中提到: 】
:
: 见下面的类A,没有对=运算符重载
: class A
: ...................
这是因为你的类成员是int这类的普通类型。。
如果是指向动态分配内存的pointer之类
直接使用默认的operator=就悲剧了
因为它是member to member的直接copy
在调用destructor会double free~
【 在 starwars 的大作中提到: 】
: 见下面的类A,没有对=运算符重载
: class A
: {
: ...................
#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,因此建议不要使用默认的对象赋值,最好使用自定义赋值
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;
刚刚和同学争重载赋值运算符需不需要返回值的问题。
话说我写的这个类可以用默认的重载=不?需要特别的编译器吗?
5、6和8楼才是正解!明白了!
原来自定义拷贝构造函数和重载=函数是为了应付指针出现,有动态内存分配的情况!
因为对于指针就不能单纯地复制了。
大牛认为我说的对么?