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

news/2024/5/19 0:09:45 标签: 构造函数, 拷贝构造, 委托构造

                       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)。




本专栏目录

  • C++拾遗 目录

所有内容目录

  • CCPP Blog 目录




http://www.niftyadmin.cn/n/1802121.html

相关文章

C++拾遗--函数模板

C拾遗--函数模板 前言 泛型的核心思想是数据与算法分离。函数模板是泛型编程的基础。 函数模板 函数模板以 template<arg_list> 开头&#xff0c;arg_list是泛型参数的列表。 1.模板的泛型参数个数确定 实例一 下面是一个加法函数模板&#xff0c;在实例化时&#…

C++拾遗--name_cast 显式类型转换

C拾遗--name_cast 显式类型转换 前言 C中提供了四种显式的类型转换方法&#xff1a;static_cast,const_cast,reinterpret_cast,dynamic_cast.下面分别看下它们的使用场景。 显式类型转换 1.staitc_cast 这是最常用的&#xff0c;一般都能使用&#xff0c;除了不能转换掉底层…

C++拾遗--模板元编程

C拾遗--模板元编程 前言 模板元是用于递归加速的&#xff0c;把运行期的函数调用变到编译期进行代码展开&#xff0c;类似于内联函数。下面看一个实例&#xff1a;斐波那契数列第n项求解。 模板元编程 #include <iostream> #include <ctime> using namespace std…

C++拾遗--智能指针

C拾遗--智能指针 前言 内存泄露是常见的问题&#xff0c;新标准中的智能指针从根本上解决了这个问题。所谓的智能指针&#xff0c;其智能性体现在&#xff1a;当没有对象使用某块动态分配的内存时&#xff0c;那就自动释放这片内存。 智能指针 下面这段程序可耗尽内存&#…

C++拾遗--malloc free与new delete的同与不同

C拾遗--malloc free与new delete的同与不同 前言 在C中我们常使用malloc和free来动态分配与释放内存&#xff0c;在C中对应的是new和delete。这里我们来探讨下他们的同与不同。 正文 1.内置类型 对相同的代码进行调试&#xff0c;查看内存 #include <iostream> using…

C++拾遗--new delete 重载

C拾遗--new delete 重载 前言new和delete是操作动态内存的一对操作。对它们重载可以对内存管理进行有效的定制。 正文 1.局部重载 特别针对某一类型&#xff0c;对new和delete进行重载&#xff0c;可以对该类型对象的动态创建实行监控。如下代码&#xff1a; 代码一#include &l…

C++拾遗--定位new表达式

C拾遗--定位new表达式 前言 new表达式&#xff0c;默认下把内存开辟到堆区。使用定位new表达式&#xff0c;可以在指定地址区域(栈区、堆区、静态区)构造对象&#xff0c;这好比是把内存开辟到指定区域。 正文 定位new表达式的常见形式 new(address) type;new(address) type…

C++拾遗--引用(左值引用、右值引用)

C拾遗--引用 前言 引用就是别名(alias)。所谓别名&#xff0c;就是对已存在的对象另起一个名字。本身含义并不难理解&#xff0c;但与其它概念一组合&#xff0c;就成了使用难点。再加上新标准提出了新的一种引用-右值引用&#xff0c;引用这一概念就变得更加难以理解和使用。…