昨天看到一個提問帖子問到一個有關構造函數的問題,問題意思如下:
定義一個class Cat,然後創建實例,發現Cat frisky和Cat frisky()兩種方式表現不一。
我用vs調試了一下
#include <iostream>
class Cat{
public:
Cat(){std::cout << "default-constructor" << std::endl;}
Cat(int i){std::cout << "new-constructor" << std::endl;}
void operator ()(){std::cout << "operator-void" << std::endl;}
void operator ()(int i){std::cout << "operator-int" << std::endl;}
~Cat(){std::cout << "destructor" << std::endl;}
};
void test()
{
Cat(); // "default-constructor destructor"
Cat(1); // "new-constructor destructor"
Cat a; // "default-constructor"
a(); // "operator-void"
a(1); // "operator-int"
Cat b(); // * do nothing
Cat c(1); // "new-constructor"
c(); // "operator-void"
c(1); // "operator-int"
Cat d = Cat(); // 同 a
d();
d(1);
Cat e = Cat(1); // 同 c
e();
e(1);
}
int main(int argc, char **argv)
{
test();
return 0;
}
發現"Cat b();"這一句壓根就沒走到,單步調試直接跳過了,感覺是被編譯器幹掉了。難道是C++允許這種寫法,但卻又是無效的代碼,與其這樣,爲什麼不直接在編譯期間就報錯呢?具體原因我也說不上來,希望有個明白人解釋一下。