【C++】构造函数调用规则 ( 默认构造函数 | 默认无参构造函数 | 默认拷贝构造函数 | 构造函数调用规则说明 )

news2024/9/22 13:39:46

文章目录

  • 一、默认构造函数
    • 1、默认无参构造函数
    • 2、默认拷贝构造函数
  • 二、构造函数调用规则
    • 1、构造函数规则说明
    • 2、代码示例 - 只定义拷贝构造函数
    • 3、代码示例 - 只定义有参构造函数





一、默认构造函数



C++ 类中 2 种特殊的构造函数 , 分别是 :

  • 默认无参构造函数 : 如果 C++ 类中 没有定义构造函数 , C++ 编译器会自动为该类提供一个 " 默认的无参构造函数 " , 函数体为空 , 不做任何操作 ;
  • 默认拷贝构造函数 : 如果 C++ 类中 没有定义拷贝构造函数 , C++ 编译器会自动为该类提供一个 " 默认的拷贝构造函数 " , 在函数中对成员变量进行简单的复制操作 ;

1、默认无参构造函数


如果 C++ 类中 没有定义构造函数 , C++ 编译器会自动为该类提供一个 " 默认的无参构造函数 " , 函数体为空 , 不做任何操作 ;

  • 没有定义构造函数 : 如果 没有为 C++ 类定义 构造函数 , C++ 编译器 将自动为该类 生成一个默认的无参构造函数 ;
  • 定义了构造函数 : 如果为 C++ 类 定义了其他类型的构造函数 ( 有参构造函数 / 无参构造函数 / 拷贝构造函数 ) , C++ 编译器 将不再自动生成默认的无参构造函数 ;

默认构造函数内容 : C++ 编译器 为类 定义的 默认无参构造函数 , 其函数体为空 , 如下代码所示 ;

class MyClass {  
public:  
    int x;  
    // 默认构造函数  
    MyClass() {
    }  
};

下面的代码 , 会自动调用 默认的 无参构造函数 ;

MyClass obj; // 调用 默认 构造函数

2、默认拷贝构造函数


" 默认拷贝构造函数 " 用于创建一个新对象作为现有对象的副本 , 其作用是将 现有对象 的成员变量 复制到 新对象中 ;

创建一个类对象 并将其 赋值给 另一个类对象时 , 会自动调用 默认拷贝构造函数 ;


如果 C++ 类中 没有定义拷贝构造函数 , C++ 编译器会自动为该类提供一个 " 默认的拷贝构造函数 " , 在函数中对成员变量进行简单的复制操作 ;

  • 没有定义拷贝构造函数 : 如果 没有为 C++ 类定义 拷贝构造函数 , C++ 编译器 将自动为该类 生成一个 默认的拷贝构造函数 ;
  • 定义了拷贝构造函数 : 如果为 C++ 类 定义了 拷贝构造函数 , C++ 编译器 将不再自动生成默认的拷贝构造函数 ;

默认拷贝构造函数内容 : C++ 编译器 为类 定义的 默认拷贝构造函数 , 在函数内部将 现有对象 的 成员变量 逐个赋值给 新对象 ;

class MyClass {  
public:  
    int x;  
    // 默认拷贝构造函数  
    MyClass(const MyClass& other) {  
        x = other.x;  
    }  
};

下面的代码 , 第一行代码会自动调用默认的无参构造函数 , 第二行代码会自动调用默认的拷贝构造函数 ;

MyClass obj; 			// 调用默认无参构造函数
MyClass obj2 = obj; 	// 调用默认拷贝构造函数





二、构造函数调用规则




1、构造函数规则说明


构造函数调用规则 :

  • 提供 默认无参构造函数 和 默认拷贝构造函数 : 如果 C++ 类中 没有定义 构造函数 时 , C++ 编译器 会提供 默认的 无参构造函数 和 默认的 拷贝构造函数 ;
  • 提供 默认拷贝构造函数 : 如果 C++ 类中 , 定义了 非拷贝构造函数 , 如 : 有参构造函数 / 无参构造函数 , C++ 编译器 不会提供 默认的无参构造函数 , 但是 会提供 默认的 拷贝构造函数 ;
    • 默认的 拷贝构造函数 只能进行 成员变量的 复制 ;
  • 特例 : 如果 C++ 类中 , 定义了 拷贝构造函数 , 那么 C++ 编译器不会提供 默认的无参构造函数 ;

2、代码示例 - 只定义拷贝构造函数


下面的代码中 , 定义了 拷贝构造函数 , C++ 编译器不会自动生成 默认的无参构造函数 和 默认的拷贝构造函数 ;

使用 Student s; 代码 创建对象 , 报错 “Student”: 没有合适的默认构造函数可用 ;

说明 C++ 编译器没有为该类生成 默认的无参构造函数 ;


代码示例 :

#include "iostream"
using namespace std;

