我不明白C ++中的赋值构造函数和复制构造函数之间的区别。就像这样:
class A {
public:
A() {
cout << "A::A()" << endl;
}
};
// The copy constructor
A a = b;
// The assignment constructor
A c;
c = a;
// Is it right?
我想知道如何分配赋值构造函数和复制构造函数的内存吗?
我不明白C ++中的赋值构造函数和复制构造函数之间的区别。就像这样:
class A {
public:
A() {
cout << "A::A()" << endl;
}
};
// The copy constructor
A a = b;
// The assignment constructor
A c;
c = a;
// Is it right?
我想知道如何分配赋值构造函数和复制构造函数的内存吗?
Answers:
一个拷贝构造函数用于初始化一个先前未初始化的一些其他对象的数据对象。
A(const A& rhs) : data_(rhs.data_) {}
例如:
A aa;
A a = aa; //copy constructor
一个赋值运算符是用来替换的数据之前初始化一些其他对象的数据对象。
A& operator=(const A& rhs) {data_ = rhs.data_; return *this;}
例如:
A aa;
A a;
a = aa; // assignment operator
您可以将副本构造替换为默认构造加上分配,但这会降低效率。
(作为附带说明:上面的实现正是编译器免费授予您的实现,因此手动实现它们没有多大意义。如果您拥有这两种实现之一,则可能是您在手动管理某些资源。在这种情况下,按照“三则规则”,您很可能还需要另一个加一个析构函数。)
=default;
。
= default
在需要默认ctor的地方将它们分类:仅靠我们自己实现一个空主体仍然算作用户定义的ctor,因此(在Standardese级别上) )并非无关紧要,并且会从需要普通ctor的分类中取消类型的资格。
:)
您会再次尝试解释您在说什么吗?
复制构造函数和赋值运算符之间的差异给新程序员带来了很多困惑,但实际上并不是那么困难。总结:
赋值运算符的示例:
Base obj1(5); //calls Base class constructor
Base obj2; //calls Base class default constructor
obj2 = obj1; //calls assignment operator
复制构造函数示例:
Base obj1(5);
Base obj2 = obj1; //calls copy constructor
vector <A> v3
,然后v3 = v2
(v2
先前声明并包含元素的位置vector<A>
)调用我的显式A
的副本构造函数而不是operator=
?我期待operator=
被调用,而不是copy constructor
因为我的v3
目标在那里我做了分配的时间已经宣布
第一个是复制初始化,第二个是赋值。没有赋值构造函数之类的东西。
A aa=bb;
使用编译器生成的副本构造函数。
A cc;
cc=aa;
使用默认的构造函数来构造cc
,然后使用* assignment运算符**(operator =
)对已经存在的对象进行构造。
我想知道如何分配赋值构造函数和复制构造函数的内存吗?
在这种情况下,IDK是指分配内存的意思,但是如果您想知道会发生什么,则可以:
class A
{
public :
A(){ cout<<"default constructor"<<endl;};
A(const A& other){ cout<<"copy constructor"<<endl;};
A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};
我还建议您看一下:
@Luchian Grigore Said的实现是这样的
class A
{
public :
int a;
A(){ cout<<"default constructor"<<endl;};
A(const A& other){ cout<<"copy constructor"<<endl;};
A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};
void main()
{
A sampleObj; //Calls default constructor
sampleObj.a = 10;
A copyConsObj = sampleObj; //Initializing calls copy constructor
A assignOpObj; //Calls default constrcutor
assignOpObj = sampleObj; //Object Created before so it calls assignment operator
}
输出值
默认构造函数
复制构造函数
默认构造函数
赋值运算符
复制构造函数和赋值构造函数之间的区别是:
<classname> <o1>=<o2>
)<o1>=<o2>
)。而且两者的基本功能都相同,它们会将数据从o2逐个成员复制到o1。
我想在这个话题上再加一点。“赋值运算符的运算符功能应仅作为类的成员函数编写。” 与其他二进制或一元运算符不同,我们不能将其作为好友函数。