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

1.什么是复制构造函数

复制构造函数:是构造函数,其只有一个参数,参数类型是所属类的类型,且参数是一个const引用。

作用:将本类的成员变量赋值为引用形参的成员变量。

2.什么是赋值操作符

赋值操作符:返回值是本类的引用类型,参数类型是所属类的类型,且参数是一个const引用。

作用与复制构造函数相同。

其声明如下:

1 Sales_item& operator=(const Sales_item& rig);

3.什么情况下需要我们自己实现复制构造函数和赋值操作符?

一般情况下,C++会帮助我们实现复制构造函数和赋值操作符,但是当我们定义的类的成员变量中包含指针时,必须自己实现复制构造函数和赋值操作符,同时也要实现析构函数。

4.代码如下:

(1)自定义Sales_item类,实现了构造函数,析构函数,复制构造函数和赋值操作符。

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 class Sales_item
 5 {
 6 public:
 7     Sales_item()
 8     {
 9         this->number = 0;
10         this->acount = 0.0;
11     }
12
13     Sales_item(const string &isbnstr)
14     {
15         this->isbn = isbnstr;
16         this->number = 0;
17         this->acount = 0.0;
18     }
19
20     //复制构造函数:如果自己不写,C++会默认提供一个
21     //复制构造函数:只接收一个参数 ,参数的类型是当前类,并且是一个const的引用
22     //作用:是将形参的数据成员一一赋给当前的数据成员
23     Sales_item(const Sales_item& other)
24     {
25         isbn = other.isbn;
26         number = other.number;
27         acount = other.acount;
28         cout<<"复制构造函数被调用...."<<endl;
29     }
30
31
32   //赋值操作符:如果自己不写,C++会默认提供一个
33   //返回值是本类的引用,接收一个参数,参数的类型是当前类,并且是一个const的引用
34     Sales_item& operator= (const Sales_item &other)
35     {
36         isbn = other.isbn;
37         number = other.number;
38         acount = other.acount;
39         cout<<"赋值操作符 被调用...."<<endl;
40         return *this;
41     }
42
43     //一般情况下,C++会帮我们实现 复制构造函数和赋值操作符
44     //但是当一个类的数据成员有指针的时候,我们必须自己实现复制构造函数和赋值操作符
45 private:
46     string isbn;
47     int number;
48     double acount;
49 };

(2)主方法:

1 int main()
2 {
3     Sales_item a;
4     Sales_item b("0-12-djf-X");
5     Sales_item c(b); //调用复制构造函数
6     a = b; //调用赋值操作符
7     return 0;
8 } 

5.带有指针成员变量的自定义类:

 1 class NoName
 2 {
 3 public :
 4     NoName()
 5     {
 6         sPtr = new string;
 7         number = 0;
 8     }
 9     ~NoName()
10     {
11         delete sPtr;
12     }
13     //复制构造函数
14     NoName(const NoName& str)
15     {
16         sPtr = new string;
17         *sPtr = *(str.sPtr);//注意:进行的是指针所指向值的赋值,而不是指针的重新赋值
18          number = str.number;
19     }
20
21     //赋值操作符
22     NoName& operator=(const NoName &rig)
23     {
24         sPtr = new string;
25         *sPtr = *(rig.sPtr);//注意:进行的是指针所指向值的赋值,而不是指针的重新赋值
26          number = rig.number;
27          return *this;
28     }
29 private:
30     string *sPtr;
31     int number;
32 }; 

6.总结复制构造函数和赋值操作符

复制构造函数:是指将构造函数的参数一一给本类的对象的赋值,对于指针而言,不是指针的赋值,而是指针所指向的数据的赋值。
具体代码如下:

 1 class NoName{
 2 private:
 3   string *str;
 4   int i;
 5   double b;
 6 };
 7 NoName(const NoName &other)
 8 {
 9   str = new string;
10   *str = *(other.str);
11   i = other.i;
12   b = other.b;
13 }
赋值操作符: 函数声明
 1 NoName& operator=(const NoName &rig);
 2 NoName& operator=(const NoName &rig)
 3 {//内容跟复制构造函数的一样
 4     str = new string;
 5     *str = *(rig.str);
 6     i = rig.i;
 7     b = rig.b;
 8
 9     return *this;
10 }

7.析构函数三原则:

如果写了析构函数,则同时必须写复制构造函数和赋值操作符。

时间: 2024-07-30 14:44:51

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

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

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

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

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

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

记得在复制构造函数和赋值操作符的参数类型上加上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++之复制构造函数和赋值操作符

拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象.拷贝构造函数通常用于: 通过使用另一个同类型的对象来初始化新创建的对象. 复制对象把它作为参数传递给函数. 复制对象,并从函数返回这个对象. 如果在类中没有定义拷贝构造函数,编译器会自行定义一个.如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数.拷贝构造函数的最常见形式如下: classname (const classname &obj) { // 构造函数的主体 } 在这里,o

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

强调一下几个重点: (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形参). 赋值操作符 赋值 是二元运算, 所以该操作符函数有两个形参: 第一个形参对应着左操作数, 第二个形参对应右操作数. 大多数操作符可以定义为成员函

复制构造函数 与 赋值函数 的区别(转)

转自:jihite 构造函数.析构函数.赋值函数是每个类最基本的的函数.每个类只有一个析构函数和一个赋值函数.但是有很多构造函数(一个为复制构造函数,其他为普通构造函数.对于一个类A,如果不编写上述四个函数,c++编译器将自动为A产生四个默认的函数,即: A(void)                                    //默认无参数构造函数 A(const A &a)                         //默认复制构造函数 ~A(void);