赋值运算符和复制构造函数有什么区别?
What's the difference between assignment operator and copy constructor?
我不明白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?
我想知道如何分配赋值构造函数和复制构造函数的内存?
复制构造函数用于从其他对象的数据初始化之前未初始化的对象。
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
您可以用默认的构造加指定来替换复制构造,但这样效率会降低。
(附带说明:我上面的实现正是编译器免费提供给你的,所以手动实现它们没有多大意义。如果你有这两个中的一个,很可能你正在手动管理一些资源。在这种情况下,根据三规则,你很可能还需要另一个加上析构函数。)
复制构造函数和赋值运算符之间的差异给新程序员带来了很多困惑,但实际上并没有那么困难。总结:
- 如果在进行复制之前必须创建新对象,则使用复制构造函数
- 如果在进行复制之前不必创建新对象,则使用赋值运算符
赋值运算符示例:
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
第一个是复制初始化,第二个只是赋值。没有赋值构造函数这回事。
A aa=bb;
使用编译器生成的副本构造函数。
A cc;
cc=aa;
使用默认构造函数构造cc
,然后对已存在的对象使用*赋值运算符**(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;}
};
我还建议你看看:
为什么调用复制构造函数而不是转换构造函数?
什么是"三条规则"?
简单地说,
复制构造函数是在从现有对象创建新对象时调用的,作为现有对象的副本。当一个已经初始化的对象从另一个现有对象中分配了一个新值时,就会调用赋值运算符。
示例-
t2 = t1; // calls assignment operator, same as "t2.operator=(t1);"
Test t3 = t1; // calls copy constructor, same as "Test t3(t1);"
复制构造函数和赋值构造函数之间的区别是:
- 在复制构造函数的情况下,它会创建一个新对象。(
<classname> <o1>=<o2>
) - 在赋值构造函数的情况下,它不会创建任何对象,这意味着它应用于已创建的对象(
<o1>=<o2>
)
两者的基本功能相同,它们将逐个成员将数据从o2复制到o1。
@Luchian Grigore所说的是这样实现的
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
}
输出
默认构造函数
复制构造函数
默认构造函数
分配操作员
我想在这个主题上再加一点。"赋值运算符的运算符函数只能作为类的成员函数编写。"我们不能像其他二进制或一元运算符那样将其作为友元函数。
关于复制构造函数需要添加的内容:
-
当通过值传递对象时,它将使用复制构造函数
-
当一个对象通过值从函数返回时,它将使用复制构造函数
-
使用另一个对象的值初始化对象时(如您所举的示例)。
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?