2015-10-01 80 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缓冲区才是最佳选择。