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*。
分享到:
相关推荐
能支持任意STL容器打印
string的c_str()也是非常常用的,但要注意和char *转换时,要把char定义成为const char*,这样是最安全的。 以上函数UNICODE编码也没问题:unicode下照用,加个_T()宏就行了,像这样子_T("%s") 补充: CString ...
有时候在字符序列中进行遍历,标准的string类提供了STL容器接口。具有一些成员函数比如begin()、end(),迭代器可以根据他们进行定位。 注意,与char*不同的是,string不一定以NULL(‘\0’)结束。string长度可以根据...
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=" ")
C++ STL_示例word 格式 提供例程 string vector list等数据结构示例 #include #include<string> using namespace std; void main() { //用const char * 构造strText对象 string strText("This is a test"); //...
很全的STL string类的函数方法,便于查询
STL中的string介绍,以及如何合起来使用的方法
在C++的STL中实现由一个bitset类模板,其用法如下: std::bitset<64> bs; 也就是说,这个bs只能支持64位以内的位存储和操作;bs一旦定义就不能动态增长了。本资源附件中实现了一个动态Bitset,和标准bitset兼容。 /*...
内容简介,涵盖内容广泛。源码实现参照STL源码。
4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits 和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。 5. 注意,这个类独立于所...
包含常用stl string的常用函数
(一) 概述 string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C++标准之中; CString(typedef CStringT, StrTraitMFC<TCHAR>> CString)为Visual C++中最常用的字符串类,继承...
C++ STL实现包含常用stl模板的手动实现仅供参考
STL中string的扩展类string_ex,给出许多扩展的操作字符串的非常使用的成员函数
介绍 string类的常用函数,讲解细致,透彻,非常实用
C++ stl中重要容器string类的构造方法与基本概念和一些有用的字符串操作
这几乎是循环缓冲区的高级版本,它遵循std :: queue,deque,vector等的STL命名约定。 它支持创建多个循环缓冲区,而无需使用重新分配,new或malloc。 系统使用模板来配置该类的缓冲区。 循环缓冲区和循环数组均...
stl之父的访谈,喜欢c++ 的不要错过,加深对裤的认识
一个能够替代CStringT的STL类,最为重要的是:它具有CStringT的Format功能。
stl容器类 string 专题解说