Странное поведение компилятора в отношении конструкторов по умолчанию в C ++ - PullRequest
3 голосов
/ 16 января 2010
class TestClass
{
public:
    TestClass(int i) { i = i; };
private:
    int i;
}

class TestClass2
{
private:
    TestClass testClass;
}

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

Только если кто-то создает экземпляр TestClass2 в другом месте кода, мы получим ошибку компиляции. Что здесь делает компилятор? Кажется странным ...

Спасибо.

Ответы [ 3 ]

4 голосов
/ 16 января 2010

Когда вы указываете конструктор не по умолчанию без указания конструктора по умолчанию, конструктор по умолчанию не существует.

Вы не пытаетесь вызвать конструктор по умолчанию, пока не попытаетесь вызвать его явно, как в TestClass2. Если бы вы вместо этого в TestClass2 указали конструктор, который соответствующим образом инициализировал TestClass, у вас не было бы ошибки.

т.е.

class TestClass2
{
   TestClass m_testClass;
public:
   TestClass2():m_testClass(2){}
};

также по возможности используйте списки инициализаторов для производительности, и если вы называете имя параметра и имя переменной-члена одинаковыми, это может сбить с толку других.

2 голосов
/ 16 января 2010

Поскольку вам не нужен конструктор по умолчанию для определения размера / типа, информации и т. Д. TestClass2.

Первый раз, когда нужен конструктор по умолчанию, это когда TestClass2 где-то инициируется. Это когда компилятор обнаруживает, что конструктор по умолчанию не существует и жалуется.

(Это только мои предположения. Проверьте, что на самом деле происходит в стандартах C ++.)

0 голосов
/ 16 января 2010

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

...