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;
调用
当用旧对象初始化新对象时,会调用复制构造函数;当对象作为非引用参数传递给函数时,也会调用复制构造函数。
当旧对象的值被赋给新对象时,会调用赋值运算符。

结论

复制构造函数和赋值运算符的区别在于,复制构造函数有助于创建已存在对象的副本,而不会改变已创建对象的原始值,而赋值运算符有助于为程序中的数据成员或对象赋予新值。

更新于:2022年7月27日

9K+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.