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);
И я не совсем уверен, к какой части программы принадлежит метод печати?
Распечатать это не метод, это функция, как таковой он нигде не «принадлежит» — это просто часть вашей программы.
Функции относятся к эпохе, предшествующей объектно-ориентированной, хотя все еще занимают важное место.
void print(A c)
Функцию можно разбить следующим образом:
void
, это возвращаемое значение, в данном случае — ничего. print(
это имя функции. A c)
это означает, что потребуетсяВ качестве таких A::A(const A &)
это конструктор копирования объекта А; По сути этот метод будет называться Каждый раз, когда объект типа A копируется в новый объект типа A
Когда вы звоните print(*c)
, вы derefrence Указатель c
, это приводит к ссылке на объект указал на от c
(То есть: объект типа A
). Это то копия построена в print
функция, в результате чего временный const A &
который используется функцией.
Вот почему Copy-конструктор называется.
Поскольку вы передаете аргумент по значению print
функция, копия должна быть сделана с использованием конструктора копирования. Вот почему ваш конструктор копирования вызывается, когда print
называется.
Если вы переключитесь на ссылку для вызова (или передав указатель), копирование не будет.
И, как утверждают другие, print
является «нормальной» функцией, также известной как «свободная» функция или функция, не являющаяся членом. Он «принадлежит» программе и существует в глобальный охват и имеют внешняя связь.