0
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);

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

4

2 回答 2

3

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

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


正如其他人所说,print是“正常”函数,也称为“自由”函数,或非成员函数。它“属于”程序,存在于全局范围内并具有外部联系

于 2016-03-23T10:23:30.203 回答
1

Print不是一种方法,它是一个函数,因此它不“属于”任何地方——它只是你程序的一部分。函数来自面向对象之前的时代,尽管仍然占有重要地位。

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

  1. void,这是返回值,在这种情况下 - 什么都没有。
  2. print(,这是函数的名称。
  3. A c),这意味着它将接受一个名为c的类型A的单个参数。

同样A::A(const A &)是对象 A 的复制构造函数本质上,每次将 A 类型的对象复制到 A 类型的新对象时都会调用此方法

当您调用 时print(*c),您取消引用指针c,这将导致对所指向的对象的引用c(即:类型的对象 A)。然后将其复制构造print函数中,从而产生函数使用的临时const A &变量。

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

于 2016-03-23T10:30:19.837 回答