将字符串传递给C ++中的函数(对象与字符串)

时间:2015-10-01 15:55:28

标签: c++

C ++中以下两个有什么区别?

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");

当fun(t)被调用时,它会转到fun(std :: wstring)的定义 但是当有趣(L" msg")被调用时,它变得有趣(Void *)。相反,我希望它转到有趣(std :: wstring)

3 个答案:

答案 0 :(得分:0)

第一个作为宽字符串文字传递。在第二种情况下,您传递值(因此复制)或引用std::wstring对象。

要处理这两种情况,您必须定义函数的两个重载:

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

或者您只需定义wstring版本,因为文字会隐式转换为wstring

答案 1 :(得分: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引用),在第二个你传递一个左值(你可以绑定到它)常量和非常量引用)。

答案 2 :(得分:0)

在给定的示例中没有太大区别,因为编译器将生成包含您的文字的常量数据并在两种情况下都使用它。

在第一种情况下,将从模块的字符串表中使用原始文字。这是尽可能快的代码,没有堆分配(实际上没有分配)。

在第二种情况下,编译器将在堆中分配字符串缓冲区,这会导致malloc()调用和strcpy()。这将增加代码的时间并导致更多内存碎片。

只有当你真的需要使用它们有用的方法时才应该使用std字符串类,否则,TCHAR缓冲区就是最好的选择。