c++重载赋值操作符的一些疑问?

onlyhuiyi 2013-11-13 04:55:46
大家好
下面这段代码我有点疑问,

class A {
public:
A(int i = 0) {
a = i;
cout << "Consturctor " << a << endl;
}
A(const A&) {
cout << "copy constructor " << endl;
}
A &operator=(const A& ra) {
cout << "= operator " << endl;
return *this;
}
~A() {cout << "Destructor " << a << endl;}
void print(){ cout << a << endl;}
private:
int a;
};

void main()
{
A a1(1), a2(2);
a1 = 5;

}

输出
Consturctor 1
Consturctor 2
Consturctor 5
= operator
Destructor 5

对于上面一段代码 执行到 a1 = 5 时候 为什么会有一个Constructor 5 和Destructor 5
这里a1 已经调用过构造函数了,这次不应该直接调用 operator=吗?
谢谢大家,有点不明白。
...全文
98 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
max_min_ 2013-11-13
  • 打赏
  • 举报
回复
引用 10 楼 onlyhuiyi 的回复:
[quote=引用 9 楼 max_min_ 的回复:] [quote=引用 6 楼 onlyhuiyi 的回复:]

class A {
public:
    explicit A(int i = 0) {
        a = i;
        cout << "Consturctor " << a << endl;
    }
    A(const A&) {
        cout << "copy constructor " <<  endl;
    }
    A &operator=(const A& ra) {
        cout << "= operator " << endl;
        return *this;
    }
    A &operator=(int m) {
        cout << "operator=(int) "<< endl;
        return *this;
    }
    ~A() {cout << "Destructor " << a << endl;}
    void print(){ cout << a << endl;}
private:
    int a;
};

void main()
{
    A a1(1), a2(2);
    a1 = 5;
    a1.print();
    a2 = A(10);
    a2.print();
}
Consturctor 1 Consturctor 2 operator=(int) 1 我好像明白了,重载operator=(const A&) (const A&)会调用 A(int)构造函数
中间有个拷贝的临时对象,用完也就析构了, 楼主可以在析构里加打印出来看看!就明白了![/quote] 哎呀 版主回答的晚了一点点,没看到你的回复呀。。没给上你分。。原谅我。。以后补上[/quote] 没事!问题明白了就好!
onlyhuiyi 2013-11-13
  • 打赏
  • 举报
回复
引用 9 楼 max_min_ 的回复:
[quote=引用 6 楼 onlyhuiyi 的回复:]

class A {
public:
    explicit A(int i = 0) {
        a = i;
        cout << "Consturctor " << a << endl;
    }
    A(const A&) {
        cout << "copy constructor " <<  endl;
    }
    A &operator=(const A& ra) {
        cout << "= operator " << endl;
        return *this;
    }
    A &operator=(int m) {
        cout << "operator=(int) "<< endl;
        return *this;
    }
    ~A() {cout << "Destructor " << a << endl;}
    void print(){ cout << a << endl;}
private:
    int a;
};

void main()
{
    A a1(1), a2(2);
    a1 = 5;
    a1.print();
    a2 = A(10);
    a2.print();
}
Consturctor 1 Consturctor 2 operator=(int) 1 我好像明白了,重载operator=(const A&) (const A&)会调用 A(int)构造函数
中间有个拷贝的临时对象,用完也就析构了, 楼主可以在析构里加打印出来看看!就明白了![/quote] 哎呀 版主回答的晚了一点点,没看到你的回复呀。。没给上你分。。原谅我。。以后补上
max_min_ 2013-11-13
  • 打赏
  • 举报
回复
引用 6 楼 onlyhuiyi 的回复:

class A {
public:
    explicit A(int i = 0) {
        a = i;
        cout << "Consturctor " << a << endl;
    }
    A(const A&) {
        cout << "copy constructor " <<  endl;
    }
    A &operator=(const A& ra) {
        cout << "= operator " << endl;
        return *this;
    }
    A &operator=(int m) {
        cout << "operator=(int) "<< endl;
        return *this;
    }
    ~A() {cout << "Destructor " << a << endl;}
    void print(){ cout << a << endl;}
private:
    int a;
};

void main()
{
    A a1(1), a2(2);
    a1 = 5;
    a1.print();
    a2 = A(10);
    a2.print();
}
Consturctor 1 Consturctor 2 operator=(int) 1 我好像明白了,重载operator=(const A&) (const A&)会调用 A(int)构造函数
中间有个拷贝的临时对象,用完也就析构了, 楼主可以在析构里加打印出来看看!就明白了!
onlyhuiyi 2013-11-13
  • 打赏
  • 举报
回复
揭帖给分 追加分数 ,每人20分
  • 打赏
  • 举报
回复
你赋值的是一个int 而不是一个对象c++可以将一个数值赋给一个对象这么写是没错的,但会生成与一个临时对象,所以会先调用构造函数赋值完成后这个临时对象被释放
onlyhuiyi 2013-11-13
  • 打赏
  • 举报
回复

class A {
public:
    explicit A(int i = 0) {
        a = i;
        cout << "Consturctor " << a << endl;
    }
    A(const A&) {
        cout << "copy constructor " <<  endl;
    }
    A &operator=(const A& ra) {
        cout << "= operator " << endl;
        return *this;
    }
    A &operator=(int m) {
        cout << "operator=(int) "<< endl;
        return *this;
    }
    ~A() {cout << "Destructor " << a << endl;}
    void print(){ cout << a << endl;}
private:
    int a;
};

void main()
{
    A a1(1), a2(2);
    a1 = 5;
    a1.print();
    a2 = A(10);
    a2.print();
}
Consturctor 1 Consturctor 2 operator=(int) 1 我好像明白了,重载operator=(const A&) (const A&)会调用 A(int)构造函数
翅膀又硬了 2013-11-13
  • 打赏
  • 举报
回复
operator=的参数类型是const A& 所以会调用构造函数,构造一个A的对象。 你试试 a1 = a2; 就不会构造、析构了
纯洁的老黄瓜 2013-11-13
  • 打赏
  • 举报
回复
a1 = 5; 这里会调用构造函数将5构造成一个临时A类型变量,然后将这个临时变量赋值(=)给a1.赋值完成后,析构该临时变量。 所以会出现你说的情况。
lunat 2013-11-13
  • 打赏
  • 举报
回复
你的赋值操作符参数类型是const A &,而你用的是5,这里面发生了一个隐式类型转换,5->A。 如果不想发生隐式类型转换: A(int i = 0) 改为 explicit A(int i = 0) a1 = 5; 改为 a1 = A(5);
nightkids_008 2013-11-13
  • 打赏
  • 举报
回复
a1 = 5; 会有个临时对象 A temp(5);用完就扔了
ztenv 版主 2013-11-13
  • 打赏
  • 举报
回复
调用的是构造函数,在构造函数前加上explicit再试试

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