C++拷贝构造函数

1.声明

语法:函数名(类名)(const 类名 &对象名)

作用:使用一个对象初始化另一个对象。
注意:拷贝构造函数的参数列表必须是 const 类名 & 对象名。
#include <iostream>
using namespace std;
class Person
{
private:int age;
public:Person(int age){this->age = age;}//根据参数列表判断这是拷贝构造函数,Person类型的拷贝构造函数,参数必须是Perosn类型Person(const Person& other){cout<<"拷贝构造"<<endl;this->age=other.age;}void show(){cout<<this->age<<endl;}
};int main()
{Person a(19);  //执行a的构造函数cout<<"start"<<endl;Person b(a);//调用对象b 的拷贝构造函数Person c = a; //调用对象a 的拷贝构造函数b.show();
}

2.默认拷贝构造函数

1) 在没有显式的定义拷贝构造函数时,系统会自动生成一个拷贝构造函数,
功能:将成员变量逐个赋值
2) 如果显式的定义拷贝构造函数,并且运行时执行了拷贝构造函数, 那么默认拷贝构造函数和默认构造函数都不会被调用了。
3) 创建一个对象的时候,只会调用一个构造函数 ,写了拷贝构造的时候,默认的拷贝构造函数就不在了。
示例:
#include <iostream>
using namespace std;
class Person
{
private:int age;
public:Person(int age):age(age){}//Person类中没有显式的定义拷贝构造函数int getAge(){return age;}
};
int main()
{Person* p = new Person(19);//在堆空间创建一个对象Person* p2 = new Person(*p);//*p是一个Person对象,这里是使用同类型的一个对象初始化另一个对象,调用拷贝构造函数,但是在 //Person中没有显式的定义拷贝构造函数,所以这里调用默认拷贝构造函数cout<<p->getAge()<<endl;,cout<<p2->getAge()<<endl;
}
总结:
1. 如果没有自定义的拷贝构造函数则系统自动生成一个默认的拷贝构造函数。
2. 当使用一个对象实例化另外一个新对象时,系统自动调用拷贝构造函数。
3. 系统默认拷贝构造函数的功能:逐个对成员变量进行赋值。
4. 显示的定义了拷贝构造函数,系统默认的就不存在了。函数的功能(对变量进行的赋值),就由我们自己来完成了。

3.拷贝构造函数调用三种情况

1)第一种:程序中需要创建一个新对象并用另一个同类的对象对它初始化。

#include<iostream>
using namespace std;
class Person
{
public:int age;string name;Person(int age){this->age = age;cout<<"构造函数"<<endl;}Person(){cout<<"无参构造"<<endl;}Person(const Person& other){age = other.age;name = other.name;cout<<"拷贝构造函数"<<endl;}void show(){cout<<age<<endl;}
};int main()
{Person* p = new Person(12);//构造函数Person * p1 = new Person(*p);//调用拷贝构造p1->show();//12Person a(2);//构造函数Person b = a;//调用拷贝构造b.show();//2Person c(a);//调用拷贝构造
}

2)第二种:当函数的参数为类的对象时

void farsight(Person p); //Person p= a;int main()
{
Person a(19);
cout<<"start"<<endl;
//使用对象a初始化函数的参数p,a和p是两个独立的对象
farsight(a);//会调用拷贝构造
cout<<"end"<<endl;
}
void farsight(Person p){}

3)第三种:函数的返回值为类对象

如果对象生命周期大于函数,会创建一个新的对象,促发拷贝;
如果函数结束对象就被删除,不会创建新的临时对象,不会促发拷贝;
示例:
Person farsight();Person farsight()
{Person* p = new Person(19);    //在堆里创建对象,对象生命周期大于函数,会创建一个新的对象,促发拷贝;cout<<p<<" after new"<<endl;return *p;/*Person p;   //函数结束对象就被删除,不会创建新的临时对象,不会促发拷贝;cout<<&p<<endl;return p;*/
}int main(){Person temp = farsight();cout<<&temp<<endl;
}

