c++ - 用于赋值的参数化构造函数

标签 c++ oop c++11

我注意到参数化构造函数中有一些我无法理解的行为。给定以下程序:

#include <iostream>
using namespace std;

class A {
public:
    int x;

    A() {}

    A(int i) : x(i){
        cout << "A\n";
    }
    ~A(){
        cout << "dA\n";
    }

};

int main(){
    A p;
    p = 3;
    cout << p.x << endl;
    p = 5;
    cout << p.x << endl;
    return 0;
}

我得到的输出是:

A
dA
3
A
dA
5
dA

这意味着使用 = 会触发参数化构造函数,销毁调用它的对象并创建一个新对象。 我无法理解这种行为,也无法在标准中找到答案(我确定它在某处,但可能会以复杂的方式说明)。谁能帮我解释一下?

最佳答案

您可能正在寻找的短语是“隐式转换”。

如果你添加一个复制构造函数和一个赋值运算符,然后给每个对象一个唯一的 ID,就更容易看出事情的进展:

int counter = 0;

class A {
public:
    int id;

    A(): id(++counter) {cout << "A(): " << id << "\n";}

    A(int i) : id(++counter) {cout << "A(" << i << "): " << id << "\n";}

    // Don't copy the id.
    // (This isn't used anywhere, but you can't see that it's not used unless it exists.)
    A(const A& a) : id(++counter) {cout << "A(" << a.id << "): " << id << "\n";}

    // Don't copy the id here either.
    A& operator=(const A&a) {cout << id << " = " << a.id << "\n"; return *this;}

    ~A(){cout << "destroy: " << id << "\n";}
};

int main(){
    A p;
    cout << "p is " << p.id << "\n";
    p = 3;
    cout << "p is " << p.id << "\n";    
    p = 5;
    cout << p.id << "\n";
}

输出:

A(): 1
p is 1
A(3): 2
1 = 2
destroy: 2
p is 1
A(5): 3
1 = 3
destroy: 3
1
destroy: 1

如您所见,参数化构造函数用于创建一个临时对象,该对象的值可以分配给p,并且该临时对象会在之后立即销毁。
您还可以看到 p 一直活到最后。

关于c++ - 用于赋值的参数化构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50738907/

相关文章:

c++ - 为什么这个 vector 声明无效?

c++ - 什么 shared_ptr 策略用于异步方案?

Java:URL 还是字符串?

oop - 如何向必须实现所需初始值设定项的子类添加所需属性?

c++ - libstdc++ 中从哪个版本的 std::regex 可用

c++ - Qt定时器问题

c++ - 中止、终止或退出?

java - 关于Java类的问题

c++ - 设置几个模板参数的值

c++ - 没有数据成员的C++中的派生类问题