C ++ - Что это делает, если конструктор является закрытым? - PullRequest
15 голосов
/ 21 июля 2011

В коде ниже, почему компилятор не жалуется на mClass2?

class CMyClass{
private:
    CMyClass(){}
};

void TestMethod(){
    CMyClass mClass1;   //Fails.
    CMyClass mClass2(); //Works.
}

Ответы [ 4 ]

16 голосов
/ 21 июля 2011

Поскольку вы только что объявили функцию mClass2 с нулевым аргументом, которая возвращает CMyClass. Это допустимая опция, так как, например, может быть экземпляр static CMyClass, к которому эта функция имеет доступ. Обратите внимание, что CMyClass все еще имеет открытый конструктор копирования.

(Чтобы убедить себя, скомпилируйте этот модуль для ассемблера и обратите внимание, что комментирование строки CMyClass mClass2(); производит тот же вывод.)

10 голосов
/ 21 июля 2011

Потому что это объявление функции, а не вызов конструктора, как вы думаете.

Это называется Most Vexing Parse в c ++.

CMyClass mClass2(); 

объявляет функцию mClass2(), которая не принимает параметров и возвращает CMyClass

1 голос
/ 21 июля 2011

Вторым является объявление функции.

0 голосов
/ 21 июля 2011

Люди должны перейти к инициализации единого синтаксиса в C ++ 0x / C ++ 11, используя вместо этого скобки {}, что устраняет эту проблему.

Класс C {};

http://www2.research.att.com/~bs/C++0xFAQ.html#uniform-init

...