显式复制构造函数

时间:2012-07-14 02:29:20

标签: c++ copy-constructor assignment-operator stdstring explicit

我扩展了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);
    ... };

在第三个构造函数(复制构造函数)和赋值运算符中,其定义为:

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;
}

首先,因为这是“明确的”;意味着需要显式转换以分配给另一个CustomString对象;它抱怨任务。

CustomString s = CustomString("test");

我不确定是否需要明确地进行投射。

如果复制构造函数不是显式的,代码可以正常工作,但我想知道并实现显式定义,而不是“猜测正确的强制转换”。

2 个答案:

答案 0 :(得分:27)

显式复制构造函数意味着不会隐式调用复制构造函数,这就是表达式中发生的情况:

CustomString s = CustomString("test");

此表达式的字面意思是:使用带CustomString的构造函数创建临时const char*。隐式调用CustomString的复制构造函数将该临时复制到s

现在,如果代码是正确的(即如果复制构造函数不明确),编译器将通过直接使用字符串文字构造s来避免创建临时文件并删除副本。但是编译器仍然必须检查构造是否可以完成并在那里失败。

您可以显式调用复制构造函数:

CustomString s( CustomString("test") );

但我建议您完全避免临时性,只需使用s创建const char*

CustomString s( "test" );

无论如何,编译器会做什么......

答案 1 :(得分:5)

从std :: string派生是不安全的,因为std :: string没有虚拟析构函数。至于你的问题 - 你的副本构造函数不应该是明确的,以允许这样的用法:

CustomString s = "test";

此外,我不知道你为什么要将copy-constructor声明为显式,因为它不需要。 只有在将CustomString对象声明为:

时,显式复制构造函数才有效
CustomString s(CustomString("test"));