c++ 学习之 构造函数的使用

上代码

复制代码
class person
{
public:
	person()
	{
		cout << " person 的无参默认构造函数 " << endl;
	}
	person(int age)
	{
		cout << " person 的有参默认构造函数 " << endl;
		m_age = age;
	}
	person(const person& other)
	{
		cout << " 调用拷贝构造函数 " << endl;
		m_age = other.m_age;
	}
	~person()
	{
		cout << " person 的析构函数 " << endl;
	}

private:
	int m_age;
};

// 拷贝构造函数调用时机

// 1.使用一个已经创建完毕的对象来初始化一个新的对象
void test01()
{
	person p1(20);
	person p2(p1);
}


// 2.值传递的方式给函数参数传值
void doWork(person p)   // 这是值传递
{

}
void test02()
{
	person p;
	doWork(p);
}
// 3.值方式返回局部对象

person doWork2()  
{
	person p1;   // 创建在栈,这个函数结束的时候内存被回收
	return p1;   //  返回的其实是拷贝构造
}

int main()
{
	test01();
	test02();
	doWork2();
}

正文

在上面的代码中,定义了一个名为person的类,并实现了默认构造函数、有参构造函数、拷贝构造函数以及析构函数。然后,使用不同的方式调用了拷贝构造函数,让我们逐步解释拷贝构造函数的作用和调用时机:

使用一个已经创建完毕的对象来初始化一个新的对象(test01函数):

复制代码
person p1(20);  // 创建一个p1对象,并使用有参构造函数初始化
person p2(p1);  // 使用p1对象来初始化p2对象,这里调用了拷贝构造函数

这里拷贝构造函数的作用是将已经存在的对象(p1)的属性值复制给新创建的对象(p2)。这是通过对象的初始化来触发的拷贝构造函数调用。

值传递的方式给函数参数传值(test02函数):

复制代码
void doWork(person p) {
    // 函数内部,创建了一个person对象p,使用拷贝构造函数将传入的p复制到局部对象p中
}
void test02() {
    person p;
    doWork(p);  // 通过值传递方式将p传递给doWork函数,这里也会触发拷贝构造函数的调用
}

当你调用doWork函数时,将一个person对象作为参数传递,实际上会触发拷贝构造函数的调用,将传递的对象复制到函数内部的局部对象中。

值方式返回局部对象(doWork2函数):

person doWork2() {

person p1; // 创建在栈上的局部对象

return p1; // 返回局部对象,这里也会触发拷贝构造函数的调用

}

在doWork2函数内部,你创建了一个person对象p1,然后尝试返回它。由于p1是一个局部对象,当函数返回时,它会被销毁。但在返回时,会触发拷贝构造函数的调用,将p1的副本返回给调用者。

总之,拷贝构造函数的主要作用是用于对象的复制操作,无论是通过初始化新对象、值传递参数还是返回局部对象,都可能触发拷贝构造函数的调用,以确保新对象与原对象具有相同的属性值。这对于在不同作用域中共享对象的副本以及确保对象的正确复制非常重要。同时,要注意在拷贝构造函数中,通常需要深拷贝对象的资源,以避免资源共享问题。

相关推荐
Lyyaoo.2 小时前
【JAVA基础面经】JVM的内存模型
java·开发语言·jvm
杨凯凡2 小时前
【017】泛型与通配符:API 设计里怎么用省心
java·开发语言
MY_TEUCK8 小时前
Sealos 平台部署实战指南:结合 Cursor 与版本发布流程
java·人工智能·学习·aigc
2401_873479408 小时前
如何利用IP查询定位识别电商刷单?4个关键指标+工具配置方案
开发语言·tcp/ip·php
我爱cope9 小时前
【从0开始学设计模式-10| 装饰模式】
java·开发语言·设计模式
菜鸟学Python9 小时前
Python生态在悄悄改变:FastAPI全面反超,Django和Flask还行吗?
开发语言·python·django·flask·fastapi
浪浪小洋10 小时前
c++ qt课设定制
开发语言·c++
charlie11451419110 小时前
嵌入式C++工程实践第16篇:第四次重构 —— LED模板,从通用GPIO到专用抽象
c语言·开发语言·c++·驱动开发·嵌入式硬件·重构
handler0110 小时前
Linux: 基本指令知识点(2)
linux·服务器·c语言·c++·笔记·学习
故事和你9110 小时前
洛谷-数据结构1-4-图的基本应用1
开发语言·数据结构·算法·深度优先·动态规划·图论