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的哪个部分属于哪个?
答案 0 :(得分:3)
由于您通过值将参数传递给print
函数,因此必须使用复制构造函数进行复制。这就是调用print
时调用复制构造函数的原因。
如果您更改为要引用(或通过传递指针),则不会进行复制。
正如其他人所说,print
是一个“正常”函数,也称为“自由”函数,或非成员函数。它“属于”该程序,并存在于全局范围中并且具有external linkage。
答案 1 :(得分:1)
打印isn't a method, it's a function,因为它不属于&#34;任何地方 - 它只是您计划的一部分。 功能是从面向对象之前的时代开始的,虽然仍然有重要的地位。
void print(A c)
功能可细分如下:
void
,这是返回值,在这种情况下 - 没有。 print(
,这是函数的名称。 A c)
,这意味着需要一个
单个parameter 类型 A,名为 c。因此A::A(const A &)
是对象A的 copy constructor ;基本上这个方法将被称为每次将类型A的对象复制到类型A的新对象
当您致电print(*c)
时,您derefrence指针c
,这会导致c
对指向的对象的引用(即: A
类型的对象。然后将 copy construct 复制到print
函数中,从而生成函数使用的临时const A &
。
这就是调用Copy-constructor的原因。