C++构造函数调用规则

1.拷贝函数的值拷贝:

#include <iostream>
using namespace std;//构造函数的调用规则:
//1,创建一个类,C++编译器会给每个类都添加至少3个函数
//默认函数(空实现),析构函数(空实现),拷贝函数(值拷贝)class Person {public:Person() {cout << "Person的默认构造函数调用" << endl;}Person(int age) {cout << "Person的有参构造函数调用" << endl;m_Age = age;}Person(const Person &p) {cout << "Person的拷贝构造函数调用" << endl;m_Age = p.m_Age;}~Person() {cout << "Person的析构函数" << endl;}int m_Age;
};void test01() {Person p;p.m_Age = 18;Person p2(p);cout << "p2的年龄为:" << p2.m_Age << endl;}int main() {test01();system("pause");return 0;
}

在这里插入图片描述

如果这个时候我们没有写拷贝函数,这个时候编译器就会用它自己的拷贝函数,eg:

#include <iostream>
using namespace std;//构造函数的调用规则:
//1,创建一个类,C++编译器会给每个类都添加至少3个函数
//默认函数(空实现),析构函数(空实现),拷贝函数(值拷贝)class Person {public:Person() {cout << "Person的默认构造函数调用" << endl;}Person(int age) {cout << "Person的有参构造函数调用" << endl;m_Age = age;}//		Person(const Person &p) {
//			cout << "Person的拷贝构造函数调用" << endl;
//			m_Age = p.m_Age;
//		}~Person() {cout << "Person的析构函数" << endl;}int m_Age;
};void test01() {Person p;p.m_Age = 18;Person p2(p);cout << "p2的年龄为:" << p2.m_Age << endl;}int main() {test01();system("pause");return 0;
}

在这里插入图片描述

//		Person(const Person &p) {
//			cout << "Person的拷贝构造函数调用" << endl;
//			m_Age = p.m_Age;
//		}
//此时编译器做了一个值拷贝,相当于它自己写了一个m_Age = //p.m_Age;但是它只会进行值拷贝,
//所以最后的输出里面没有 Person的拷贝构造函数调用

2.如果我们写了有参构造函数,编译器就不再提供默认构造,依然提供拷贝函数

#include <iostream>
using namespace std;//构造函数的调用规则:
//1,创建一个类,C++编译器会给每个类都添加至少3个函数
//默认函数(空实现),析构函数(空实现),拷贝函数(值拷贝)class Person {public://		Person() {
//			cout << "Person的默认构造函数调用" << endl;
//		}Person(int age) {cout << "Person的有参构造函数调用" << endl;m_Age = age;}//		Person(const Person &p) {
//			cout << "Person的拷贝构造函数调用" << endl;
//			m_Age = p.m_Age;
//		}
//此时编译器做了一个值拷贝,相当于它自己写了一个m_Age = p.m_Age;~Person() {cout << "Person的析构函数" << endl;}int m_Age;
};//void test01() {
//	Person p;
//	p.m_Age = 18;
//
//	Person p2(p);
//
//	cout << "p2的年龄为:" << p2.m_Age << endl;
//
//}void test02() {Person p;
}int main() {
//	test01();test02();system("pause");return 0;
}

在这里插入图片描述
会报错,原因是我们写了有参构造函数,所以编译器不会提供默认构造函数,但是我们自己没有写默认构造函数,所以Person没有合适的默认构造函数可用。

下面证明编译器依然会提供拷贝构造函数:

#include <iostream>
using namespace std;//构造函数的调用规则:
//1,创建一个类,C++编译器会给每个类都添加至少3个函数
//默认函数(空实现),析构函数(空实现),拷贝函数(值拷贝)class Person {public://		Person() {
//			cout << "Person的默认构造函数调用" << endl;
//		}Person(int age) {cout << "Person的有参构造函数调用" << endl;m_Age = age;}//		Person(const Person &p) {
//			cout << "Person的拷贝构造函数调用" << endl;
//			m_Age = p.m_Age;
//		}
//此时编译器做了一个值拷贝,相当于它自己写了一个m_Age = p.m_Age;~Person() {cout << "Person的析构函数" << endl;}int m_Age;
};//void test01() {
//	Person p;
//	p.m_Age = 18;
//
//	Person p2(p);
//
//	cout << "p2的年龄为:" << p2.m_Age << endl;
//
//}void test02() {Person p(28);Person p2(p);cout << "p2的年龄为:" << p2.m_Age << endl;
}int main() {
//	test01();test02();system("pause");return 0;
}

在这里插入图片描述

3.如果我们写了拷贝构造函数,编译器就不再提供其他普通构造函数:

