Questo programma di esempio mostra come verrà chiamato un costruttore diverso a seconda che si passi in una variabile locale, una variabile globale o una variabile anonima. Che cosa sta succedendo qui?C++ costruttore anonimo che fa cose strane
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.
}
Dato che posso chiamare globalStr.puke()
, sto cercando di indovinare che chiamando aClass(globalStr);
, si sta creando una variabile locale denominata globalStr
di tipo aClass
che viene utilizzato al posto del mondiale globalStr
. Chiamando aClass(localStr);
prova a fare la stessa cosa, ma non riesce a compilare perché localStr
è già dichiarato come std::string
. È possibile creare un'istanza anonima di una classe chiamando il suo costruttore 1-arg con un'espressione non costante? Chi ha deciso che type(variableName);
dovrebbe essere un modo accettabile per definire una variabile denominata variableName
?
Che cos'è un _manonymous constructor_ ?? Non c'è nulla di cui io sia a conoscenza. –
[Beh, è interessante] (http://ideone.com/eNXYvI), perché può 'puke()' essere chiamato su una classe 'std :: string'. –
@ πάνταῥεῖ, È ombreggiato dalla dichiarazione di 'globalStr' in' main'. – chris