注册 登录
编程论坛 C++教室

=号操作符重载

ml232528 发布于 2010-04-06 11:48, 676 次点击
#include <iostream>
using std::cout;
using std::endl;

class base
{
public:
    int a;
    base & operator= (base const & a);
    base(){}
    base(base & a)
    {
        this->a=a.a+1;
        cout<<this->a<<"复制构造函数调用"<<endl;      
    }
};
base &base::operator =(base const &a)
{
    this->a=a.a+1;
    cout<<this->a<<"赋值函数调用"<<endl;
    return *this;
}

int _tmain(int argc, _TCHAR* argv[])
{
    base b1;
    b1.a=5;
    base b2=b1;
    getchar();
    return 0;
}


1 结果显示 6复制构造函数调用 问为什么不调用赋值函数
2 赋值函数可以定义为   void 类名::operator =(类名 const &) 吗?
4 回复
#2
yyblackyy2010-04-06 12:40
看这一题首先要明白那些地方用到复制构造函数:
1:给对象初始化赋值 调用复制构造函数 比如 : A a(b);  A为类或其他  a,b 为A的对象 给a赋初值
2:传递参数的时候 调用复制构造函数          function(A a){.......}
3: 返回的时候 调用复制构造函数              A function(){ A a; ........ return a;}
在有用户自定义的复制构造函数时候优先使用,若没有,则考虑赋值函数,比如:
把 复制构造函数注释掉,则程序将调用赋值函数
****************************
void 类名::operator =(类名 const &) 当然可以了,若你不想表示成 连续赋值的形式,  比如: A a,b,c;  a=b=c;  若你是想表示成连续赋值的形式 则因该返回引用
#3
ml2325282010-04-06 13:15
感谢楼上的回答

把 复制构造函数注释掉,则程序将调用赋值函数
好像这个程序  复制构造函数注释掉 也没调用赋值函数
是不是赋值函数定义有问题
#4
yyblackyy2010-04-06 13:35
int _tmain(int argc, _TCHAR* argv[])
{
    base b1;
    b1.a=5;
    base b2=b1;       看,你这里是“初始化”b2不是简单的赋值,所以不会调用赋值的那个函数
                        楼主只要改成  base b2;  b2=b1; 试试
    getchar();
    return 0;
}
#5
ml2325282010-04-06 13:42
谢谢 结贴
1