С++ - что это делает, если конструктор является закрытым?
В коде ниже, почему компилятор не жалуется на mClass2?
class CMyClass{
private:
CMyClass(){}
};
void TestMethod(){
CMyClass mClass1; //Fails.
CMyClass mClass2(); //Works.
}
Ответы
Ответ 1
Потому что вы только что объявили функцию mClass2
нулевых аргументов, которая возвращает a CMyClass
. Это допустимый вариант, поскольку может быть, скажем, экземпляр static CMyClass
, к которому эта функция имеет доступ. Обратите внимание, что CMyClass
все еще имеет открытый конструктор копии.
(Чтобы убедить себя, скомпилируйте этот модуль для ассемблера и обратите внимание, что комментирование строки CMyClass mClass2();
приводит к тому же выводу.)
Ответ 2
Потому что он объявляет функцию и не вызывает конструктор, как вы думаете.
Это называется Самый Vexing Parse в С++.
CMyClass mClass2();
объявляет функцию mClass2()
, которая не принимает параметр и возвращает CMyClass
Ответ 3
Второй - это объявление функции.
Ответ 4
Люди должны перейти к равномерной синтаксической инициализации в С++ 0x/С++ 11, используя вместо этого {} скобки, что устраняет эту проблему.
Класс C {};
http://www2.research.att.com/~bs/C++0xFAQ.html#uniform-init