различия конструкторов c ++ - PullRequest
0 голосов
/ 08 марта 2012

Если у меня есть следующий класс:

class A{
private:
  int x;
public:
  A(){
    x = 5;
  }
};

В чем разница между этими двумя объявлениями?

A a;

против

A a();

Спасибо.

Ответы [ 4 ]

8 голосов
/ 08 марта 2012
A a;

Это создает объект типа A и вызывает конструктор по умолчанию.

A a();

Это объявляет функцию с именем a, которая возвращает объект типа A.

3 голосов
/ 08 марта 2012

Возможно, интересно отметить, помимо того, что говорили другие, что есть разница между следующими двумя строками:

A a;
A a{}; // Using uniform initialization from C++11 to avoid the ambiguity

А также между следующими двумя строками:

A* a = new A;
A* a = new A(); // or new A{}

В первой строке каждого примера объект инициализируется по умолчанию.Во вторых строках объект инициализируется значением.Разница в том, что хотя default-initialization будет вызывать конструктор по умолчанию для A, value-initialization будет сначала инициализировать объект с нуля, а затем вызывать конструктор по умолчанию (если нет пользовательских конструкторов).все, что не является типом класса, инициализация по умолчанию не будет выполнять инициализацию.Для всего, что не является типом класса или объединением без предоставленного пользователем конструктора, инициализация значения инициализирует ноль объекта.

2 голосов
/ 08 марта 2012
A a;

Это объявляет элемент класса A и конструирует его, используя конструктор по умолчанию.

A a();

Здесь объявляется функция с именем a, которая не принимает параметров и возвращает объект типа A.

2 голосов
/ 08 марта 2012

Второй код не определяет объект с именем a, , он объявляет функцию a с типом возврата A без аргументов.Это свойство компилятора C ++ широко известно как самый неприятный анализ .

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