涉及到本文所讲知识点的博文:
C++之析构函数探究
C++之常引用和浅拷贝探究
C++之一个函数链的简单例子(分文件实现)
C++之Big Three:拷贝构造、拷贝赋值、析构函数探究
C++之操作符重载探究(五):赋值运算符重载和拷贝赋值函数(深拷贝)

Big Three:拷贝构造、拷贝赋值、析构函数(针对带着指针成员变量的类)。

例1:

例1分析:打字手累,直接贴好久好久以前研究本例知识点的笔记,有点啰嗦:

笔记第一页:

笔记第二页:

笔记第三页:

笔记第四页:

笔记第五页:

笔记第六页:

笔记第七页:(啥也没记)

笔记第八页:(啥也没记)

笔记第九页:

笔记第十页:(啥也没记)

附本例代码:

//小问学编程
#include <cstring>
#include <iostream>
using namespace std;class String
{public:String(const char* cstr=0);String(const String& str);String& operator=(const String& str);~String();char* get_c_str() const { return m_data; }
private:char* m_data;
};#include <cstring>inline
String::String(const char* cstr)
{if (cstr) {m_data = new char[strlen(cstr)+1];strcpy(m_data, cstr);}else {m_data = new char[1];*m_data = '\0';}
}inline
String::~String()
{delete[] m_data;
}inline
String& String::operator=(const String& str)
{if (this == &str)return *this;delete[] m_data;m_data = new char[ strlen(str.m_data) + 1 ];strcpy(m_data, str.m_data);return *this;
}inline
String::String(const String& str)
{m_data = new char[ strlen(str.m_data) + 1 ];strcpy(m_data, str.m_data);
}ostream& operator<<(ostream& os, const String& str)
{os << str.get_c_str();return os;
}int main()
{String s1("hello");String s2("world");String s3(s2);cout << s3 << endl;s3 = s1;cout << s3 << endl;cout << s2 << endl;cout << s1 << endl;
}

运行结果:

补充:拷贝构造函数

  拷贝构造函数:通过拷贝一个已经存在的对象来创建新的对象,也就是说,这个构造函数的参数就是另外一个对象。

  Vector(Vector& v);

  ♠\spadesuit♠ 用一个已存在的对象初始化另一个对象:

  classT object(another_object);

  classT object=another_object;
  (第二种情况编译器会调用拷贝构造函数而不是赋值操作。)

  ♠\spadesuit♠ 以传值的方式,给函数传递一个对象或从函数返回一个对象,也将调用拷贝构造函数;


注意:
  拷贝构造函数的参数,必须传引用,不能传值!!!
  如果拷贝构造函数的参数用传值的方式,那么当实参传递给拷贝构造函数的时候,拷贝构造函数的形参,为了复制实参,则又需要调用拷贝构造函数,即调用它自己,于是形成死循环。

补充:拷贝赋值函数(赋值运算符重载)

  下面的代码将调用赋值运算符重载:

  classT object;//创建一个对象
  classT another_object;//创建另一个对象
  object=another_object;//把一个对象赋值给另一个对象

补充:析构函数


例2:拷贝构造函数示例

附例2代码:

//小问学编程
#include<iostream>
using namespace std;class Vector
{public:Vector(int s=0);Vector(int*,int);Vector(const Vector& v);~Vector(){dispose();}int get_size()const {return size;}const Vector& operator=(const Vector& x);int& operator[](int index){return rep[index];}const int& operator[](int index)const{return rep[index];}
private:int* rep;int size;void clone(const Vector& a);void dispose();
};void Vector::clone(const Vector& a)
{this->size=a.size;rep=new int[size];for(int count=0;count<size;++count)rep[count]=a[count];
}void Vector::dispose()
{delete[] rep;
}Vector::Vector(int s):size(s)
{if(size<=0)rep=NULL;else{rep=new int[size];for(int count=0;count<size;++count)rep[count]=0;}
}Vector::Vector(int* a,int s):size(s),rep(new int[s])
{for(int count=0;count<size;++count)rep[count]=a[count];
}Vector::Vector(const Vector& v)
{clone(v);
}const Vector& Vector::operator=(const Vector&x)
{if(this!=&x){delete[] rep;this->size=x.size;rep=new int[size];for(int count=0;count<size;++count)rep[count]=x[count];}return *this;
}ostream& operator<<(ostream& os,const Vector& x)
{int s=x.get_size();for(int i=0;i<s;++i)os<<x[i];os<<endl;return os;
}bool operator==(const Vector& a,const Vector& b)
{bool yes=true;if(a.get_size()!=b.get_size())yes=false;else{int s=a.get_size(),index=0;while(index<s&&a[index]==b[index])++index;if(index<s)yes=false;}return yes;
}int main()
{Vector vec1;cout<<vec1<<endl;int array[5]={1,2,3,4,5};Vector vec2(array,5);cout<<vec2<<endl;Vector vec3(vec2);cout<<vec3<<endl;if(vec3==vec2){cout<<"The vector3 is equal to vector2"<<endl;}Vector vec4;vec4=vec3;cout<<vec4<<endl;return 0;
}

例3:构造函数析构函数调用示例

附例3代码:

