2015-10-01 108 views
0

C++中以下兩者之間有什麼區別?將字符串傳遞給C++中的函數(對象vs字符串)

fun(L"text1") 

VS

std::wstring var = "text1" 
fun(var) 

在第一種情況,它被作爲一個對象,而第二殼體並將其作爲一個wstring的通過。

fun()應如何定義以處理兩者?

編輯: 我有兩個函數定義

fun(void*) 
fun(std::wstring) 

std::wstring t = "bla"; 
fun(t); 
fun(L"msg"); 

當樂趣(T)被調用它去的樂趣(STD :: wstring的)定義 但當樂趣(L 「味精」)是稱它爲樂趣(Void *)。相反,我希望它轉到樂趣(STD :: wstring的)

+1

A ['std :: wstring()'](http://en.cppreference。com/w/cpp/string/basic_string)可以通過寬字符文字隱式創建。 –

+0

當我傳遞fun(「text」)時,它是否被識別爲對象或字符串? – user2626431

回答

0

第一個寬字符串文字傳遞。在第二種情況下,您按值(因此複製)或通過引用std::wstring對象傳遞。

同時處理,你必須定義函數的兩個重載:

void fun(const wchar_t* s); 
void fun(const std::wstring& s); 

或者你可以定義wstring版本,因爲字面將隱式轉換爲wstring

0

同時處理應定義有趣的方法:

void fun(const std::wstring& str); 

然後在這兩種情況下,因爲編譯器允許您將傳遞一個const引用到的wstring到隱式轉換一個類型到另一種,如果類型被轉換爲具有一個構造函數,該構造函數接受來自該類型的一個參數,除非該構造函數被標記爲顯式。

實施例:

class wstring 
{ 
public: 
    // constructor not marked as explicit and takes one argument of type whar_t* 
    wstring(const wchar_t* str); 
}; 

wstring myString = L"hello world"; // implicit cast from wchar_t* to wstring 

你已經給出的兩個實施例之間的唯一區別是,在所述第一要傳遞一個rvalue(可以僅結合const引用),並在第二你傳遞一個左值(你可以綁定到const和非const引用)。

+0

這是我的問題,我有兩個重載函數fun(void *)和fun(std :: wstring)。當我稱爲樂趣(L「bla」)時,它變成了樂趣(void *)而不是樂趣(std :: wstring)。 – user2626431

+0

難道你不會更明確,像這樣調用它:fun(std :: wstring(L「bla))。允許編譯器隱式地將wchar_t *轉換爲void *,因此它有效選擇fun(void * )而不是有趣的(std :: wstring)。 –

0

在給定的例子中沒有太大的區別,因爲編譯器會生成包含你的文字的常量數據並在兩種情況下都使用它。

在第一種情況下,將從模塊的字符串表中使用原始文字。這是儘可能快的代碼,沒有堆分配(實際上沒有分配)。

在第二種情況下,編譯器會在堆中分配字符串緩衝區,這會導致malloc()調用和strcpy()。這會增加你的代碼的時間並導致更多的內存碎片。

只有當你真的需要使用他們有用的方法時,才應該使用std string類,否則,TCHAR緩衝區纔是最佳選擇。