請考慮以下代碼。
這裏,即使構造函數是A(B & b),A a(B())也會編譯; 但是print(B())不起作用。但印刷品也被宣佈爲印刷品(B & b); 爲什麼這種不一致?將臨時變量傳遞給構造函數中的參考arg。但不是一般的功能。爲什麼?
#include <iostream>
using namespace std;
class B{
public:
char b;
};
class A {
public:
B b;
A(B& b);
A() { }
};
A::A(B& b) {
this->b = b;
}
void print(B& b) { }
int main(){
print(B());
A a(B());
}
這太血腥糟糕! C++甚至允許你聲明一個函數INSIDE另一個函數嗎?爲什麼C++允許這樣做?爲什麼會有人需要這樣的設施? – user855 2009-12-03 04:32:05
是的,C++確實允許。很明顯,因爲你剛剛做到了。它是一個函數內的聲明,因爲它是其他地方的聲明。將該行放在類聲明中,它是一個成員函數聲明。把它放在其他地方,這是一個函數聲明。無論你放在哪裏,都是一個函數聲明。 – 2009-12-03 04:43:36
我認爲完全可以修改編譯器來添加條件,如果這樣的事情發生在函數的定義內部,它不是函數聲明,而是對象聲明。我很驚訝他們爲什麼決定不修復它。 – user855 2009-12-03 04:57:53