Почему и когда выполняется конструктор перегрузки?

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

И я не совсем уверен, к какой части программы принадлежит метод печати?

0

Решение

Распечатать это не метод, это функция, как таковой он нигде не «принадлежит» — это просто часть вашей программы.
Функции относятся к эпохе, предшествующей объектно-ориентированной, хотя все еще занимают важное место.

void print(A c) Функцию можно разбить следующим образом:

  1. void, это возвращаемое значение, в данном случае — ничего.
  2. print(это имя функции.
  3. A c)это означает, что потребуется
    не замужем параметр из тип A, названный с.

В качестве таких A::A(const A &) это конструктор копирования объекта А; По сути этот метод будет называться Каждый раз, когда объект типа A копируется в новый объект типа A

Когда вы звоните print(*c), вы derefrence Указатель c, это приводит к ссылке на объект указал на от c (То есть: объект типа A). Это то копия построена в print функция, в результате чего временный const A & который используется функцией.

Вот почему Copy-конструктор называется.

1

Другие решения

Поскольку вы передаете аргумент по значению print функция, копия должна быть сделана с использованием конструктора копирования. Вот почему ваш конструктор копирования вызывается, когда print называется.

Если вы переключитесь на ссылку для вызова (или передав указатель), копирование не будет.


И, как утверждают другие, print является «нормальной» функцией, также известной как «свободная» функция или функция, не являющаяся членом. Он «принадлежит» программе и существует в глобальный охват и имеют внешняя связь.

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector