C++拾遗--构造函数(二)拷贝构造

本文探讨C++中的有名构造函数,重点讲解拷贝构造和委托构造。拷贝构造函数用于创建类的一个新实例,其内容复制自已存在的同类对象。而委托构造则是通过一个构造函数调用另一个构造函数来完成初始化。文章通过实例解释了浅拷贝和深拷贝的概念,并介绍了新标准中的委托构造机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                       C++拾遗--构造函数(二)拷贝构造

前言

    在构造函数(一)中讨论的是默认构造函数的一些应用。这里我们来探讨下其它的一些有名构造函数,及其它们的应用场景。

实例

#include <iostream>
using namespace std;

class Complex
{
protected:
	int real = 0;
	int imag = 0;
public:
	//默认构造
	Complex()
	{
		cout << "Complex()" << endl;
	}
	Complex(int r, int i) :real(r), imag(i)
	{
		cout << "Complex(int r, int i)" << endl;
	}
	//指定其它的构造函数完成自己的工作,相当于委托
	Complex(int r) :Complex(r, 0)
	{
		cout << "Complex(int r)" << endl;
	}
	Complex(Complex& com)     //拷贝构造的参数必须是引用类型
	{
		cout << "Complex(Complex& com)" << endl;
		real = com.real;
		imag = com.imag;
	}
	Complex& operator=(Complex& com)     //这里的参数可以是非引用的
	{
		cout << "Complex& operator=(Complex& com)" << endl;
		real = com.real;
		imag = com.imag;
		return *this;
	}
};
int main()
{
	Complex com1;            //默认初始化,调用Complex()默认构造
	cout << "---" << endl;
	Complex com2(com1);      //直接初始化,调用Complex(Complex& com)
	cout << "---" << endl;
	Complex com3 = com1;     //赋值初始化,调用Complex(Complex& com)
	cout << "---" << endl;
	Complex com4;            //默认初始化,调用Complex()默认构造
	cout << "---" << endl;
	com4 = com1;             //赋值,调用operator=(Complex& com)
	cout << "---" << endl;
	Complex com5(1, 1);      //调用指定的构造函数Complex(int r, int i)
	cout << "---" << endl;
	Complex com6(1);
	cin.get();
	return 0;
}
运行



有名构造函数

1.拷贝构造

类似于Complex(Complex& com, arg_list);其中的第一个参数必须是该类类型的引用类型,arg_list是可选的,若存在,则必须具有默认实参,这就是拷贝构造函数。

所谓的浅拷贝和深拷贝,针对的是指针成员,对于普通成员,则无区别。对于指针成员而言,仅仅复制一份地址,则是浅拷贝,若复制的是内容,则是深拷贝。

若复制的仅仅是一份地址,则多个对象会共用同一份资源,当其中一个对象被销毁,资源随之销毁。其它对象则受影响。这就是所谓的浅拷贝和深拷贝的问题。

2.委托构造

在新标准中把类似于 Complex(int r):Complex(r, 0){}的构造称为委托构造。

类比于设计模式:委托,可以很好理解。Complex(int r)把实际工作交给了Complex(r, 0)。




本专栏目录

所有内容目录



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值