C++之复制构造函数和赋值操作符

拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于:

  • 通过使用另一个同类型的对象来初始化新创建的对象。
  • 复制对象把它作为参数传递给函数。
  • 复制对象,并从函数返回这个对象。

如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。拷贝构造函数的最常见形式如下:

classname (const classname &obj) { // 构造函数的主体 }

在这里,obj 是一个对象引用,该对象是用于初始化另一个对象的。

 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4
 5 using namespace std;
 6 //复制构造函数和赋值操作符 如果不写C++会默认写一个
 7
 8 class Sales_item
 9 {
10 public:
11     //普通的构造函数
12     Sales_item():units_sold(0),revenue(0.0){}
13     Sales_item(const string &book):
14         ibsn(book),
15         units_sold(0),
16         revenue(0.0){}
17     //复制构造函数 参数为类的引用
18     Sales_item(const Sales_item &orig):
19         ibsn(orig.ibsn),
20         units_sold(orig.units_sold),
21         revenue(orig.revenue)
22         {
23             cout<<"复制构造函数被调用了"<<endl;
24         }
25
26     //赋值操作符
27     Sales_item &operator=(const Sales_item &rhs)
28     {
29         cout<<"赋值操作符被调用了"<<endl;
30         ibsn=rhs.ibsn;
31         units_sold=rhs.units_sold;
32         revenue=rhs.revenue;
33         return *this;
34     }
35 private:
36     string ibsn;
37     unsigned units_sold;
38     double revenue;
39 };
40
41 int main()
42 {
43     Sales_item a;
44     Sales_item b("0-12025-X");
45     //复制构造函数被调用了
46     Sales_item c(b);
47     //赋值操作符被调用了
48     a=b;
49
50     cout<<"=========="<<endl;
51     vector<Sales_item> icv(5);
52     return 0;
53 }

原文地址:https://www.cnblogs.com/yh2924/p/12642844.html

时间: 2024-10-15 05:34:30

C++之复制构造函数和赋值操作符的相关文章

C++学习基础六——复制构造函数和赋值操作符

1.什么是复制构造函数 复制构造函数:是构造函数,其只有一个参数,参数类型是所属类的类型,且参数是一个const引用. 作用:将本类的成员变量赋值为引用形参的成员变量. 2.什么是赋值操作符 赋值操作符:返回值是本类的引用类型,参数类型是所属类的类型,且参数是一个const引用. 作用与复制构造函数相同. 其声明如下: 1 Sales_item& operator=(const Sales_item& rig); 3.什么情况下需要我们自己实现复制构造函数和赋值操作符? 一般情况下,C++

C++ Primer 学习笔记_54_类与数据抽象 --复制构造函数、赋值操作符

复制控制 --复制构造函数.赋值操作符 引言: 当定义一个新类型时,需要显式或隐式地指定复制.赋值和撤销该类型的对象时会发生什么– 复制构造函数.赋值操作符和析构函数的作用!      复制构造函数:具有单个形参,该形参(常用const修饰)是对该类类型的引用.当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式的使用复制构造函数:当将该类型的对象传递给函数或者从函数返回该类型的对象时,将隐式使用复制构造函数.     析构函数:作为构造函数的互补,当对象超出作用域或动态分配的对象被删除

复制构造函数和赋值操作符的注意点.

记得在复制构造函数和赋值操作符的参数类型上加上const.正确的复制构造函数应该是X::X(const X&)这种,而不是X::X(X&)这种,这里有两个原因. 第一:绑定一个非const引用到一个临时对象是非法的.使用X::X(X&)作为复制构造函数不会允许复制任何特殊表达式的结果.为什么呢.?因为引用的初始化规则规定了不能将临时变量作为引用的初始化值. 而常量引用除外. 此外:防止修改引用的值(这个大家都知道). 同样的道理: X::operator=(const X&

13.1——复制构造函数,赋值操作符,析构函数

如果没有显式的定义复制构造函数和赋值操作符以及析构函数,编译器会为我们定义. 复制构造函数: (1)是一种特殊的构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用. (2)当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式的使用复制构造函数. (3)当将该类型的对象传递给函数或从函数返回该类型的对象时,将隐式的使用复制构造函数. 析构函数: (1)是构造函数的互补,当对象超过了作用域,或动态分配的对象被删除时,将自动的应用析构函数. (2)析构函数释放对象构造时所获

C++11六大函数(构造函数,移动构造函数,移动赋值操作符,复制构造函数,赋值操作符,析构函数)

在C++中,有三大函数复制控制(复制构造函数,赋值操作符,析构函数),而在C++11中,加入了移动构造函数,移动赋值操作符.我就斗胆将他们命名为六大函数好了. 一.构造函数 c++primer中说过:构造函数是特殊的成员函数,只要创建类类型的新对象,都要执行构造函数.构造函数的工作就是保证每个对象的数据成员具有合适的初始值. 构造函数与其他函数不同:构造函数和类同名,没有返回类型. 构造函数与其他函数相同:构造函数也有形参表(可为void)和函数体.  (参数表为void的构造函数为默认构造函数

字符串类的实现:构造函数、析构函数、复制构造函数和赋值操作符

强调一下几个重点: (1)new 操作符申请内存失败,是抛出异常,并不是返回NULL,若想申请失败返回NULL,需要加 (std::nothrow): (2)使用std::nothrow 需要加头文件 #include<new> (3)使用assert (4)构造函数有参数时最好加默认参数,这样就有默认构造函数了,且不要忘了定义为const (5)赋值操作符函数体if语句中的条件必须是 this != &other,为什么if(*this != other)不行???? 刚想了下原因是

C++复制构造函数和赋值符的区别

From  http://blog.csdn.net/randyjiawenjie/article/details/6666937 感谢原作者分享. class CTest{public: CTest(); //构造函数 CTest(const CTest &); //复制构造函数 CTest & operator = (const CTest &); //赋值符}; CTest::CTest(){ cout<<"Constructor of CTest&qu

c++ 复制控制 之赋值操作符

 重载操作符      重载操作符是一些函数, 其名字为operator后跟着其所定义的操作符符号.  如operator =, operator +, operator * 等等. 操作符函数和普通函数一样, 也是 返回值 + 函数名 + (形参表) , 形参表必须具有与该操作符操作数数目相同的形参(如果操作符是一个成员, 则包括隐式this形参). 赋值操作符 赋值 是二元运算, 所以该操作符函数有两个形参: 第一个形参对应着左操作数, 第二个形参对应右操作数. 大多数操作符可以定义为成员函

拷贝构造函数和赋值操作符

假设有一个如下的MyClass类: class MyClass { public: //构造函数 //拷贝构造函数 MyClass(const MyClass& that) : int_data_(that.int_data_), dbl_data_(that.dbl_data_), str_data_(that.str_data_) { } //赋值操作符 MyClass& operator = (const MyClass& that) { if(this != that) {