2016-03-23 6 views
0
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

'print' - это не метод, это бесплатная функция. Он принадлежит к той же «части», что и «главная». «A :: A (a)» не печатается, когда вы вызываете 'c-> g()' в этой программе. (И, чтобы быть придирчивым, «A :: A (a)» 'не является утверждением.) – molbdnilo

+0

Ваша' print' принимает аргумент по значению, поэтому необходимо сделать копию. –

+0

Вы передаете значение функции 'print'. В результате вызывается конструктор копирования 'A :: A (const & A)'. – Vishal

ответ

1

Печать isn't a method, it's a function, поэтому он не «принадлежит» нигде - это просто часть вашей программы. Функции от возраста до объектной ориентации, хотя все еще имеют важное место.

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

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

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

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

Именно поэтому вызывается экземпляр Copy-constructor.

3

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

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


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

+0

Thanks Joachim :) – LenC

 Смежные вопросы

  • Нет связанных вопросов^_^