class Student
{
public:
	Student(const Student& s)
	{
		m_age = s.m_age;
		m_height = s.m_height;
		cout << "调用拷贝构造函数" << endl;
	}

public:
	int m_age;		// 年龄
	int m_height;	// 身高
};


int main()
{
	// 定义了拷贝构造函数 不再生成默认无参构造函数
	Student s;


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
}

执行结果 :

已启动生成…
1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>hello_world.cpp
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(23,10): error C2512: “Student”: 没有合适的默认构造函数可用
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(4,7): message : 参见“Student”的声明
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0==========

在这里插入图片描述


3、代码示例 - 只定义有参构造函数


下面的代码中 , 定义了 有参构造函数 , C++ 编译器不会自动生成 默认的无参构造函数 和 默认的拷贝构造函数 ;

使用 Student s; 代码 创建对象 , 报错 “Student”: 没有合适的默认构造函数可用 ;

说明 C++ 编译器没有为该类生成 默认的无参构造函数 ;


代码示例 :

#include "iostream"
using namespace std;

class Student
{
public:
	// 带参构造函数
	Student(int age, int height)
	{
		m_age = age;
		m_height = height;
		cout << "调用带参数构造函数 m_age = " << m_age << endl;
	}

	Student(const Student& s)
	{
		m_age = s.m_age;
		m_height = s.m_height;
		cout << "调用拷贝构造函数" << endl;
	}

public:
	int m_age;		// 年龄
	int m_height;	// 身高
};


int main()
{
	// 定义了拷贝构造函数 不再生成默认无参构造函数
	Student s;


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
}

执行结果 :

已启动生成…
1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>hello_world.cpp
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(31,10): error C2512: “Student”: 没有合适的默认构造函数可用
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(4,7): message : 参见“Student”的声明
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0==========

在这里插入图片描述

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

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

相关文章

护眼灯是减蓝光好还是无蓝光好?推荐五款好用的护眼台灯

现在儿童近视率越来越高了&#xff0c;用眼过度疲劳是导致近视的主要因素&#xff0c;学习环境的光线是否合适&#xff0c;都会直接影响用眼的疲劳程度。所以给孩子营造一个良好的学习环境非常重要&#xff01;推荐五款好用的护眼台灯。 一、书客护眼台灯L1 要说综合实力最强…

掌动智能分享:性能压力测试的重要性与优势

在当今数字化时代&#xff0c;应用程序的性能对于用户体验和业务成功至关重要。为了保证应用程序的高性能和稳定性&#xff0c;性能压力测试成为了不可或缺的环节。在这个领域&#xff0c;掌动智能作为一家专业的性能压力测试公司&#xff0c;正以其卓越的技术与服务&#xff0…

浅谈旁通阀式余压智能控制系统

安科瑞 华楠 摘要&#xff1a;详细阐述了旁通阀式余压控制系统的组成、工作原理&#xff0c;并结合实际项目实例&#xff0c;分析了平面优化设计方法。提出旁通阀式余压控制系统是通过设在住宅前室的压力传感器来调节加压送风系统在区域的进风量&#xff0c;从而改变区域的风压…

前端使用jsencrypt进行RSA公钥解密

默认jsencrypt是不支持公钥解密的&#xff0c;需要更改 1.将jsencrypt.js源码复制一分到utils包下 2.然后对utils包下的jsencrypt进行更改 更改RSAKey.prototype.decrypt 方法&#xff08;将doPrivate改为doPublic&#xff09; RSAKey.prototype.decrypt function (ctext) {v…

康耐视读码器DataMan软件详细使用步骤

1、 点击桌面已经安装好的 dataman 软件并打开 2、 打开之后,点击刷新,刷出来读码器的图标,双击进行连接,或者选中后,点击右下角 的连接。(也可先进行第 9—(2)步更改读码器的 IP,对应的连接对象也更改到同一网 段)如图 3、 连接之后,在设置 快速设置下面把实时显…

《向量数据库指南》——Milvus Cloud唯一一家存算分离的数据库架构,它的技术难点在哪里?

在过去的两年多里,我们走过了一段技术探索的旅程,但事实上我们在这个过程中遇到了许多挑战。因为通常情况下,存储和计算分离的架构主要用于 OLAP 数据库。在传统的 OLAP 数据库中,数据的更新频率相对较低。 虽然一些 OLAP 数据库支持更新操作,但更新和删除的能力相对有限。…

关于学什么和如何学的思考

本篇文章出自自己的零碎想法记录&#xff0c;文章的主题和内容刚开始只源于这篇《卡片笔记数量超限后所思所想》文章中记得一些零碎笔记和平常的一些思考&#xff0c;正如前文《关于标签管理&#xff0c;知识管理工具的思考》一样&#xff0c;刚开始也是源于自己生活实践中的一…

可以用哪些软件来批量生成文档?

