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

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

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

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

最佳答案

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

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


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

关于c++ - 为什么以及何时执行重载构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36175331/

相关文章:

c++ - 在 OpenCV 2.x (C++) 中设置屏幕原点

java - 第一个Java程序: Random data in my Array?

Groovy 中的动态方法调用

c++ - 将数组动态分配到具有指针参数的函数中

pointers - Go的指针何时取消引用自己

ruby-on-rails - API 和 Rails - 最好的方法

java - 为什么我看到两个河豚实现之间存在不一致?

c++ - char == char 是否将两个操作数隐式转换为 int?

c++ - mingw32/bin/ld.exe…对[class]的 undefined reference …collect2.exe:错误:ld返回1退出状态

C++,用一个字节存储两个变量