//小问学编程
#include<iostream>
using namespace std;class Demo
{public:Demo(int n=0);//默认构造Demo(const Demo& a);//拷贝构造,参数必须传引用~Demo();//析构函数const Demo& operator=(const Demo& a);//拷贝赋值
private:int i;
};Demo::Demo(int n):i(n)//默认构造
{cout<<"default constructor called"<<endl;
}Demo::Demo(const Demo& a)//拷贝构造
{i=a.i;cout<<"copy constructor called"<<endl;
}Demo::~Demo(){cout<<"destructor called"<<endl;}//析构函数const Demo& Demo::operator=(const Demo& a)//拷贝赋值
{this->i=a.i;cout<<"assignment operator used"<<endl;return *this;
}//全局函数:传入一个临对象后,声明一个demo d,然后返回d的临时对象
Demo foo(Demo a){Demo d;return d;}int main()
{Demo a(2);//调用默认构造{Demo b;//调用默认构造b=foo(a);//先调用了全局函数foo//a是一个对象,//foo(a)调用了拷贝构造,//然后调用默认构造,产生临时对象形成返回值//把foo(a)返回的对象给对象b调用了拷贝赋值}//调用了3次析构函数Demo c=a;//调用拷贝构造return 0;//调用了2次析构函数
}

C++之Big Three:拷贝构造、拷贝赋值、析构函数探究相关推荐

  1. QObject 的拷贝构造和赋值操作

    QOject 中没有提供一个拷贝构造函数和赋值操作符给外界使用,其实拷贝构造和赋值的操作都是已经声明了的,但是它们被使用了Q_DISABLE_COPY () 宏放在了private区域.因此所有继承自 ...

  2. 构造、拷贝构造、赋值、析构

    需要注意的问题(当数据成员函数指针型变量,需要申请空间赋值时) 1.构造函数 ①需要给空指针申请一个'\0'的空间 2.拷贝构造函数 ①传入的参数,必须引用传递否则会出现无休止的拷贝构造 ②对其参数值 ...

  3. C++中拷贝构造、赋值构造的区别

    构造函数 是一种特殊的方法 主要用来在创建对象时初始化对象 即为对象成员变量赋初始值.一个类也可以有多个构造函数,用来初始化不同形式的类. 构造函数被调用通常发生在以下三种情况, 第一种情况就是用一个 ...

  4. 5. 三大函数:拷贝构造 拷贝赋值 析构函数

    String 类 拷贝构造和拷贝赋值应该怎么写 只要类里面带指针,一定不要用编译器的默认拷贝构造函数,一定要自己写 三个特殊函数 String (const char* cstr = 0); //构造 ...

  5. C++之拷贝构造、拷贝赋值

    拷贝构造 class Stu{public:int no;string name;int age; public:Stu(int no=10086, string name="jin&quo ...

  6. 拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元

     1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.第二种初始化的方式是直接在构造方法里面实现初始化. 案例如下: ...

  7. C++ 拷贝构造 与 赋值运算符重载

    拷贝构造 当我们创建了一个对象时,想让它的内容和一个已经创建好的对象的内容相同,那么就必须用到拷贝构造.拷贝构造编译器也会自动生成,也是C++类中的6个默认函数之一. 拷贝构造函数格式类名(const ...

  8. C++ 拷贝构造函数与赋值构造函数调用时机初步01

    #include <iostream> #include <string> using namespace std; class Person { public:char *m ...

  9. c++三大函数:拷贝构造(copy ctor)、拷贝赋值(copy op)、析构函数(dtor)

    Class的两个经典分类 Class without pointer member(s) complex Class with pointer member(s) string String clas ...

最新文章

  1. java正则表达式获取指定两个字符串之间内容
  2. Matlab心得及学习方法(不断更新)
  3. NR 5G AMF重定向的注册流程
  4. nginx 如何调用php文件,nginx php-fpm问题无法调用文件夹中的其他php文件
  5. wireshark筛选dhcp包_使用wireshark抓包工具,对DHCP、HTTP、DNS的数据包进行分析
  6. Java里面的静态代码块
  7. android addtextchangedlistener参数,【Android】关于addTextChangedListener()方法的上机记录...
  8. arduino智能浇花系统_创新成果 | 养花神器——智能浇花机
  9. 初学FineReport(二)
  10. 单链表的基础操作练习
  11. 开启中国区块链创造季! 2019区块链开发者大会来袭!(首批重磅嘉宾曝光)
  12. c语言综合性程序设计,《C语言程序设计》综合性实验报告撰写格式
  13. 172篇文献:NUS颜水成等发布首篇《深度长尾学习》综述
  14. html5播放器硬件加速,视频对比:Mango的HTML 5硬件加速很强?
  15. Origin画法——简单的分布图画法
  16. confluence 下admin用户密码恢复方法
  17. Technorati 推出博客广告媒体
  18. JAVA-企业微信报警工具类
  19. 天翼云80/8080/443端口访问不通问题
  20. 老程序员吐槽,今天面试了一个被培训班坑了的学生

热门文章

  1. Java队列Queue
  2. android studio创建构造方法,使用Android studio创建你的第一个项目
  3. ASP.NET Core学习——5
  4. centos 升级内核方法
  5. Unity3D 4.x怎样实现动画的Ping Pong效果
  6. Numpy数据的操作 * dot() multiply() 的区别
  7. NUnit.Framework在VS2015中如何进行单元测试
  8. [Email] 收发邮件的协议 : IMAP and SMTP , POP3 and SMTP
  9. poj1182食物链(种类并查集)
  10. 程序员编程艺术:第三章续、Top K算法问题的实现