为什么以及何时执行重载构造函数?

Why and when is the overload constructor executed?

class A {
public:
    A(void) { cout << "A::A" << endl; }
    A(const A& a) { cout << "A::A(a)" << endl; }
    virtual ~A(void) { cout << "A::~A" << endl; }
    virtual void g(void) { cout << "A::g" << endl; }
};

class B : public A {
public:
    B(void) { cout << "B::B" << endl; }
    ~B(void) { cout << "B::~B" << endl; }
    void g(void){ cout << "B::g" << endl; }
};

void print(A c) {
    cout << "print" << endl;
}

int main(void) {
    A a;
    B b;
    A* c = &b;
    c->g();
    print(*c);
    return 0;
}

我不明白为什么在调用 c->g()print(*c);

时会执行此语句 A::A(a)

而且我不太确定方法打印属于程序的哪一部分?

由于您按值将参数传递给 print 函数,因此必须使用复制构造函数进行复制。这就是为什么在调用 print 时调用复制构造函数的原因。

如果您更改为调用 be reference(或通过传递指针),则不会进行复制。


并且正如其他人所说,print 是一个 "normal" 函数,也称为 "free" 函数,或非成员函数。它 "belongs" 到程序,并且存在于 全局范围 并且有 external linkage.

打印 isn't a method, it's a function,因此它不会 "belong" 任何地方 - 它只是您程序的一部分。 函数来自面向对象之前的时代,但仍然占有重要地位。

void print(A c)函数可以分解如下:

  1. void,这是 return 值,在本例中 - 没有。
  2. print(,这是函数名。
  3. A c),这意味着需要一个 type A 的单个 parameternamed c.

因此A::A(const A &)是对象A的copy constructor;本质上,每次将 A 类型的对象复制到 A 类型的新对象中时,都会调用此方法

当您调用 print(*c) 时,您 derefrence 指针 c,这导致对 指向 的对象的引用 =16=](即:类型为 A的对象)。然后将构造的复制到print函数中,导致函数使用的临时const A &

这就是调用复制构造函数的原因。