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

浅谈类的复制构造函数和赋值运算符

下面的讨论都是建立在不使用复制省略的基础上
一、复制构造函数
搞清楚两个问题:什么时候会调用复制构造函数;复制构造函数的作用
1、何时调用复制构造函数
1.1 首先搞清楚,构造函数一般都是在初始化对象时,才会被调用;下面是几种简单的情况:假设a是一个已经存在的Vector对象

Vector b(a);
Vector c = a;
Vector d = Vector(a);
Vector* f = new Vector(a);

以上四种情况都会调用复制构造函数;对于第二行和第三行代码,有用到=,但是不一定会调用赋值运算符(如果编译器的实现方式是:首先使用复制构造函数创建一个临时变量,然后将该临时变量的值赋给新对象,这种情况就会调用赋值运算符),这去取决于编译器,我用的g++编译器并不会调用赋值运算符;
ps: =可以是赋值运算符,也可以是是初始化符号;参考:https://www.cnblogs.com/tengzijian/p/17964231
1.2 还有稍微复杂的情况,也将调用复制构造函数:

Vector a = Vector(1, 2);
Vector b = (1, 2);

上面两种情况,不仅会调用Vector(double, double)函数,还会隐式地调用Vector(Vector)复制构造函数;

对于按值传递的函数和返回值的函数,都会隐式地调用复制构造函数;

// 按引用传递
Vector & func(const Vector & v1, const Vector & v2)
{
	v1.a = v1.a+v2.a;
	v1.b = v1.a+v2.b;
	return v1
}
// 按值传递
Vector func2(const Vector v1, const Vector v2)
{
	return Vector(v1.a-v2.a, v1.b-v2.b);
}

对于第一种按引用传递的函数,并不会调用复制构造函数,因为并不涉及创建临时对象,也就是整个过程并没有创建新的对象,所以并不会调用复制构造函数;

对于第二种按值传递的函数,在传参过程中,会初始化形参,就和第一点提到的情况类似,所以也会调用复制构造函数;然后函数返回值,而不是引用,这里会显式地先调用Vector(double,double)构造函数创建一个让func2能够访问的Vector对象,然后返回语句引发对复制构造函数的隐式调用创建一个调用函数能够访问的对象;

复制省略:不会调用不必要的复制构造函数

2、复制构造函数的作用是什么:
默认的复制构造函数逐个复制非静态成员,复制的是成员的值,也就是浅复制,对于含有指针类型的成员数据,这种浅复制是不行的;
所以这种情况需要显式定义复制构造函数以适配需求;

二、赋值运算符
还是搞清楚两个问题,什么时候会调用,作用是什么
1、什么时候会调用赋值运算符
将一个已有的对象赋给另一个对象时,会调用赋值运算符;注意和初始化区别开;

Vector a = Vector(1, 2);
Vector b;
b = a;

2、赋值运算符的作用
默认的赋值运算符和默认的复制构造函数有着相同的问题;
所以对于含有指针数据成员的类,需要重载复制运算符;

相关文章:

  • 今日行情明日机会——20250408
  • Java 设计模式:工厂模式详解
  • 前端实现docx格式word文件预览,可以兼容原生、vue2、以及uni-app 项目,详细步骤。
  • 3月AI论文精选十篇
  • 遍历集合list工具
  • C++学习day8
  • AI-人工智能-基于LC-MS/MS分子网络深度分析的天然产物成分解析的新策略
  • LeetCode541反转字符串②
  • 最简CNN based RNN源码
  • Vue.js 中 v-model 的使用及其原理
  • 注意力机制 Attention
  • 第九章:前沿 RAG 技术探索
  • 数字内容体验驱动用户参与增效
  • 图像模糊(蓝桥杯真题)
  • 习题与正则表达式
  • 以下是针对该 Ansible 任务的格式检查和优化建议
  • 项目中如何防止超卖
  • Redis高频面试题及深度解析(20大核心问题+场景化答案)
  • Python 序列构成的数组(list.sort方法和内置函数sorted)
  • PostgreSQL数据库重放攻击测试
  • 售卖自制外挂交易额超百万元,一男子因提供入侵计算机系统程序被抓
  • 专访|“甲亢哥”的操盘手,带NBA球星们玩转中国流量
  • 金融监管总局将推出8项增量政策:涉房地产金融、险资入市、稳外贸等
  • 五月A股怎么买?券商金股电子权重第一,格力电器最热
  • 默茨在第二轮投票中当选德国总理
  • 退休11年后,71岁四川厅官杨家卷被查