Ten przykładowy program pokazuje, w jaki sposób zostanie wywołany inny konstruktor w zależności od tego, czy przekazujesz zmienną lokalną, globalną czy anonimową. Co tu się dzieje?C++ anonimowy konstruktor robiący dziwne rzeczy
std::string globalStr;
class aClass{
public:
aClass(std::string s){
std::cout << "1-arg constructor" << std::endl;
}
aClass(){
std::cout << "default constructor" << std::endl;
}
void puke(){
std::cout << "puke" << std::endl;
}
};
int main(int argc, char ** argv){
std::string localStr;
//aClass(localStr); //this line does not compile
aClass(globalStr); //prints "default constructor"
aClass(""); //prints "1-arg constructor"
aClass(std::string("")); //also prints "1-arg constructor"
globalStr.puke(); //compiles, even though std::string cant puke.
}
Biorąc pod uwagę, że mogę zadzwonić globalStr.puke()
, zgaduję, że dzwoniąc aClass(globalStr);
, to tworzy lokalną zmienną o nazwie globalStr
typu aClass
który jest używany zamiast globalnego globalStr
. Wywołanie aClass(localStr);
próbuje zrobić to samo, ale nie można go skompilować, ponieważ localStr
jest już zadeklarowane jako std::string
. Czy można utworzyć anonimową instancję klasy, wywołując jej konstruktor 1-arg z wyrażeniem niestałym? Kto zdecydował, że type(variableName);
powinien być akceptowalnym sposobem zdefiniowania zmiennej o nazwie variableName
?
Co to jest _anonimowy konstruktor_ ?? Nie znam czegoś takiego. –
[Cóż, to jest interesujące] (http://ideone.com/eNXYvI), dlaczego można wywołać 'puke()' na klasie 'std :: string'. –
@ πάνταῥεῖ, Jest zacieniony deklaracją 'globalStr' w' main'. – chris