Dieses Beispielprogramm zeigt, wie ein anderer Konstruktor aufgerufen wird, abhängig davon, ob Sie eine lokale Variable, eine globale Variable oder eine anonyme Variable übergeben. Was geht hier vor sich?C++ anonymer Konstruktor macht seltsame Dinge
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.
}
Da ich globalStr.puke()
nennen kann, vermute ich, dass aClass(globalStr);
durch den Aufruf, es wird eine lokale Variable globalStr
vom Typ aClass
Namen erstellen, die anstelle der globalen globalStr
verwendet wird. Der Aufruf von aClass(localStr);
versucht dasselbe zu tun, aber es wird nicht kompiliert, weil localStr
bereits als std::string
deklariert ist. Ist es möglich, eine anonyme Instanz einer Klasse zu erstellen, indem Sie ihren 1-arg-Konstruktor mit einem nicht konstanten Ausdruck aufrufen? Wer hat entschieden, dass type(variableName);
eine akzeptable Möglichkeit sein sollte, eine Variable namens variableName
zu definieren?
Was ist ein _anonymous Konstruktor_ ?? Mir ist nichts bewusst. –
[Nun, das ist interessant] (http://ideone.com/eNXYvI), warum 'kotze()' in einer Klasse 'std :: string' aufgerufen werden kann. –
@ πάνταῥεῖ, Es ist beschattet von der Deklaration von 'globalStr' in' main'. – chris