Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;什么';当使用=赋值来初始化用户定义的类对象时,是什么过程?_C++_Constructor_Initialization_Variable Assignment_Assignment Operator - Fatal编程技术网

C++ C++;什么';当使用=赋值来初始化用户定义的类对象时,是什么过程?

C++ C++;什么';当使用=赋值来初始化用户定义的类对象时,是什么过程?,c++,constructor,initialization,variable-assignment,assignment-operator,C++,Constructor,Initialization,Variable Assignment,Assignment Operator,我定义了一个名为String的类,并使用=assignment声明了一个String对象来初始化它,但我对它背后的过程有一些疑问。让我们看看代码: class String{ public: String() :str(""){ cout << "default constructor" << endl; } String(int n); String(const char *p); String(const String &x)

我定义了一个名为String的类,并使用=assignment声明了一个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;
}
类字符串{
公众:

String():str(“”{cout您混淆了赋值和初始化

字符串s6=10;
不是赋值,而是初始化;更准确地说

1) 当使用由等号后跟表达式组成的初始值设定项声明非引用类型
T
的命名变量(自动、静态或线程本地)时


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

这不是赋值,这是

T object=other;
(1)

如果
T
是类类型
,并且
other
类型的cv非限定版本不是
T
或派生自
T,或者如果
T
是非类类型,但
other
类型是类类型,则用户定义的转换序列可以从类型转换为f检查
T
(或从
T
派生的类型,如果
T
是类类型且有转换函数可用),并通过重载解析选择最佳值。转换的结果,这是一个prvalue临时表达式(在C++17之前)prvalue表达式(从C++17开始)如果使用了转换构造函数,则用于直接初始化对象。

在您的情况下,
T object=other
转换为
T object(T(other))
()

最后一步通常经过优化,转换结果直接在分配给目标对象的内存中构造,但即使未使用,也需要相应的构造函数(移动或复制)可访问。(直到C++17)


选择的最后几个词解释了为什么在直接初始化期间没有调用复制构造函数。

您的代码(如发布的)无法编译。请发布一个
int _tmain(int argc, _TCHAR* argv[])
{
    String s6=10;
    cout << s6 << endl;
    return 0;
}