为什么以及何时执行重载构造函数?
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)
函数可以分解如下:
void
,这是 return 值,在本例中 - 没有。
print(
,这是函数名。
A c)
,这意味着需要一个
type A 的单个 parameter,named c.
因此A::A(const A &)
是对象A的copy constructor;本质上,每次将 A 类型的对象复制到 A 类型的新对象中时,都会调用此方法
当您调用 print(*c)
时,您 derefrence 指针 c
,这导致对 指向 的对象的引用 =16=](即:类型为 A
的对象)。然后将构造的复制到print
函数中,导致函数使用的临时const A &
。
这就是调用复制构造函数的原因。
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)
函数可以分解如下:
void
,这是 return 值,在本例中 - 没有。print(
,这是函数名。A c)
,这意味着需要一个 type A 的单个 parameter,named c.
因此A::A(const A &)
是对象A的copy constructor;本质上,每次将 A 类型的对象复制到 A 类型的新对象中时,都会调用此方法
当您调用 print(*c)
时,您 derefrence 指针 c
,这导致对 指向 的对象的引用 =16=](即:类型为 A
的对象)。然后将构造的复制到print
函数中,导致函数使用的临时const A &
。
这就是调用复制构造函数的原因。