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

时间:2016-03-23 10:16:06

标签: c++ pointers methods call constructor-overloading

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;
}

我不明白为什么在调用A::A(a)c->g()

时执行此语句print(*c);

我不太确定Method print的哪个部分属于哪个?

2 个答案:

答案 0 :(得分:3)

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

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

正如其他人所说,print是一个“正常”函数,也称为“自由”函数,或非成员函数。它“属于”该程序,并存在于全局范围中并且具有external linkage

答案 1 :(得分:1)

打印isn't a method, it's a function,因为它不属于&#34;任何地方 - 它只是您计划的一部分。 功能是从面向对象之前的时代开始的,虽然仍然有重要的地位。

void print(A c)功能可细分如下:

  1. void,这是返回值,在这种情况下 - 没有。
  2. print(,这是函数的名称。
  3. A c),这意味着需要一个 单个parameter 类型 A,名为 c。
  4. 因此A::A(const A &)是对象A的 copy constructor ;基本上这个方法将被称为每次将类型A的对象复制到类型A的新对象

    当您致电print(*c)时,您derefrence指针c,这会导致c指向的对象的引用(即: A类型的对象。然后将 copy construct 复制到print函数中,从而生成函数使用的临时const A &

    这就是调用Copy-constructor的原因。