std::string(我们就默认是std::basic_string<char>吧)没有直接实现operator const char*,而是用一个c_str()函数来实现这个转换,我过去一直对STL这个舍近求远的做法不大理解,不过最近碰到一个应用场景,说明了这个做法的合理性。
const char* foo()
{
.......
// 这里正确的写法是str.size()?str.c_str():0;
return str.size()?str:0;
}
如果std::string实现了operator const char*,在这个三元运算符内就会产生一个微妙的问题,就是编译器在进行计算的时候,并不是选择自动对str进行const char*的转型操作,而是选择了对所有参与运算的变量进行类型提升,这里类型提升怎么样提?这里自然是把做为构造函数的参数,来构造一个临时的string对象,在效率上用户可能无法接受,在某些特殊的场景还可能引起程序的错误。不明显的隐式转换,这只是一个例子,无数的陷井还程序中,让后期的调试苦不堪言。
如果对象是用户自定义,最好选择尽量在构造函数前加explicit,来禁掉通过隐式转换来不明不白地调用拷贝构造函数,创建临时对象。我看了basic_string的定义,构造函数没有加explicit关键字,那么就选择了禁掉operator const char*。
分享到:
相关推荐
string 的构造函数可以接受多种类型的参数,如 const char*、const string& 等。 string 的优点是可以自动管理内存,避免了手动释放内存的风险。string 还提供了许多实用的成员函数,如 operator+=、operator+、...
* `const char &operator[](int n) const`: 返回当前字符串中第 `n` 个字符的引用。 * `const char &at(int n) const`: 返回当前字符串中第 `n` 个字符的引用,提供范围检查,当越界时抛出 `out_of_range` 异常。 * ...
### cstring、string、char* 的对比、使用与相互转换 #### 一、概述 `string` 和 `CString` 均为字符串处理类,分别适用于不同的编程环境和框架。 - **string**: 属于标准模板库 (STL) 定义的字符串类,广泛应用...
CString 可以自动转换为 const char*,而 string 不可以。此外,CString 和 string 的比较结果是值的比较,而 char* 的比较结果是地址的比较。 二、CString、string、char* 之间的转化 CString、string 和 char* ...
- **普通赋值**: `string& operator=(const char *s);` - 将C风格字符串`s`赋值给当前`string`对象。 - **复制赋值**: `string& operator=(const string &s);` - 将`string`对象`s`的内容赋值给当前对象。 - **单...
- `const char &operator[](int n)const`和`const char &at(int n)const`:这两种方法用于获取字符串中的字符。`at()`函数提供了边界检查,如果访问越界,会抛出`out_of_range`异常,而`[]`操作符则不进行检查。 3...
* `const char &operator[](int n) const`: 返回当前字符串中第 n 个字符的引用。 * `const char &at(int n) const`: 返回当前字符串中第 n 个字符的引用,并提供范围检查。 * `char &operator[](int n)`: 返回当前...
Automatically analyze the parameter type and invoke the 'operator<<' interface to transform it to string. ...template< class T> std::string to_string( const T& RefT, const char* split=" ")
// 非法,需要转换为 const char* ``` ##### operator+= - **string** 支持与所有类型的字符串变量使用 `+=` 运算符。 - **CString** 支持与基本的字符串变量使用 `+=` 运算符。 - **char\*** 不支持 `+=` ...
- `bool operator==(const string &s1, const string &s2) const:` 比较两个字符串是否相等。 ```cpp string str1 = "hello"; string str2 = "hello"; if (str1 == str2) { cout ; } ``` 2. **关系比较** ...
4. **赋值和拷贝**:`assign(const string&)`、`assign(const char*, size_t)`等用于重新赋值字符串,`copy(char*, size_t, size_t pos=0)`将字符串复制到C风格字符数组。 5. **比较**:`compare(const string&)`或...
在C++中,string类不仅方便了字符串的处理,而且与C语言中的char*字符串有着良好的互操作性。 string类是一个内置的容器,它能够存储一系列的字符,类似于一个动态数组。与传统的C风格的char*字符串不同,string类...
`string(const char* s)`接收一个C风格的字符数组并初始化字符串;`string(const string& str)`进行深拷贝构造;`string(int n, char c)`则用指定数量的同一字符初始化字符串。 2. **赋值操作** `operator=`支持...
String(const char* str) : str_(new char[strlen(str) + 1]), length_(strlen(str)) { strcpy(str_, str); } // 其他构造函数... }; ``` 这里,`str_` 是存储字符串的动态数组,`length_` 存储字符串长度。 2....
在C++的STL中实现由一个bitset类模板,其用法如下: std::bitset<64> bs; 也就是说,这个bs只能支持64位以内的位存储和操作;bs一旦定义就不能动态增长了。本资源附件中实现了一个动态Bitset,和标准bitset兼容。 /*...
- `String(const char *str = NULL)`是普通构造函数,接受一个`const char*`作为字符串的初始值,或者默认为`NULL`。 - `String(const String &other)`是拷贝构造函数,当一个`String`对象被用作另一个对象的...
MyString(const char* input) { size_ = strlen(input); str_ = new char[size_ + 1]; strcpy(str_, input); } // ...其他构造函数 private: char* str_; int size_; }; ``` 2. **拷贝构造函数**:当一个...
在C++编程语言中,`string`类是标准模板库(STL)的一部分,它提供了一种面向对象的方式来处理和操作字符串。在第11章中,我们深入学习了如何使用`string`类来定义和操作字符串对象。这个类极大地简化了字符串处理,...
std::string operator()(char c) const { return std::string(2, c); } }; ``` 3. **迭代器分类与特性** - **分类**:根据迭代器的不同能力进行分类。 - **特性**:每种类型的迭代器都有不同的操作支持。 - *...