C++中复制构造函数和赋值运算符的区别
C++是一种通用的、中级语言、区分大小写、与平台无关的编程语言,支持面向对象编程的概念。C++由Bjarne Stroustrup于1979年在贝尔实验室创建。由于C++是一种与平台无关的编程语言,因此它可以用于各种系统,包括Windows、Mac OS和各种UNIX版本。
C++中的运算符用于对值和变量执行特定操作。以下是C++中使用的运算符列表:
算术运算符
赋值运算符
比较运算符
关系运算符
逻辑运算符
位运算符
一元运算符
三元/条件运算符。
在上述组中,赋值运算符用于为变量赋值。
在学习复制构造函数之前,让我们简要了解一下构造函数。C++中的构造函数是一种特殊的方法,其名称与类名相同,并带有括号“()”,在创建对象时会自动调用。构造函数用于初始化新创建的对象的变量。
复制构造函数是一种构造函数,它使用同一类中先前创建的另一个对象来初始化对象。
现在让我们详细了解一下,并比较和对比复制构造函数和赋值运算符的各种特性。
什么是赋值运算符?
赋值运算符用于为变量赋值。赋值运算符的左操作数是变量名,右操作数是该变量的值。如果两种操作数的数据类型不同,则会引发编译错误。
赋值运算符的类型有:
= 运算符 − 它只为变量赋值。例如,“a=10”,这里值10将被赋给变量“a”。
+= 运算符 −此运算符首先将变量的当前值加上右边的值,然后将新值赋给变量。
-= 运算符 −此运算符首先将变量的当前值减去右边的值,然后将新值赋给变量。
*= 运算符 −此运算符首先将变量的当前值乘以右边的值,然后将新值赋给变量。
/= 运算符 −此运算符首先将变量的当前值除以右边的值,然后将新值赋给变量。
赋值运算符示例
让我们来看一个赋值运算符的例子。这里我们使用赋值运算符为不同的变量赋值。
#include <iostream>
int main() {
// Write C++ code here
int a=5,b;
b=a;
std::cout << "The value of a is "<<a<<"\n";
std::cout << "The value of b is "<<b;
return 0;
}输出
在上面的例子中,我们使用了两个变量“a”和“b”,首先我们通过赋值运算符“=”将a的值赋为5。我们将a的值赋给变量b。上述代码将产生如下输出。
The value of a is 5. The value of b is 5.
什么是复制构造函数?
这在编程中通常是必需的,以便在不影响原始对象的情况下创建对象的单独副本。在这些情况下,复制构造函数派上用场。复制构造函数是一种构造函数,它通过使用同一类中先前创建的对象来初始化对象来创建对象。复制构造函数有两种类型。
默认复制构造函数 − 当未声明复制构造函数时,C++编译器会创建一个默认构造函数,它按原样复制所有成员变量。
用户定义的复制构造函数 − 用户定义的复制构造函数称为用户定义的复制构造函数。
语法
复制构造函数的语法为:
Class_Name(Class_name & oldobject)
{
// Body of constructor
}复制构造函数 - 示例
复制构造函数用于从同一类的另一个对象初始化一个对象,将对象复制为函数的参数,以及将对象复制为函数的参数。要从函数返回对象,请复制该对象。
示例
让我们来看一个例子,了解我们如何精确地使用复制构造函数。
#include<iostream>
using namespace std;
class Example {
int x, y; //data members
public:
Example(int a, int b) {
x = a;
y = b;
}
/* Copy constructor */
Example(Example & ex) {
x = ex.x;
y = ex.y;
}
void display() {
cout << x << " " << y << endl;
}
};
/* main function */
int main() {
Example obj1(20, 30); // Normal constructor
Example obj2 = obj1; // Copy constructor
cout << "Normal constructor : ";
obj1.display();
cout << "Copy constructor : ";
obj2.display();
return 0;
}在上面的例子中,我们把类名定义为Example,并创建了一个构造函数,并将值20和30传递给构造函数。语句Example (Example &ex) 表示复制构造函数。它复制先前创建的数据成员的值。
输出
上述代码将产生以下输出:
Normal constructor : 20 30 Copy constructor : 20 30
在我们的示例中,我们创建了两个对象obj1和obj2,我们将obj1的值赋给obj2。
复制构造函数和赋值运算符的比较
C++中这两个概念的主要目的是赋值,但两者之间的主要区别在于,复制构造函数创建一个新对象并赋值,而赋值运算符不会创建新对象,而是将值赋给同一对象的数据成员。
下表重点介绍了复制构造函数和赋值运算符之间的主要区别。
| 比较依据 | 复制构造函数 | 赋值运算符 |
|---|---|---|
| 基本比较 |
|
|
| 内存管理 | 已创建的旧对象和调用的新对象将共享不同的内存位置。 | 第一个对象和第二个对象(第二个对象被赋予第一个对象的值)共享相同的内存位置。 |
| 语法 | 复制构造函数的语法为:Class_name(Class_name &Old_obj); | 赋值运算符的语法为:Class name Obj1, Obj2; Obj2=Obj1; |
| 调用 | 当用旧对象初始化新对象时,会调用复制构造函数;当对象作为非引用参数传递给函数时,也会调用复制构造函数。 | 当旧对象的值被赋给新对象时,会调用赋值运算符。 |
结论
复制构造函数和赋值运算符的区别在于,复制构造函数有助于创建已存在对象的副本,而不会改变已创建对象的原始值,而赋值运算符有助于为程序中的数据成员或对象赋予新值。
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP