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

文章目录

  • 一、默认构造函数
    • 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.rhkb.cn/news/133364.html

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

相关文章

PyTorch实现注意力机制及使用方法汇总,附30篇attention论文

还记得鼎鼎大名的《Attention is All You Need》吗&#xff1f;不过我们今天要聊的重点不是transformer&#xff0c;而是注意力机制。 注意力机制最早应用于计算机视觉领域&#xff0c;后来也逐渐在NLP领域广泛应用&#xff0c;它克服了传统的神经网络的的一些局限&#xff0c…

sqlserver存储过程报错:当前事务无法提交,而且无法支持写入日志文件的操作。请回滚该事务。

现象&#xff1a; 系统出现异常&#xff0c;手动执行过程提示如上。 问题排查&#xff1a; 1.直接执行的过程事务挂起&#xff08;排除&#xff09; 2.重启数据库实例&#xff08;重启后无效&#xff09; 3.过程中套用过程&#xff0c;套用的过程中使用事务&#xff0c;因为…

STM32-HAL库06-硬件IIC驱动FM24CL16B非易失存储器

STM32-HAL库06-IIC驱动FM24CL16B非易失存储器 一、所用材料&#xff1a; STM32VGT6自制控制板 STM32CUBEMX&#xff08;HAL库软件&#xff09; MDK5 二、所学内容&#xff1a; 通过HAL库的硬件IIC对FM24CL16B存储器进行写与读取操作。 三、CUBEMX配置&#xff1a; 第一步…

Virtualbox中Ubuntu根目录空间不足

现象 Virtualbox中Ubuntu根目录空间不足 解决 动态存储 虚拟机关闭先在虚拟介质管理里把硬盘Size调大开启Ubuntu用Disks或者GParted重新调整分区大小重新启动 步骤参考: https://zhuanlan.zhihu.com/p/319431032 https://blog.csdn.net/ningmengzhihe/article/details/1272…

Java 毕业设计-基于SpringBoot的在线文档管理系统

基于SpringBoot的在线文档管理系统 博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 技术栈简介 文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;sp…

rocketmq

&#x1f353;代码仓库 https://gitee.com/xuhx615/rocket-mqdemo.git &#x1f353;基本概念 ⭐生产者(Producer)&#xff1a;消息发布者⭐主题&#xff08;Topic&#xff09;&#xff1a;topic用于标识同一类业务类型的消息⭐消息队列&#xff08;MessageQueue&#xff09…

VirtualBox宿主机和虚拟机文件互传设置

一、如图1、2、3步骤&#xff0c;设置共享粘贴板和拖放为双向 二、 在启动的虚拟机设置的里面&#xff0c;安装增强插件&#xff0c;然后重启虚拟机。 三、在网络位置就可以看到了

Java基于SpringBoot的闲一品交易平台

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 大家好&#xff0c;我是程序员徐师兄、今天给大家谈谈基于android的app开发毕设题目&#xff0c;以及基于an…

学习Bootstrap 5的第八天

目录 加载器 彩色加载器 实例 闪烁加载器 实例 加载器大小 实例 加载器按钮 实例 分页 分页的基本结构 实例 活动状态 实例 禁用状态 实例 分页大小 实例 分页对齐 实例 面包屑&#xff08;Breadcrumbs&#xff09; 实例 加载器 彩色加载器 在 Bootstr…

竞赛 基于情感分析的网络舆情热点分析系统

文章目录 0 前言1 课题背景2 数据处理3 文本情感分析3.1 情感分析-词库搭建3.2 文本情感分析实现3.3 建立情感倾向性分析模型 4 数据可视化工具4.1 django框架介绍4.2 ECharts 5 Django使用echarts进行可视化展示5.1 修改setting.py连接mysql数据库5.2 导入数据5.3 使用echarts…

GeoSOS-FLUS未来土地利用变化情景模拟模型

软件简介 适用场景 GeoSOS-FLUS软件能较好的应用于土地利用变化模拟与未来土地利用情景 的预测和分析中&#xff0c;是进行地理空间模拟、参与空间优化、辅助决策制定的有效工 具。FLUS 模型可直接用于&#xff1a; 城市发展模拟及城市增长边界划定&#xff1b;城市内 部高分…

Debian 12快速安装图解

文章目录 Debian 12安装图解创建虚拟机安装系统登录并用光盘离线安装sudo、curl解决Linux下sudo更改文件权限报错保存快照debain添加在线源(配置清华源)参考 Debian 12安装图解 Debian选择CD安装非常慢&#xff0c;本次安装选择DVD离线安装。 下载 https://www.debian.org/CD…

Swift如何使用Vision来识别获取图片中的文字(OCR),通过SwiftUI视图和终端命令行,以及一系列注意事项

在过去的一年里&#xff0c;我发现苹果系统中的“文字搜图片”功能非常好用&#xff0c;这个功能不光 iPhone/iPad&#xff0c;Mac 也有&#xff0c;找一些图片真的很好用。但是遇到了一个问题&#xff1a;这个功能需要一段时间才能找到新的图片&#xff0c;而且没法手动刷新&a…

从一到无穷大 #15 Gorilla,论黄金26H与时序数据库缓存系统的可行性

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 引言 缓存系统的高效存在前提&#xff0c;在满足前提的情况下可以接受缺陷便没有理由不引入缓…

pdf添加水印

给pdf文件添加水印 引入依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version></dependency>添加水印 package com.it2.pdfdemo02.util;import com.itextpdf.tex…

Qt应用程序连接达梦数据库-飞腾PC麒麟V10

目录 前言1 安装ODBC1.1 下载unixODBC源码1.2 编译安装1.4 测试 2 编译QODBC2.1 修改 qsqldriverbase.pri 文件2.2 修改 odbc.pro 文件2.3 编译并安装QODBC 3 Qt应用程序连接达梦数据库测试4 优化ODBC配置&#xff0c;方便程序部署4.1 修改pro文件&#xff0c;增加DESTDIR 变量…

高可用Kuberbetes部署Prometheus + Grafana

概述 阅读官方文档部署部署Prometheus Grafana GitHub - prometheus-operator/kube-prometheus at release-0.10 环境 步骤 下周官方github仓库 git clone https://github.com/prometheus-operator/kube-prometheus.git git checkout release-0.10 进入工作目录 cd kube…

聚观早报|华为Mate 60 Pro支持面容支付;特斯拉重回底特律车展

【聚观365】9月8日消息 华为Mate 60 Pro已支持面容支付 特斯拉将重回底特律车展 iPhone在美国有1.67亿用户 韩国半导体8月份出口85.6亿美元 比亚迪元PLUS冠军版将于9月15日上市 华为Mate 60 Pro已支持面容支付 毫无预热的华为Mate 60 Pro突然在华为商城首批开售&#xf…

老站长带你全面认识基站和天线

认识基站 作为数量最多的移动通信设备 基站几乎是随处可见 其实 基站也分为很多种 基站的天线&#xff0c;也分为很多种&#xff0c;真正都能区分清楚的人其实不多。 什么是基站 Base Station 一般特指“公用移动通信基站” 大家都知道&#xff0c;基站就是给手机提供信…

【Vue】vue2使用pdfjs预览pdf文件,在线预览方式一,pdfjs文件包打开新窗口预览pdf文件

系列文章目录 【Vue】vue2预览显示quill富文本内容&#xff0c;vue-quill-editor回显页面&#xff0c;v-html回显富文本内容 【Vue】vue2项目使用swiper轮播图2023年8月21日实战保姆级教程 【Vue】vue2使用pdfjs预览pdf文件&#xff0c;在线预览方式一&#xff0c;pdfjs文件包…