2011-10-07 63 views
0

以下是靜態成員函數的內聯(定義在頭文件中)。字符串「MyClass」總是保證在靜態內存中?如果沒有,這不會返回堆棧中的指針嗎?是以下未定義的行爲?

const char * className() 
{ 
return "MyClass"; 
} 

編輯:

這個怎麼樣?

const RWCString& className() 
{ 
return "MyClass"; 
} 

RWCString是具有隱式構造,這需要一個const char*字符串類。 http://www.roguewave.com/portals/0/products/sourcepro/docs/11/html/toolsref/rwcstring.html

+0

我從來沒有聽說過'RWCString' ... XD但我認爲這很好,因爲構造函數將需要照顧它。 – Mysticial

+0

@Mysticial,但函數將使用隱式構造函數創建每個調用的新RWCString。每次調用className()都會返回一個新的引用 – onof

+0

我立即糾正。我的評論是錯誤的,因爲你不能像這樣參考。 – Mysticial

回答

5

第一個例子:

const char * className() 
{ 
    return "MyClass"; 
} 

是罰款。 "MyClass"char const[8]類型的文字,它的生命週期在代碼被調用之前開始,在代碼完成後結束,因此沒有問題。

然而,第二個例子不起作用。

const RWCString& className() 
{ 
    return "MyClass"; 
} 

它需要,並且爲了在函數內要構造RWCString類型的目的是能夠以一個參考返回到它。然而,在函數中構建爲局部變量或臨時變量的內容不能通過引用返回,因此您會得到未定義的行爲(如果編譯)。

您可以非常簡單地把它變成一個「好」的功能,但:

const RWCString& className() 
{ 
    static RWCString const N = "MyClass"; 
    return N; 
} 

在這裏,我創建這將建造第一次調用函數的局部靜態對象N。因爲它是static,所以它的生命週期延伸超過了調用,因此可以返回對它的引用。

編輯:正如史蒂夫指出的那樣,臨時性更適合於這裏的局部變量。

+0

快速問題:如果值不能在函數內部進行,通過引用返回('const RWCString&')的目的是什麼? (因爲它會超出範圍) – Mysticial

+0

@Mysticial:一般?價值可以從其中一個參數中獲得。例如:'std :: string const&find(std :: map const&);',那麼結果就是地圖中的一個值。由於地圖是由調用者提供的,因此可以通過引用安全地返回(給此調用者)。然而,很容易將參考文獻傳遞給調用鏈,最終導致它沒有意義,這就是爲什麼參考和指針很難處理的原因。 –

+0

啊,這是有道理的。感謝您的迴應。 – Mysticial

5

沒有。這是完全定義的。字符串不在堆棧中。它在全球記憶中。所以它返回的指針是有效的。 (甚至更好:你宣佈它const

相關問題