Что делает объект * foo (bar)? - PullRequest
3 голосов
/ 30 апреля 2009

Для некоторого класса C:

C* a = new C();

C* b(a);  //what does it do?

C* b = a;  //is there a difference?

Ответы [ 5 ]

14 голосов
/ 30 апреля 2009

C * b (a) и C * b = a эквивалентны. Как и во многих языках, есть несколько способов сделать это ...

4 голосов
/ 30 апреля 2009

Обратите внимание, что в

C* a = new C();
C* b(a);  

b - указатель на объект C, которому присвоено то же значение, что и для. Однако

#include "somefile.h"
C* b(a);  

мы можем так же легко определить b как функцию, которая принимает объект типа a и возвращает указатель на C.

3 голосов
/ 30 апреля 2009

Стандарт описывает различные виды инициализации, равные 8,5, и эти две, в частности, под 8,5 / 12.

C* b(a);  //what does it do?

Это называется прямой инициализацией . Если бы 'b' имел тип класса, то компилятор выполнял бы разрешение перегрузки для конструкторов в C, используя 'a' в качестве аргумента. Для типа указателя, он просто инициализирует «b» с «a».

C* b = a;  //is there a difference?

Стандарт считает, что в некоторых случаях они различаются, приведенный выше синтаксис называется copy initialization . Что касается прямой инициализации, поскольку 'b' не является типом класса, то он инициализируется значением 'a'. Если 'a' и 'b' - это один и тот же тип класса, тогда используется прямая инициализация .

Если «b» является типом класса, а «a» имеет другой тип (класс или нет), то правила немного отличаются (8.5 / 14-b1.b3). Так для следующего кода:

C b = a;

Сначала делается попытка преобразовать «a» в тип «C», а затем этот временный объект используется для инициализации «b». Это важно, поскольку вы можете иметь ситуацию, когда прямая инициализация завершается успешно, но копирует инициализацию не удается:

class A {
public:
  operator int ();
};

class B {
public:
  B (int);
};

void foo ()
{
  A a;
  B b1 (a);  // Succeeds
  B b2 = a;  // Fails
}
0 голосов
/ 30 апреля 2009
  1. C * a = новый C (); Теперь он создает указатель тип C, который также выделяет новый памяти с использованием нового ключевого слова ....
  2. Следующее утверждение зависит от ваша логика конструктора . C * Ь (а); // что это делает?
  3. Ваше первое и третье утверждение эквивалент. C * b = а; //Есть ли разница?
0 голосов
/ 30 апреля 2009

Первый создает новый экземпляр C и помещает его адрес в.

Вторым является объявление указателя на функцию. Этот указатель может указывать на любую функцию, принимающую аргумент типа a, и возвращает указатель на объект типа C.

Третий объявляет b, указатель на объект типа C и инициализирует его с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...