是否可以在不分配內存的情況下使用引用操作符( - >)調用函數。 我在某些情況下調用一個函數,而不用在C++中分配對象
Foo *fooObject;
fooObject->someFunction;
我對這個事情的困惑嘗試這種代碼。這在Dev C++中運行良好,但在visual C++中崩潰。
是否可以在不分配內存的情況下使用引用操作符( - >)調用函數。 我在某些情況下調用一個函數,而不用在C++中分配對象
Foo *fooObject;
fooObject->someFunction;
我對這個事情的困惑嘗試這種代碼。這在Dev C++中運行良好,但在visual C++中崩潰。
不,不可能使用 - >沒有分配內存,因爲這個操作符試圖取消引用一個指向對象的指針......因此該對象必須存在。
指向的對象必須存在...這是「內存分配」,這可以在堆棧或堆上完成。
以下語法...
fooObject->func();
相當於
(*fooObject).func()
所以能夠做到*fooObject
,目標指向fooObject
必須存在。
在你的代碼
Foo *fooObject;
是一個懸擺指針因爲你沒有在一個對象指向它。指針值可能爲NULL或指向一些完全隨機的內存塊:尊重它會導致你的問題,因爲不能保證你所引用的內容......這被稱爲「未定義的行爲」。
分配內存爲你的對象,你可以做到這一點棧這樣
Foo fooObject;
然後,您可以,如果你喜歡,使用指針的對象上...
Foo *fooObjectPTR = &fooObject;
但請注意,分配給堆棧的對象只會在範圍內存在。當它超出範圍時,它會被銷燬,並且你的指針會再次成爲懸掛指針,所以不能使用它。
或者你也可以在堆中分配這樣
Foo *fooObjectPTR = new Foo();
如果您在堆上分配,你一定要小心,以釋放後使用delete
你可以調用靜態函數分配的內存類實際上不存在實例,但是這是通過使用::
表示法來完成的,然後該函數在範圍外運行任何特定實例 - 類的靜態成員函數沒有隱式指針:
class Foo {
public:
static void someFunction(void) {std::cout << "BOO!\n";};
};
...
int main(...) {
Foo::someFunction();
return 0;
}
中的標準狀態〔類靜態]:「A靜態構件可以 被稱爲使用類的成員訪問語法,在這種情況下,對象的表達 總是被判斷。「
與此相反,Microsoft documentation狀態:The left side of a member-selection operator (. or –>) that selects a static member function is not evaluated
,這意味着以下適用於VC++,但不符合標準的C++:
Foo* not_allocated;
not_allocated->someFunction();
標準對此有何評論: 「一個後綴表達式,後跟一個點'.'或者一個箭頭' - >'[]然後後跟一個id表達式,是一個後綴表達式,在點或箭頭之前的後綴表達式被計算;」帶註腳「如果評估類成員訪問表達式,則即使結果不必確定整個後綴表達式的值,也會發生子表達式評估,例如,如果id表達式表示靜態成員**,則會進行子表達式評估。 [?expr.ref]/1 – dyp 2013-05-07 16:06:40
也許更重要的是(?)是[class.static],其中指出「可以使用類成員訪問語法引用靜態成員,在這種情況下,總是對對象表達式進行評估」。我會更新我的答案。 – icabod 2013-05-07 16:28:03
這不是有效的代碼(未定義行爲實際上)它沒有意義,因爲fooObject(指向Foo)沒有被初始化,它可以指向任何地方,如果你不想在堆上分配內存,你可以在堆棧中進行:Foo fooObj; fooObj.someFunction() – maverik 2013-05-07 15:19:05
「可能」是什麼意思?你可以編寫它(你的程序可以被編譯爲「格式良好」),但是maverik認爲它是未定義的行爲 – dyp 2013-05-07 15:32:29