当前位置: 首页 > news >正文

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的副本返回给调用者。

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

http://www.lryc.cn/news/152106.html

相关文章:

  • 算法通关村15关 | 超大规模数据场景常见问题
  • qemu编译与使用
  • bazel远程构建(Remote Execution)
  • uniapp 微信小程序仿抖音评论区功能,支持展开收起
  • js:创建一个基于vite 的React项目
  • 论文阅读_医疗知识图谱_GraphCare
  • Android 蓝牙开发( 四 )
  • 涂鸦智能携手亚马逊云科技 共建“联合安全实验室” 为IoT发展护航
  • Oracle21C--Windows卸载与安装
  • 关于 MySQL、PostgresSQL、Mariadb 数据库2038千年虫问题
  • Linux - Docker 安装使用 常用命令 教程
  • AtCoder Beginner Contest 318 G - Typical Path Problem 题解
  • 21.4 CSS 盒子模型
  • MybatisPlus入门
  • 飞腾平台芯片测试固件(SFW)和开机启动log
  • 【大数据实训】基于Hive的北京市天气系统分析报告(二)
  • WPF列表样式
  • Android逆向学习(二)vscode进行双开与图标修改
  • 一个基于YAPI接口生产代码的开源工具
  • Redis 缓存穿透击穿和雪崩
  • 在windows上配置ninja环境
  • ③matlab向量和矩阵
  • 一、了解[mysql]索引底层结构和算法
  • DockerFile常用命令
  • Android 动画之插值器PathInterpolator
  • 递归学习(转载)
  • python接口自动化(二)--什么是接口测试、为什么要做接口测试(详解)
  • HashMap源码阅读(一)
  • C语言:动态内存(一篇拿捏动态内存!)
  • Lua - 替换字符串中的特殊字符