在c++中传递字符串给函数(对象vs字符串)

Passing a string to a function in C++(object vs string)

本文关键字:字符串 对象 vs 函数 c++      更新时间:2023-10-16

在c++中以下两者的区别是什么?

fun(L"text1")

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)的定义但是当fun(L"msg")被调用时,它会转到fun(Void*)。我想让它转到fun(std::wstring)

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

要同时处理这两个函数,必须定义函数的两个重载:

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

或者您可以只定义wstring版本,因为文字将隐式转换为wstring

要同时处理这两种情况,你应该将fun方法定义为:

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

你给出的两个例子之间的唯一区别是,在第一个例子中,你传递了一个右值(你只能绑定到const引用),而在第二个例子中,你传递了一个左值(你可以绑定到const和非const引用)。

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

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

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

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