【C++】拷贝构造函数

news/2024/11/19 9:39:53/

目录

默认拷贝构造函数 

拷贝构造函数的原型:

为什么不用值传递?

为什么不用指针传递?

调用拷贝构造函数的3种情况 (旧对象去构造新对象)


我们熟悉的类型有以下操作:

1.声明:int a;

2.声明并初始化:int a = 10;

3.赋值:int a = 10;int b = a;

类作为一个类型当然也有以上操作,其中默认的构造函数可以完成操作1,人为建立的构造函数可以完成操作2,3。对于第三种操作,类中也提供了默认的函数——拷贝构造函数。

默认拷贝构造函数 

    类会提供一个默认的拷贝构造函数,用已有对象的值去依此初始化新对象的值;如果人为提供了,则类不会提供默认。

        拷贝构造函数又叫复制构造函数。

拷贝构造函数的原型:

类名(const 类名& 形参名) :(初始化列表){}

可以看到,这里是引用传递,加了const防止值被修改

为什么不用值传递?

值传递将待传的值赋值一份过去,形参需要初始化,如果使用值传递,像下面这样,程序会掉入死循环:

假如有:A a = 10;A b(a);

将a传入成员b时调用拷贝构造函数A(A t);

而A(A t)函数中的形参成员t需要初始化,这又需要调用拷贝构造函数A(A t);

如此下去不断调用拷贝构造函数,无穷无尽。

class A
{
public:A(int i = 0) :m_i(i) { cout << "A" << m_i << endl; }~A() { cout << "~A" << m_i << endl; }A(A t) :m_i(t->m_i)//值传递{cout << "A(A)" << endl;}void print() { cout << m_i << endl; }
private:int m_i;
};

为什么不用指针传递?

A(A* t) :m_i(t->m_i)
 {cout << "A(A)" << endl;}

其实指针传递的结果是对的,但是看的时候有歧义

A a = 10;A b = &a;//人们无法确定是用a初始化b,还是用&a初始化b;A b(&a)的作用同A b = &a

调用拷贝构造函数的3种情况 (旧对象去构造新对象)

1.用已有对象去初始化新对象
2.函数传参--值传递 由实参传递给形参的过程
3.函数返回值 --类类型的值返回,由局部对象构造临时对象

情况1很好理解

    A a(5); //A(int) 5
    A b(a);//用a去初始化b对象

情况2就是拷贝构造函数为什么不用值传递的原因

void fun(A t){} 

情况3在const关键字那篇中提到过,函数传参时不是把本身的变量传过去,而是生成一个临时存储空间,这个临时的空间如果是类类型的则需要调用拷贝构造函数。

A fun(){}

最后看一下这些函数的调用:

class A
{
public:A(int i = 0) :m_i(i) { cout << "A" << m_i << endl; }~A() { cout << "~A" << m_i << endl; }A(const A& t) :m_i(t.m_i)  //拷贝构造函数{cout << "A(A)" << m_i << endl;}void print() { cout << m_i << endl; }
private:int m_i;
};
void fn(A s)  //A s(c) 用c构造s 调用拷贝构造 A(A) 30
{cout << "fn" << endl;//fn在即将退出的时候,要将局部对象s析构 ~A 30
}
A test()
{A tt(60);  //A 60return tt; //从tt到临时对象调用拷贝构造
} void main()
{A a(5); A b(a); A c(30);  //调用普通构造  A 30fn(c);c = test();
}

结果:

 


http://www.ppmy.cn/news/5587.html

相关文章

必须要学习的源码--ConcurrentHashMap

并发安全的集合&#xff1f; 并发不安全的集合 在 Java 中&#xff0c;有一些集合是不安全的&#xff0c;因为它们不是线程安全的。这意味着如果多个线程同时访问这些集合&#xff0c;那么它们可能会出现不可预料的行为。 Java 中的并发不安全的集合包括&#xff1a; ArrayLi…

【深度思考】如何优雅的校验参数?

在日常的开发工作中&#xff0c;为了保证落库数据的完整性&#xff0c;参数校验绝对是必不可少的一部分&#xff0c;本篇文章就来讲解下在项目中该如何优雅的校验参数。 假设有一个新增学员的接口&#xff0c;一般第一步我们都会先校验学员信息是否正确&#xff0c;然后才会落…

剑指 Offer 04. 二维数组中的查找

剑指 Offer 04. 二维数组中的查找 一、题目 在一个 n * m 的二维数组中&#xff0c;每一行都按照从左到右 非递减 的顺序排序&#xff0c;每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数&#xff0c;输入这样的一个二维数组和一个整数&#xff0c;判断数组中…

LeetCode算法之--二叉树系列

点赞收藏&#xff0c;以防遗忘 本文【程序大视界】已收录&#xff0c;关注免费领取互联网大厂学习资料&#xff0c;添加博主好友进群学习交流&#xff0c;欢迎留言和评论&#xff0c;一起交流共同进步。 【一】前言 二叉树也是面试算法的常见题型&#xff0c;通常程序会自定义…

【数据结构与算法】试卷 1(含答案)

一、选择题 1. 计算机算法指的是&#xff08;&#xff09; A. 计算方法 B. 排序方法 C. 解决问题的有限运算序列 D. 调度方法 2. 表达式 a*(bc)-d 的后缀表达式是&#xff08;&#xff09; A. abcd- B. abc*d- C. abc*d- D. -*abcd 3. 一个栈的入栈序列是a,b,c,d,e&#xff0c;…

卓海科技冲刺创业板:拟募资5.47亿 相宇阳控制52.9%股权

雷递网 雷建平 12月20日无锡卓海科技股份有限公司&#xff08;简称&#xff1a;“卓海科技”&#xff09;日前递交招股书&#xff0c;准备在深交所创业板上市。卓海科技计划募资5.47亿元&#xff0c;其中&#xff0c;1.04亿元用于半导体前道量检测设备扩产项目&#xff0c;1.84…

MyBatis学习 | 全局配置文件

文章目录一、简介二、各个标签2.1 properties&#xff08;属性&#xff09;2.2 settings&#xff08;设置&#xff09;2.3 typeAliases&#xff08;类型命名&#xff09;2.4 typeHandlers&#xff08;类型处理器&#xff09;2.5 plugins&#xff08;插件&#xff09;2.6 enviro…

Exponentiation

Exponentiation is a mathematical operation, written as bn, involving two numbers, the base b and the exponent or power n, and pronounced as “b (raised) to the (power of) n”.[1] When n is a positive integer, exponentiation corresponds to repeated multipli…