【C++拷贝构造函数&深浅拷贝】

拷贝构造函数

注意:访问权限是public

拷贝构造函数:类名(const  类名& 对象名){}  可以有多个参数  。 没有常引用就是普通构造函数

如果不写,编译器自己会给一个(作用仅仅是赋值,默认拷贝构造函数一直都在)

#include<iostream>
using namespace std;

class person {
public:
	int age;
	string name;

	person(int age,string name):age(age),name(name) {
		cout << "含参构造函数" << endl; 
	}

	person(const person& p) {
		age = p.age;
		name = p.name;
		cout << "拷贝构造函数" << endl;
	}

	void show() {
		cout << "姓名:" << name << " | 年龄:" << age << endl;
	}
	~person() { cout << "析构函数" << endl; }
};

int main()
{
	person p1(100,"xxx");
	person p2(p1);   //p2=p1 效果一样
	p1.show();
	p2.show();

	return 0;
}

函数值传递过程中会调用拷贝构造函数,因为函数形参本身就是一份赋值

void f(person p) {
	p.show();
}

person p;
f(p);

函数以值的方式返回对象时,可能会调用拷贝构造函数(vs会,linux不会,g++做了优化)


person f(person p)
{
	person pf(p);
	return pf;
}

	person p(1, "sdf");
	person p2 = f(p);
	p2.show();

深浅拷贝

对空指针解引用是非法的       

#include<iostream>
using namespace std;

class person {
public:
	int a;
	int* p;
	person()
	{
		a = 0; p = nullptr;
		cout << "person构造函数" << endl;
	}

	person(const person& per)
	{
		a = per.a;
		//p = per.p;  //浅拷贝
		//深拷贝
		p = new int;    //分配内存
		*p = *per.p;    //拷贝数据

		cout << "person拷贝构造函数" << endl;
	}

	~person()   //浅拷贝问题:p1和p2指向同一个空间,p1销毁后,到p2销毁就会崩溃
	{
		delete p; 
		p = nullptr;
		cout << "person析构函数" << endl;
	}

	void show()
	{
		cout << a << " " << p << " " << *p << endl;
	}
};

int main()
{
	person p1;
	p1.a = 10; p1.p = new int(2);
	p1.show();

	person p2(p1);
	p2.show();

	return 0;
}

相关推荐

  1. C++ 拷贝构造函数

    2024-06-11 11:56:02       39 阅读
  2. C++ 拷贝构造函数

    2024-06-11 11:56:02       34 阅读
  3. [C++] 拷贝构造函数 && 深拷贝、浅拷贝

    2024-06-11 11:56:02       15 阅读
  4. C++拷贝构造函数介绍

    2024-06-11 11:56:02       34 阅读
  5. C++入门【37-C++ 拷贝构造函数

    2024-06-11 11:56:02       24 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-11 11:56:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-11 11:56:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-11 11:56:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-11 11:56:02       18 阅读

热门阅读

  1. Linux-应用编程学习笔记(字符串处理)

    2024-06-11 11:56:02       12 阅读
  2. ASP.NET的WebService跨域CORS问题解决方案

    2024-06-11 11:56:02       11 阅读
  3. Ubuntu中安装Eclipse C++的详细步骤

    2024-06-11 11:56:02       11 阅读
  4. 在 RISC-V 设计中发现可远程利用的漏洞

    2024-06-11 11:56:02       9 阅读
  5. VK Cup 2015 - Round 1 C. The Art of Dealing with ATM

    2024-06-11 11:56:02       12 阅读