一:拷贝构造函数

拷贝构造函数是一种特殊的构造函数,遵循如下的规则:

1.函数名和类名一致,没有返回值。

2.必须有一个参数,参数是本类型的一个引用变量。

3.拷贝构造函数可以访问参数对象的任意成员(private也可以)。

4.若自己不提供拷贝构造函数,系统会提供默认构造函数,若自己定义,系统将不再提供。

5.系统提供的拷贝构造是浅拷贝。

书写示例如下:

class Student
{
public:
//构造函数
Student(int a, char* p); //拷贝构造函数
Student(const Student& stu); char name[32];
int age;
};

拷贝构造函数调用

	//调用方法1
Object obj1;
Object obj2(obj1); //或者写成:Object obj2 = obj1; //调用方法2
Object obj1;
Object* obj2 = new Object(obj1);

二:浅拷贝

浅拷贝不开辟新空间,只增加一个指针,指向原有的内存。

#include <iostream>
using namespace std; class Student
{
public:
//构造函数
Student(const char* myName)
{
int len = strlen(myName);
name = new char[len + 1]{0};
strcpy_s(this->name, len+1, myName); cout << "构造:" << hex << (int)name << endl;
} //析构函数
~Student()
{
if (name)
{
cout << "析构:" << hex << (int)name << endl;
delete[] name;
name = NULL;
}
} //拷贝构造函数(浅拷贝)
Student(const Student& stu)
{
name = stu.name;
cout << "调用拷贝构造函数" << endl;
} private:
char* name;
}; int main()
{
{
Student stu1("hongshaorou"); Student stu2(stu1);
} }

运行过程中发生了崩溃

是因为对相同的内存地址做了两次析构导致,打印出内存地址一目了然。

三:深拷贝

深拷贝会开辟新的内存空间,把原有的对象复制过来。见下图:

对上边浅拷贝代码进行修改

class Student
{
public:
//构造函数
Student(const char* myName)
{
int len = strlen(myName);
name = new char[len + 1]{0};
strcpy_s(this->name, len+1, myName); cout << "构造:" << hex << (int)name << endl;
} //析构函数
~Student()
{
if (name)
{
cout << "析构:" << hex << (int)name << endl;
delete[] name;
name = NULL;
}
} //拷贝构造函数(深拷贝)
Student(const Student& stu)
{
int len = strlen(stu.name);
name = new char[len + 1];
strcpy_s(name, len + 1, stu.name);
cout << "调用拷贝构造函数" << hex << (int)name<< endl;
} private:
char* name;
};

再次运行不会发生崩溃现象,打印内存地址可见,开辟了内存空间。

最新文章

  1. [上架] iOS &quot;app-specific password&quot; 上架问题
  2. react+redux教程(三)reduce()、filter()、map()、some()、every()、...展开属性
  3. A book to recommend: The art of readable code
  4. vtk工作流
  5. C# HmacMD5 加密
  6. Android studio .gitignore 文件的内容
  7. 如何将控制台程序包装成windows服务
  8. ASCII,GB2312,GBK,Unicode,Utf-8
  9. uva439 - Knight Moves(BFS求最短路)
  10. jquery.qrcode.min.js生成二维码 通过前端实现二维码生成
  11. MVVM模式应用 之在ViewModel中使用NavigationService
  12. python远程批量执行命令
  13. 我也谈 AngularJS 怎么使用Directive, Service, Controller
  14. 计时器C#
  15. 关于VC++中virtual ~的含义
  16. Java虚拟机(四)垃圾收集算法
  17. HashMap 源码解析(一)之使用、构造以及计算容量
  18. ASP.NET MVC学习(二)之控制器Controller
  19. 链接sql数据库并输出csv文件
  20. 使用xshell5 从CentOS主机download资料

热门文章

  1. vue中代理实现方法
  2. learning scala repreated parameters
  3. SVN 常用 下载仓库
  4. 桥接:JS调用安卓方法报错Uncaught Error: Error calling method on NPObject
  5. Java int 与 Integer 区别
  6. ICEM-圆角正方体
  7. ACR Code Pacs
  8. 【转】ANDROIDROM制作(一)——ROM结构介绍、精简和内置、一般刷机过程
  9. ES 基本用法
  10. android: 结合BottomNavigationView、ViewPager和Fragment 实现左右滑动的效果