C++声明自定义类对象使用=赋值初始化的过程是怎样的?

标签 c++ constructor initialization variable-assignment assignment-operator

我定义了一个名为String的类,我声明了一个String对象使用=赋值来初始化它,但是我对它背后的过程有一些疑问。让我们看看代码:

class String{
public:
    String() :str(""){ cout << "default constructor" << endl; }
    String(int n);
    String(const char *p);

    String(const String &x) :str(x.str)
    {
        cout << "copy constructor" << endl;
    }
    String& operator=(const String &x)
    {
        str = x.str;
        cout << "operator =" << endl;
        return *this;
    }
    string getStr() const
    {
        return str;
    }
private:
    string str;
};

ostream& operator<<(ostream &o,const String &x)
{
    o << x.getStr();
    return o;
}

String::String(int n)
{
    stringstream ss;
    ss << n;
    ss >> str;
    ss.clear();
    ss.str("");
    cout << "String(int n)" << endl;
}

String::String(const char *p)
{
    str = *p;
}

int _tmain(int argc, _TCHAR* argv[])
{
    String s6;
    s6 = 10;
    cout << s6 << endl;
    return 0;
}

结果如下图所示:

result1

好吧,这个好理解,先调用默认构造函数,再调用String::String(int n)构造函数,最后调用复制赋值。 然后我像这样修改主函数:

int _tmain(int argc, _TCHAR* argv[])
{
    String s6=10;
    cout << s6 << endl;
    return 0;
}

结果如下图: result2

我不明白为什么它不调用复制赋值,在这种情况下它背后的过程是什么?

最佳答案

你混淆了赋值和初始化。

String s6=10;不是赋值,而是初始化;更准确地说,copy intialization .

1) when a named variable (automatic, static, or thread-local) of a non-reference type T is declared with the initializer consisting of an equals sign followed by an expression.

所以 s6 是由适当的构造函数初始化/构造的,即 String::String(int),这里没有赋值。

关于C++声明自定义类对象使用=赋值初始化的过程是怎样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43886117/

相关文章:

r - R : Error in h2o. init() : H2O failed to start, 中的 H2O 初始化错误停止执行

initialization - 如何通过 keras 中的 numpy 数组初始化图层

c++ - 如何使用win32编写socket通信程序

c++ - 如何在 C++ 中连接两个字符串?

c# - 在 C# 中引发事件并在 C++ MFC 中捕获

c++ - 来自字符串的构造函数 VS 来自字符串的词法转换?

javascript - 覆盖原型(prototype)函数并正确继承其构造函数的最简洁方法是什么

c++ - 字符串指针的排序 vector

C# 优化新对象的创建(太多,丑陋的代码)

iphone - 如何使用 UISearchDisplayController 预加载或初始化搜索?