(4)拷贝小总结

格式: Person(const Person& other)
1. 创建对象
person p1 ;
person p2= p1;
person p3(p1);

2.函数的参数是对象类型

void fun(person p)拷贝构造
fun(p1);
void fun(person& p)引用不调用拷贝构造
fun(p1);
3. 函数的返回值是对象
person fun(){
返回栈空间对象 --》 没有拷贝
返回堆空间对象 --》 调用拷贝
}

以上就是拷贝构造函数的基本使用,本次代码分享到此结束,感谢大家观看,希望大家点点赞,点点关注,后续还会更新C++有关知识,谢谢大家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/805553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sonarQube之Call “Optional#isPresent()“ before accessing the value.

在迁移其他项目并使用sonarQube进行规范扫描的时候出现了 Call “Optional#isPresent()” before accessing the value. 解决&#xff1a;这是因为在获取到之前避免空值&#xff1b; 修改前代码&#xff1a; BigDecimal totalAmount feeList.stream().map(FeeDetailDTO::ge…

深刻理解企业的基本职能 营销与创新

前言 还是读《敏捷营销》心得&#xff0c;同样的因最近在读关于营销方面的书与在学习AI&#xff0c;书中有一个引用&#xff0c;即引用彼得德鲁克大师在他的经典著作《客理的实践》中明确提出&#xff1a;由于企业的目的是创造顾客&#xff0c;任何企业都有两项职能&#xff0c…

稀碎从零算法笔记Day45-LeetCode:电话号码的字母组合

题型&#xff1a;映射、回溯算法、递归 链接&#xff1a;17. 电话号码的字母组合 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出…

人工智能分类算法概述

文章目录 人工智能主要分类算法决策树随机森林逻辑回归K-均值 总结 人工智能主要分类算法 人工智能分类算法是用于将数据划分为不同类别的算法。这些算法通过学习数据的特征和模式&#xff0c;将输入数据映射到相应的类别。分类算法在人工智能中具有广泛的应用&#xff0c;如图…

网工内推 | 安全运维、服务工程师,软考中级、CISP优先,六险一金

01 华成峰科技 招聘岗位&#xff1a;安全运维工程师 职责描述&#xff1a; 1、负责安全产品的运维管理&#xff0c;包括设备升级变更、策略配置优化、设备巡检等&#xff1b; 2、负责7*24小时安全监控与应急响应&#xff0c;包括态势感知日志监测、安全事件分析及处置等&#…

idea工具使用Tomcat创建jsp 部署servlet到服务器

在tomcat官网中下载对应windows版本的tomcat文件 Apache Tomcat - Welcome! 解压到系统目录中&#xff0c;记得不要有中文路径 新建一个java项目 点击右上角 点击加号 找到Tomcat Service的 Local 点击右下角的Fix一下&#xff0c;然后ok关闭 再重新打开一次 点击deployment …

SQL注入利用 学习- 布尔盲注

布尔盲注适用场景&#xff1a; 1、WAF或者过滤函数完全过滤掉union关键字 2、页面中不再回显具体数据&#xff0c;但是在SQL语句执行成功或失败返回不同的内容 代码分析&#xff1a;过滤关键字 union if(preg_match(/union/i, $id)) { echo "fail"; exit; } 代码…

cmocka入门教程

文章目录 摘要前言什么是mockmock示例cmocka安装使用mock function替换subfunction控制mock function的输入和输出 摘要 本文介绍cmocka中&#xff0c;mock的使用。 前言 在这之前&#xff0c;需要了解最基本的cmocka使用。如果之前有gtest的编程经验&#xff0c;掌握cmocka的…

Docker 安装 ElasticSearch 及 挂载目录

1 拉取ES镜像 docker pull elasticsearch:7.7.0 2 安装临时ES容器&#xff0c;用于拷贝挂载文件 docker run --name es -d -e ES_JAVA_OPTS"-Xms512m -Xmx512m" -e "discovery.typesingle-node" -p 9200:9200 -p 9300:9300 elasticsearch:7.7.0 3 拷贝挂载…