#include <iostream>
using namespace std;//构造函数的调用规则:
//1,创建一个类,C++编译器会给每个类都添加至少3个函数
//默认函数(空实现),析构函数(空实现),拷贝函数(值拷贝)class Person {public://		Person() {
//			cout << "Person的默认构造函数调用" << endl;
//		}//		Person(int age) {
//			cout << "Person的有参构造函数调用" << endl;
//			m_Age = age;
//		}Person(const Person &p) {cout << "Person的拷贝构造函数调用" << endl;m_Age = p.m_Age;}
//此时编译器做了一个值拷贝,相当于它自己写了一个m_Age = p.m_Age;
//		~Person() {
//			cout << "Person的析构函数" << endl;
//
//		}int m_Age;
};//void test01() {
//	Person p;
//	p.m_Age = 18;
//
//	Person p2(p);
//
//	cout << "p2的年龄为:" << p2.m_Age << endl;
//
//}void test02() {Person p;}int main() {
//	test01();test02();system("pause");return 0;
}

在这里插入图片描述
由于我们提供了拷贝构造函数,编译器不再提供其他普通函数,所以报错,原因:Person没有合适的默认构造函数可用。

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

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

相关文章

HTTP Strict Transport Security (HSTS) in ASP.NET Core

本文是《2020年了&#xff0c;再不会HTTPS就老了》的后篇&#xff0c;本文着重聊一聊HTTP Strict Transport Security协议的概念和应用。启用 HTTPS 还不够安全现在很多站点通过HTTPS对外提供服务&#xff0c;用户在访问某站点&#xff0c;往往会直接输入站点域名&#xff08;b…

mysql支持的平台和操作系统_MySQL 数据库所支持的操作系统_MySQL

MySQL数据库所支持的操作系统&#xff1a;我们使用GNU Autoconf&#xff0c;因此将MySQL移植到所有使用Posix线程和C编译器的现代系统是可能的。(要求服务器支持线程。如果只是编译客户端代码&#xff0c;则只需要C编译器)。我们主要在Linux(SuSE和Red Hat)、FreeBSD和Sun Sola…

C++深拷贝与浅拷贝

浅拷贝&#xff1a; 简单的赋值拷贝操作。 深拷贝&#xff1a; 在堆区重新申请空间&#xff0c;进行拷贝操作。 首先我们先写这样的一段代码&#xff1a; #include <iostream> using namespace std; //深拷贝与浅拷贝class Person {public:Person() {cout << &qu…

BeetleX轻松搭建HTTP和Weboskcet网关

在新版本的BeetleX.Bumblebee中实现了对Weboskcet代理的支持&#xff0c;因此使用BeetleX搭建同时支持HTTP和Weboskcet的网关只需要几行代码的工作就能完成&#xff1b;接下来构建一个简单的网关程序并测试一下对asp.net core SignalR进行代理的应用。引用组件使用BeetleX构建网…

[功能发布]Excel与PowerBI互通互联升级版连接SSAS和AzureAS

Excel催化剂发自内心地热爱着PowerBI社区&#xff0c;从最开始提供了PowerBIDeskTop的互通互联功能&#xff0c;到无偿奉献所有此功能的核心原代码&#xff0c;再到今天的高潮&#xff0c;献上最具商业价值的高级功能&#xff0c;让企业级商业智能BI项目插上翅膀&#xff0c;最…

window oracle 只有bak文件怎么恢复_一起来学习Oracle的备份恢复基础吧-4

基于backup controlfile的恢复使用备份的控制文件在实际工作中的两种情况&#xff1a;当前控制文件全部损坏&#xff0c;而数据文件备份、控制文件备份及当前的日志处在不同的SCN版本&#xff0c;它们之间又增加过表空间(数据文件)。当前控制文件没有损坏&#xff0c;但是想恢复…

微服务、容器和Kubernetes的2020你怎么看?

历史上&#xff0c;有些年份比其他年份容易预测。因为市场出现的稳定性使追踪趋势线变得更加容易。2020年将是企业向微服务迁移的关键一年&#xff1a;稳定并逐步地向主流应用过渡。毫无疑问&#xff0c;IT组织正在转向微服务架构。微服务将应用程序分解为许多小部分&#xff0…

C++类对象作为类成员

C类中的成员可以是另一个类的对象&#xff0c;我们称该成员为对象成员 代码如下&#xff1a; #include <iostream> using namespace std; #include <cstring>//类对象作为类成员 class Phone {public:Phone(string PName) {cout << "Phone函数的调用&…

mysql revoke详解_MySQL删除用户权限(REVOKE)

