abu*_*amq 15 c++ explicit stdstring copy-constructor assignment-operator
我已经扩展了std :: string来满足我不得不将自定义函数构建编写到名为CustomString的字符串类中的需求
我已经定义了构造函数:
class CustomString : public std::string {
public:
explicit CustomString(void);
explicit CustomString(const std::string& str);
explicit CustomString(const CustomString& customString);
//assignment operator
CustomString& operator=(const CustomString& customString);
... };
Run Code Online (Sandbox Code Playgroud)
在第三个构造函数(复制构造函数)和赋值运算符中,其定义为:
CustomString::CustomString(const CustomString& customString):
std::string(static_cast<std::string>(customString))
{}
CustomString& CustomString::operator=(const CustomString& customString){
this->assign(static_cast<std::string>(customString));
return *this;
}
Run Code Online (Sandbox Code Playgroud)
首先,因为这是"明确的"; 意味着需要显式转换以分配给另一个CustomString对象; 它抱怨任务.
CustomString s = CustomString("test");
Run Code Online (Sandbox Code Playgroud)
我不确定在哪里确实需要铸造.
如果复制构造函数不是显式的,那么代码可以正常工作,但我想知道并实现显式定义而不是"猜测正确的强制转换".
Dav*_*eas 32
显式复制构造函数意味着不会隐式调用复制构造函数,这是表达式中发生的情况:
CustomString s = CustomString("test");
Run Code Online (Sandbox Code Playgroud)
这个表达式的字面意思是:CustomString使用构造函数创建一个临时表const char*.隐式调用复制构造函数CustomString从该临时复制到s.
现在,如果代码是正确的(即如果复制构造函数不是显式的),编译器将避免创建临时文件,并通过s直接使用字符串文字来构建副本.但是编译器仍然必须检查构造是否可以完成并在那里失败.
您可以显式调用复制构造函数:
CustomString s( CustomString("test") );
Run Code Online (Sandbox Code Playgroud)
不过,我建议你完全避免暂时的,只是创建s与const char*:
CustomString s( "test" );
Run Code Online (Sandbox Code Playgroud)
无论如何,编译器会做什么......
从std :: string派生是不安全的,因为std :: string没有虚拟析构函数.至于你的问题 - 你的副本构造函数不应该是明确的,以允许这样的用法:
CustomString s = "test";
Run Code Online (Sandbox Code Playgroud)
另外我不知道你为什么要将copy-constructor声明为显式,因为它不需要.只有在将CustomString对象声明为:时,显式复制构造函数才有效:
CustomString s(CustomString("test"));
Run Code Online (Sandbox Code Playgroud)