在c++中传递字符串给函数(对象vs字符串)
Passing a string to a function in C++(object vs string)
在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缓冲区就是一个很好的选择。
- 如何删除作为C++联合的成员变量的字符串对象
- 系统C 从字符串对象sc_uint
- 为什么<string>字符串对象需要 #include 而不是字符串文本?
- 使用C 中字符串标头的getline()函数将第一个char存储在字符串对象中
- C 字符串对象错误字符
- 创建兼容的字符串对象
- 从对象数组打印字符串对象
- 将指针分配给字符串对象的第一个也是最后一个索引
- 比较字符串对象等于向量中的元素
- 传递给 std::runtime_error 的 ctor 的字符串对象的生命周期是多少?
- 如何移动 std::ostringstream 的底层字符串对象?
- 将 const 引用传递给临时字符串对象在 C++ 中安全吗?
- getline 没有为字符串对象分配任何值
- 在c++中删除字符串对象
- 如何在没有收到需要分号编译错误的情况下从 c++ 中的函数返回字符串对象
- 你能在C++中返回字符串对象的局部变量吗?
- 将字符串对象的地址传递给函数
- C++:从字符串对象中提取整数
- 是否有理由使用字符串 => 索引到向量的映射,而不是字符串 => 对象?
- 控制对多线程程序中字符串对象的访问的最佳方法