как написать конструктор - PullRequest
0 голосов
/ 02 июня 2010

это правильно написать конструктор, как это?

class A
{
    A(const A& a)
    {
    ....
    }
};

если да, то правильно ли вызывать его так:

A* other;
...
A* instance = new A(*(other));

если нет, то что вы предлагаете?

Спасибо

Ответы [ 2 ]

4 голосов
/ 02 июня 2010

Почти правильно. При объявлении конструктора в классе просто пишите A, а не A::A; вы будете использовать A::A, когда дадите определение для конструктора вне объявления класса. Иначе да.

Кроме того, как указывает Джеймс, если вы не копируете объект, к которому вы обращаетесь через указатель, вам не нужно выполнять разыменование (если это значение или ссылка). Как правило, указатели не используют указатели, если в этом нет необходимости. По этому принципу у вас будет что-то вроде:

 A x; // Invoke default constructor
 // ...
 // do some thing that modify x's state
 // ...

 A cpy(x); // Invokes copy constructor
           // cpy now is a copy of x.

Обратите внимание, что первый оператор A x вызывает конструктор по умолчанию. C ++ обеспечит реализацию этого конструктора по умолчанию, но это может быть не то, что вы хотите, и даже если это то, что вы хотите, лучше придерживаться стиля, IMHO, явно указывать его, чтобы другие программисты знали, что вы об этом подумали .

Редактировать
C ++ автоматически предоставит реализацию конструктора по умолчанию, но только если вы не предоставите никаких пользовательских конструкторов - как только вы предоставите свой собственный конструктор, компилятор не будет автоматически генерировать конструктор по умолчанию. По правде говоря, я забыл об этом, так как привык сам давать все определения конструкторов, даже если они не являются строго необходимыми. В C ++ 0x можно будет использовать = default, что обеспечит простоту использования конструктора, сгенерированного компилятором, и в то же время сделает его понятным для других разработчиков.

0 голосов
/ 02 июня 2010

Нет, вы пишете конструктор копирования. Он не будет действовать так, как вы ожидаете (в соответствии с приведенными примерами).

class A{

   A(arguments){ ...}
}

Я бы предложил почитать книгу на C ++, различия между конструктором и конструктором копирования хорошо объяснены.

Когда это используется? Когда экземпляр копируется. Например, возвращая / передавая экземпляр по значению

void foo (A a){ 
  //copy constructor will be called to create a
}

A bar(){

  return a; //Copy constructor will be called 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...