MySQL 数据库中可以使用 REVOKE 语句删除一个用户的权限&#xff0c;此用户不会被删除。语法格式有两种形式&#xff0c;如下所示&#xff1a;1) 第一种&#xff1a;REVOKE [ ( ) ] [ , [ ( ) ] ]…ON FROM [ , ]…2) 第二种&#xff1a;REVOKE ALL PRIVILEGES, GRANT OPTIONFR…

.NET 大数据实时计算--学习笔记

摘要纯 .Net 自研大数据实时计算平台&#xff0c;在中通快递服务数百亿包裹&#xff0c;处理数据万亿计&#xff01;将分享大数据如何落地以及设计思路&#xff0c;技术重难点。目录背景介绍计算平台架构项目实战背景介绍计算平台架构分片实时计算计算平台数据统计模型开源项目…

C++静态成员函数

#include <iostream> using namespace std;//静态成员函数 //所有对象共享同一个函数 //静态成员函数只能访问静态成员变量class Person {public:static void func() {m_A 100;//静态成员函数可以访问静态成员变量 // m_B 200;//报错&#xff0c;静态成员函数不可以访…

python封装工具类多个项目使用_【arcpy项目实战】将多个点两两生成的最短路径pyhon代码封装入script中...

import osimport arcpyarcpy.env.workspacearcpy.GetParameterAsText(0)#选取环境cost arcpy.GetParameterAsText(1) #成本栅格shparcpy.GetParameterAsText(2) #选取要素的要素类out_patharcpy.GetParameterAsText(3) #命名字段裁剪后输出目录cursorarcpy.da.SearchCursor(shp…

asp.net core 实现支持多语言

asp.net core 实现支持多语言Intro最近有一个外国友人通过邮件联系我&#xff0c;想用我的活动室预约&#xff0c;但是还没支持多语言&#xff0c;基本上都是写死的中文&#xff0c;所以最近想支持一下更多语言&#xff0c;于是有了多语言方面的一些实践国际化/本地化介绍国际化…

C++成员变量和成员函数分开存储

在C中&#xff0c;类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 首先先看一下空对象占用多少空间&#xff1a; #include <iostream> using namespace std; //成员变量和成员函数是分开存储的class Person {};void test01() {Person p;cout &l…

dotnet 将C#编译为wasm让前端html使用

其实 dotnet 是全栈的首选&#xff0c;原因是因为可以开发的方向太多&#xff0c;比如大本营PC端&#xff0c;以及后台。还有移动端&#xff0c;包括 IOS 和安卓端。现在还能用来写前端&#xff0c;本文就来告诉大家如何在前端使用现有的C#代码&#xff0c;通过 WebAssembly 使…

python目标跟踪精度曲线图_Python+opencv3.4+Kalman滤波在视频中跟踪绘制运动目标,Pythonopencv34kalman,卡尔曼滤波,实现,物体,追踪,和,轨迹...

实验环境&#xff1a;Python3.6OpenCV3.4pycharm2019代码实现&#xff1a;首先是一个简单的不用kalman滤波的运动目标追踪代码这里可以根据需要进行摄像头运动目标识别&#xff0c;只要把camera cv2.VideoCapture(./video/yellow_ball.mp4)# 改成camera cv2.VideoCapture(0) …

C++this指针的用途

this指针的用途&#xff1a; 1.当形参和成员变量同名时&#xff0c;可用this指针来区分。 2.在类的非静态成员函数中返回对象本身&#xff0c;可使用return *this 每一个非静态成员函数只会诞生一份函数实例&#xff0c;也就是说多个同类型的对象会共用一块代码&#xff0c;那…

【实战 Ids4】小技巧篇:自定义登录页操作

今天的内容很简单&#xff0c;1分钟就能看完&#xff0c;5分钟就能学会&#xff0c;但是却是在我们平时开发中必须要学会的一个小知识点&#xff0c;我就不让大家走弯路了&#xff0c;直接看操作。在平时的IdentityServer4开发中呢&#xff0c;我们都是根据官方的Demo来操作一遍…

mysql_result函数用不了_mysql_result()函数怎么在PHP中使用

mysql_result()函数怎么在PHP中使用发布时间&#xff1a;2020-12-21 16:30:03来源&#xff1a;亿速云阅读&#xff1a;69作者&#xff1a;Leah这篇文章给大家介绍mysql_result()函数怎么在PHP中使用&#xff0c;内容非常详细&#xff0c;感兴趣的小伙伴们可以参考借鉴&#xff…

Asp.Net Core下的开源任务调度平台ScheduleMaster

从何说起2017年初的时候&#xff0c;由于当时项目需要做了一个乞丐版定时调度系统&#xff0c;那时候只在单机上实现了核心的调度功能。做这个玩意之前也调研了社区中开源的解决方案&#xff0c;找了几个实地部署试跑了一下&#xff0c;其实都很不错。但那时候我们有个问题就是…