C++ 学习 ::【基础篇:16】:C++ 类的基本成员函数:拷贝构造函数(认识、特征、注意点及典型使用场景)及其基本写法与调用

本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇、STL 篇、高阶数据结构与算法篇,相关重点内容如下:

  1. 基础篇类与对象(涉及C++的三大特性等);
  2. STL 篇学习使用 C++ 提供的 STL 相关库
  3. 高阶数据结构与算法篇手动实现自己的 STL 库设计实现高阶数据结构,如 B树、B+树、红黑树等。

学习集:


本期内容:C++ 类的基本成员函数:拷贝构造函数(概念、特征)及其基本写法与调用


目录:
1. 拷贝构造函数的概念
2. 拷贝构造函数的特征及注意点说明
3. 简单写法及调用写法
4. 典型使用场景
5. 相关文章推荐


C++学习合集链接


1. 拷贝构造函数的认识

拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。


作用:拷贝一个对象!【使用已存在对象创建新对象】


2. 拷贝构造函数的特征及注意点说明

  1. 拷贝构造函数是构造函数的一个重载形式

  2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用使用传值方式编译器直接报错,因为会引发无穷递归调用。(传值的方式就是一种拷贝构造,由此会引发反复套娃引发无穷递归)
    例如一个日期类的示例:在这里插入图片描述> 3. 若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。 在编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,而自定义类型是调用其拷贝构造函数完成拷贝的。> 4. 类中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请时,则拷贝构造函数是一定要写的,否则就是浅拷贝。(会程序崩溃)


3. 简单写法及调用写法
代码示例
#include<iostream>
using std::cout;
using std::endl;

class Date {
public:
	Date(int year = 1970, int month = 1, int day = 1) {
		_year = year;
		_month = month;
		_day = day;
	}
	/* 拷贝构造函数 */
	Date(const Date& d) {		// 注意添加 const 方式出现写错导致拷贝出错
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}

	void Print() {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
private:
	int _year;
	int _month;
	int _day;
};

int main() {

	Date d1(2023, 5, 23);
	Date d2(d1);			// 第一种写法:函数调用式的写法
	Date d3 = d1;			// 第二种写法:类似内置数据类型的赋值形式
	d1.Print();
	d2.Print();
	d3.Print();


	return 0;
}

在这里插入图片描述


4. 典型使用场景
  1. 使用已存在对象创建新对象。
  2. 函数参数类型为类类型对象。
  3. 函数返回值类型为类类型对象。

举例 1:

自定义实现了栈,栈是不可逐个访问遍历元素的,但是若一定要遍历元素,一般思路:反复获取栈顶元素 + 删除栈顶元素!

为了保留原数据,我们可以拷贝当前的这个栈对象,用拷贝的对象执行上述的操作,实现元素遍历!

举例 2:如下

#include<iostream>
using std::cout;
using std::endl;

class Date
{
public:
    Date(int year, int minute, int day)
    {
        cout << "Date(int,int,int):" << this << endl;
    }
    Date(const Date& d)
    {
        cout << "Date(const Date& d):" << this << endl;
    }
    ~Date()
    {
        cout << "~Date():" << this << endl;
    }
private:
    int _year;
    int _month;
    int _day;
};
Date Test(Date d)
{
    Date temp(d);
    return temp;
}
int main()
{
    Date d1(2022, 1, 13);
    Test(d1);
    return 0;
}

在这里插入图片描述


5. 相关文章推荐

1. C++ 学习 ::【基础篇:12】:C++ 类的基本成员函数:构造函数基本的定义与调用 |(无参构造与有参构造及缺省参数式构造)
2. C++ 学习 ::【基础篇:13】:类的基本成员函数:类类型成员与构造函数问题
3. C++ 学习 ::【基础篇:14】:C++ 类的基本成员函数:析构函数的作用 及 自定义析构函数情形
4. C++ 学习 ::【基础篇:15】:C++ 类的基本成员函数:析构顺序问题(全局/静态/局部量) 及 类类型(自定义类型)与析构函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NPC的白话文谈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值