作者&#xff1a;天哥 什么是文档生成器&#xff1f; 先举一个实际业务场景。 无论是微软Office还是ONLYOFFICE&#xff0c;还是其它Office软件&#xff0c;创建文档编写文档&#xff0c;其工作主要都是我们人工完成的&#xff0c;打开软件&#xff0c;新建文档&#xff0c;或…

跨境电商公司Linkage Global申请750万美元纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;跨境电商公司Linkage Global近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为(LGCB),Linkage Global计划通过此次纳…

Linux编程之线程池的设计与实现

Linux编程之线程池的设计与实现&#xff08;C98&#xff09; 代码 假设服务器的硬件资源“充裕”&#xff0c;那么提高服务器性能的一个很直接的方法就是空间换时间&#xff0c; 即“浪费”服务器的硬件资源&#xff0c;以换取其运行效率。 提升服务器性能的一个重要方法就是…

基于YOLOv2和传感器的多功能门禁系统

文章和项目源码已经归档至【Github仓库&#xff1a;https://github.com/timerring/face-recognition-door 】或者公众号【AIShareLab】回复 人脸识别门禁 也可获取。 文章目录 1.系统制作方案概述1.1系统设计的立意1.2系统的主要组成1.3系统的制作方案1.3.1制作方案框图1.3.2制…

基于ntchat的微信群聊同步机器人

微信群有500人上限的限制&#xff0c;建立多个群的话又有信息无法互通的不便&#xff0c;此机器人通过自动将消息转发到同一个同步组内的所有群&#xff0c;消除这一不便性&#xff0c;间接达成扩大群成员数的目的。 效果演示&#xff1a; 项目地址&#xff1a; https://gith…

vue-ueditor-wrap 中获取光标所在的位置,插入文本内容

1.背景 因项目需要&#xff0c;在富文本编辑框中可以设置样式&#xff0c;并且可以在内容光标所在的位置插入文本内容。 2.项目中使用 vue-ueditor-wrap 请跳转至以下链接进行查看 vue项目中使用vue-ueditor-wrap_理想和远方_在路上的博客-CSDN博客 3.获取光标所在的位置&a…

闲鱼自动化软件——筛选/发送系统 V22已经测试完毕

更新 因为闲鱼版本更新&#xff0c;以及闲鱼整个程序维护记录&#xff0c;又增加了一些优化和提升的代码&#xff0c;所以又一次在整体上更新了一版闲鱼的此款软件。 主要更新点&#xff1a; 1、添加显示自定义按钮&#xff0c;可以自动显示最新数据&#xff0c;也可以手动翻…

巨人互动|Google海外户Google+有什么用途

Google是Google推出的一项社交网络服务&#xff0c;类似于Facebook和Twitter。它为用户提供了一个分享和交流的平台&#xff0c;具有许多不同的用途。 首先&#xff0c;Google可以让用户轻松地与朋友、家人、同事和其他人建立联系。通过添加他人为好友或加入共同兴趣的群组&am…

第二证券:华为5.5G迎来新突破 政策加码利好银行估值

昨日&#xff0c;沪指盘中维持窄幅震动走势&#xff0c;深成指、创业板指弱势下探&#xff0c;创业板指再创逾3年新低&#xff1b;到收盘&#xff0c;沪指微涨0.11%报3126.55点&#xff0c;深成指跌0.57%报10197.59点&#xff0c;创业板指跌0.78%报2011.88点&#xff1b;两市算…

C++:vector中pair的排序方法

前言 有时我们需要往 vector 容器中插入 “键值对(pair<int, int>)” 数据&#xff0c;同时又需要按第二个或者第一个进行排序。如上的问题可以借助 STL 的 sort 完成。 程序 1. 向算法传递函数 static bool cmp(const pair<int, int>& a, const pair<int…

使用原生的js实现分享功能,代码非常精简

分享一个原生的js实现移动端分享功能&#xff0c;希望大家喜欢。 兼容性&#xff1a; 实现代码&#xff1a; function share(){ if (!navigator.share) { alert("您当前浏览器不支持分享&#xff01;"); } else { navigator.share({title: {$title},text: {$introd…

Linux操作系统(四):内存管理组件

该部分的学习框架如下&#xff1a; 了解基本内存管理概念&#xff1a;物理内存、虚拟内存、地址空间等。学习虚拟内存的概念、作用和原理。了解虚拟内存是如何将物理内存和进程的地址空间分开管理的&#xff0c;以及它如何提供了更大的地址空间和更好的内存管理。内存分段&…

管理方法论:4. 一对一沟通——了解真实情况

团队人越多&#xff0c;管理者了解真实情况就越困难&#xff0c;为什么&#xff1f; 缺乏安静的、可以专注于沟通的环境。有些话不能跟太多人说&#xff0c;尤其是负面的想法和意见。有些人本来就内向、被动&#xff0c;其他人说话时&#xff0c;自己往往习惯于听&#xff0c;…