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

那个网站seo做的好的百度浏览器下载安装2023版本

那个网站seo做的好的,百度浏览器下载安装2023版本,大量网站开发视频 文档VIP资源,信息网站开发合同个人主页 : zxctscl 文章封面来自:艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. 传值传参和传引用传参3. 概念4. 特征 1. 前言 在前面学习了6个默认成员函数中的构造函数和析构函数 【C】构造函数和析构函数详解,接下来继续往后看拷…

个人主页 : zxctscl
文章封面来自:艺术家–贤海林
如有转载请先通知

文章目录

  • 1. 前言
  • 2. 传值传参和传引用传参
  • 3. 概念
  • 4. 特征

1. 前言

在前面学习了6个默认成员函数中的构造函数和析构函数 【C++】构造函数和析构函数详解,接下来继续往后看拷贝构造函数。

拷贝构造函数就是用一个同类型的其他对象来构造。
要学习拷贝构造函数,得先了解传值传参和传引用传参。

2. 传值传参和传引用传参

class Date
{
public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}Date(Date& d){_year = d._year;_month = d._month;_day = d._day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private:// 内置类型int _year;int _month;int _day;
};
void func1(Date d)
{}
void func2(Date& rd)
{}
int main()
{Date d1(2024, 2, 24);func1(d1);func2(d1);return 0;
}

C++规定自定义类型都会调用拷贝构造。
在这里插入图片描述
所以func2(d1);rd是d1的别名,直接完成调用了,不存在再有一个函数来传值传参。
在这里插入图片描述
在这里插入图片描述
来看看不传引用会怎么样

class Date
{
public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}Date(Date d){_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(2024, 2, 24);Date d2(d1);return 0;
}

在这里插入图片描述
调用拷贝构造,要先传参,这里是传值,传参,会形成一个新的拷贝构造,进不来这个函数,一直递归下去。使用传值传参就不行。

3. 概念

在现实生活中,可能存在一个与你一样的自己,我们称其为双胞胎。

在这里插入图片描述
那在创建对象时,可否创建一个与已存在对象一某一样的新对象呢?
拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。

4. 特征

拷贝构造函数也是特殊的成员函数,其特征如下:

  1. 拷贝构造函数是构造函数的一个重载形式。
  2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。

有时候可能会发生修改对象,为了保护对象,就可以在它前面加上const
是一种权限的缩小。

像下面的场景就能被检查出来:
在这里插入图片描述
就只能这样写:
在这里插入图片描述
在这里插入图片描述

  1. 若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内置类型成员内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。

像下面的代码中就没有拷贝构造:

class Date
{
public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private:// 内置类型int _year;int _month;int _day;};int main()
{Date d1(2024, 2, 24);Date d2(d1);d1.Print();d2.Print();return 0;
}

在这里插入图片描述

class Time
{
public:~Time(){cout << "~Time()" << endl;}// 强制编译器生成Time() = default;Time(const Time& t){cout << "Time(const Time& t)" << endl;_hour = t._hour;_minute = t._minute;_second = t._second;}private:int _hour;int _minute;int _second;
};class Date
{
public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private:// 内置类型int _year;int _month;int _day;//自定义类型Time _t;};int main()
{Date d1(2024, 2, 24);Date d2(d1);d1.Print();d2.Print();return 0;
}

在这里插入图片描述
在编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,而自定
义类型是调用其拷贝构造函数完成拷贝的。

在这里插入图片描述

  1. 编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了,还需要自己显式实现吗?
typedef int DataType;
class Stack
{
public:Stack(size_t capacity = 10){_array = (DataType*)malloc(capacity * sizeof(DataType));if (nullptr == _array){perror("malloc申请空间失败");return;}_size = 0;_capacity = capacity;}// Stack st2(st1);Stack(const Stack& s){DataType* tmp = (DataType*)malloc(s._capacity *(sizeof(DataType)));if (tmp == nullptr){perror("malloc fail");exit(-1);}memcpy(tmp, s._array, sizeof(DataType) * s._size);_array = tmp;_size = s._size;_capacity = s._capacity;}void Push(const DataType& data){// CheckCapacity();_array[_size] = data;_size++;}~Stack(){if (_array){free(_array);_array = nullptr;_capacity = 0;_size = 0;}}
private:DataType* _array;size_t _size;size_t _capacity;
};int main()
{Stack s1;s1.Push(1);s1.Push(2);s1.Push(3);s1.Push(4);Stack s2(s1);return 0;
}

在这里插入图片描述
看这里s1和s2置空,s1置空不影响s2置空,他们是两个对象。但他们的地址指向同一个空间,同一个空间不能释放两次。会导致野指针。
在这里插入图片描述
注意:类中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请时,则拷贝构造函数是一定要写的,否则就是浅拷贝。
在这里插入图片描述

  1. 拷贝构造函数典型调用场景:
    使用已存在对象创建新对象
    函数参数类型为类类型对象
    函数返回值类型为类类型对象
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;
}

在这里插入图片描述
为了提高程序效率,一般对象传参时,尽量使用引用类型,返回时根据实际场景,能用引用尽量使用引用。

有问题请指出,大家一起进步!!!

http://www.ds6.com.cn/news/58726.html

相关文章:

  • 查询网站服务器提供商网站营销
  • 房地产网站怎么做电商网站销售数据分析
  • html5网站赏析哈尔滨百度搜索排名优化
  • 小公司怎么做网站网络优化的流程
  • 企业网站模板 html营销型网站建设报价
  • 合肥建设网站查询热门推广平台
  • 软件开发工具排名吉安seo网站快速排名
  • 耒阳做网站营销推广渠道
  • 南昌夜场招聘网站怎么做关键词排名规则
  • 大连网站推广排名seo站内优化公司
  • 网站建设合同的注意事项关键词统计工具有哪些
  • 移动互联网开发实训报告谷歌seo 优化
  • 虚拟机如何做网站互联网推广中心
  • Linux做视频网站网速均衡百度推广一个关键词多少钱
  • 哪家公司建站比较好营销型网站分析
  • 织梦整形医院网站开发口碑营销有哪些方式
  • wordpress 采集 apiseo推广费用
  • 采集的网站怎么做收录李守洪
  • 福州外文网站建设自媒体平台
  • 微信公众平台个人注册入口沈阳seo排名优化教程
  • 旧家电回收网站开发深圳专业seo
  • 房产网站搭建sem搜索引擎
  • 专业的网站开发公司产品推广宣传方案
  • 科技感网站模板seo技术教程网
  • 贵州华瑞网站建设有限公司深圳外贸seo
  • 建设银行网站打不开seo技术培训中心
  • 点击颜色更换网站主题购买友情链接网站
  • 网络营销策划方案的步骤网站优化是什么
  • 北海做网站网站建设哪家好windows优化软件哪个好
  • 用网站做数据库吗网站建设方案书范文