这两条线有什么不同吗

Are there any differences between these two lines?

本文关键字:什么 两条线      更新时间:2023-10-16

我们可以通过两种方式创建对象:

myClass myObject = myClass(123);
//or
myClass myObject(123);

这两个人的背景有什么不同吗?我想使用第一条,但它似乎结合了这两条线:

myClass myObject;
myObject= myClass(123);

第二个也做同样的事情吗?

myClass myVariable = myClass(123);

是复制初始化。

myClass myVariable(123);

是直接初始化。

myClass myVariable;
myVariable = myClass(123);

是默认初始化,然后是复制(或移动)分配。

通常,前两个是相同的,因为复制省略。相关规则可在[class.copy]/31(N4140,C++14标准草案)中找到:

当满足某些标准时,允许省略实现类对象的复制/移动构造[…]:

--当尚未绑定到引用的临时类对象(12.2)将被复制/移动到具有相同cv不合格类型,复制/移动操作可以通过将临时对象直接构建到省略复制/移动

最终我不知道。您已经描述了定义对象的三种方法,这三种方法都将对象放在堆栈的顶部,调用相同的构造函数。如果使用new运算符,则功能会有所不同。

这一行不使用赋值运算符(据我所知,这两行是等价的)。语法中使用了=,但实际上没有使用operator=

myClass myVariable = myClass(123);
//or
myClass myVariable(123);

这个使用赋值运算符:

myClass myVariable;
myVariable = myClass(123);

若赋值运算符执行得不好或并没有实现,第一个语句就可以工作,第二个语句可能(而且很可能)崩溃。

#include <iostream>
#include <string.h>
using namespace std;
class Dvector
{
public:
    Dvector( int thesize = 0 )
    {
        std::cout << "Constructing object of size " << thesize << std::endl;
        size = thesize;
        data = new double[size];
    }
    Dvector( const Dvector& v )
    {
        std::cout << "Constructing object of size " << v.size << " by copy" << std::endl;
        size = v.size;
        data = new double[size];
        memcpy( data, v.data, sizeof(double)*size );
    }
    Dvector& operator=( const Dvector& v )
    {
        std::cout << "Assigning object of size " << v.size << std::endl;
        if ( &v != this )
        {
            size = v.size;
            data = new double[size];
            memcpy( data, v.data, sizeof(double)*size );
        }
        return *this;
    }
    ~Dvector()
    {
        std::cout << "Destroying object" << std::endl;
        delete [] data;
    }
private:
    double* data;
    int size;
};
int main() {
    Dvector v = Dvector(3);
    return 0;
}

显示器:

Constructing object of size 3 
Destroying object

何时:

int main() {
    Dvector v;
    v = Dvector(3);
    return 0;
}

显示器:

Constructing object of size 0
Constructing object of size 3
Assigning object of size 3
Destroying object
Destroying object

如果没有定义复制构造函数,就会崩溃。。。因为CCD_ 4最终指向由临时变量(Dvector(3))分配的CCD_。尝试访问v.datav销毁(删除已释放的内存)时可能发生崩溃。