Vue之列表渲染

总的来说&#xff0c;列表渲染中key最好选择数据中唯一&#xff01;尽量不要默认index <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initi…

Node2Vec论文翻译

node2vec: Scalable Feature Learning for Networks node2vec&#xff1a;可扩展的网络特征学习 ABSTRACT 网络中节点和边缘的预测任务需要在学习算法使用的工程特征上付出仔细的努力。最近在更广泛的表示学习领域的研究通过学习特征本身在自动化预测方面取得了重大进展。然…

我认识的建站公司老板都躺平了,每年维护费都大几十万。

这些老板们过的悠哉游哉&#xff0c;大富大贵没有&#xff0c;达到中产&#xff0c;活得舒服&#xff0c;没毛病。 企业官网每年需要交维护费主要是因为以下几个原因&#xff1a; 网站服务器和域名费用&#xff1a;企业官网需要通过服务器进行托管和访问&#xff0c;同时需要…

第一个Swift程序

要创建第一个Swift项目,请按照以下步骤操作: 打开Xcode。如果您没有安装Xcode,可以在App Store中下载并安装它。在Xcode的欢迎界面上,选择“Create a new Xcode project”(创建新Xcode项目)。在模板选择界面上,选择“App”(应用程序)。在应用模板选择界面上,选择“Si…

基于SSM+Jsp+Mysql的农产品供销服务系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

UVA10935 Throwing cards away I 卡片游戏 解题报告

UVA10935 Throwing cards away I 卡片游戏 解题报告 题目链接 https://vjudge.net/problem/UVA-10935 题目大意 桌上有n&#xff08;n≤50&#xff09;张牌&#xff0c;从第一张牌&#xff08;即位于顶面的牌&#xff09;开始&#xff0c;从上往下依次编号为1&#xff5e;n。…

蓝桥杯第十二届c++大学B组详解

目录 1.空间 2.直线 3.路径 4.卡片 5.货物摆放 6.时间显示 7.砝码称重 8.杨辉三角 9.双向排序 10.括号序列 1.空间 题目解析&#xff1a;1Byte 8bit 1kb 1024B 1MB 1024kb; 先将256MB变成Byte 256 * 1024 * 1024; 再将32位 变成Byte就是 32 / 8 4&#xff1b;…

三种常见webshell工具的流量特征分析

又来跟师傅们分享小技巧了&#xff0c;这次简单介绍一下三种常见的webshell流量分析&#xff0c;希望能对参加HW蓝队的师傅们有所帮助。 什么是webshell webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种代码执行环境&#xff0c;主要用于网站管理、服务器管理、…

C++ switch 语句 范围语法

switch 语句通常用于处理离散的值&#xff0c;而不是范围。不过&#xff0c;可以通过 case 中的逻辑或条件来实现类似范围的效果。 switch (tps) {case 6 ... 7:qDebug() << "HttpCount tps limit >5";break;case 8 ... 9:qDebug() << "HttpCou…

第十二届蓝桥杯省赛真题(C/C++大学B组)

目录 #A 空间 #B 卡片 #C 直线 #D 货物摆放 #E 路径 #F 时间显示 #G 砝码称重 #H 杨辉三角形 #I 双向排序 #J 括号序列 #A 空间 #include <bits/stdc.h> using namespace std;int main() {cout<<256 * 1024 * 1024 / 4<<endl;return 0; } #B 卡片…

【spring】@Profile注解学习

Profile介绍 在Spring框架中&#xff0c;Profile注解用于根据特定的配置文件来有条件地激活或禁用Bean的定义。这在开发和测试过程中非常有用&#xff0c;因为它允许你为不同的环境&#xff08;如开发、测试、生产&#xff09;定义不同的配置。 Profile不仅可以标注在方法上&…