显式复制构造函数

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)

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

CustomString s( "test" );
Run Code Online (Sandbox Code Playgroud)

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

  • @ mkhan3189:您可以实现`CustomString s = customStringObjectOnStack;`而不是隐式地使用带有`=`语法的复制构造函数,您显式地调用复制构造函数:`CustomString s(customStringObjectOnStack);` (5认同)

For*_*veR 6

从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)

  • 只要OP _only_使用`CustomString`且不尝试通过`std :: string`指针`删除`新的CustomString`,那么_really_是否有关于此派生的任何不安全的信息? (2认同)