明确的拷贝构造函数明确的拷贝构造函数(Explicit copy constructor)

2019-05-12 04:19发布

我已延长的std :: string履行编写自定义功能,建设成所谓的CustomString String类的我的需要

我有定义的构造函数:

    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");

我不知道哪儿是铸造明确需要。

如果拷贝构造函数不明确的,但我想知道和实施明确的定义,而不是“猜测正确投”代码工作正常的。

Answer 1:

显式的拷贝构造函数意味着拷贝构造函数不会被隐式调用,这是在表达发生了什么:

CustomString s = CustomString("test");

这表达的字面意思是:创建一个临时CustomString使用,需要一个构造函数const char* 。 隐式调用拷贝构造函数CustomString从该临时复制到s

现在,如果代码是正确的(即,如果拷贝构造函数是不明确的),编译器将避免临时的创建和通过构建的的Elid副本s直接与字符串常量。 但是编译器仍然必须检查建筑可以做到和失败在那里。

您可以显式调用拷贝构造函数:

CustomString s( CustomString("test") );

不过,我建议你完全避免暂时的,只是创建sconst char*

CustomString s( "test" );

这就是编译器会做呢?



Answer 2:

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

CustomString s = "test";

此外,我不知道你为什么会想声明一个拷贝构造函数明确的,至于是不是需要它。 如果你声明的CustomString对象作为一个明确的拷贝构造函数只会工作:

CustomString s(CustomString("test"));


文章来源: Explicit copy constructor