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

文章目录





一、默认构造函数



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


1、默认无参构造函数


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


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

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

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

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

2、默认构造函数>拷贝构造函数


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

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


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


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

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

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

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





二、构造函数调用规则




1、构造函数规则说明


构造函数调用规则 :


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.niftyadmin.cn/n/5027769.html

相关文章

徐亦达机器学习:Kalman Filter 卡尔曼滤波笔记 (一)

P ( x t P(x_t P(xt​| x t − 1 ) x_{t-1}) xt−1​) P ( y t P(y_t P(yt​| x t ) x_t) xt​) P ( x 1 ) P(x_1) P(x1​)Discrete State DM A X t − 1 , X t A_{X_{t-1},X_t} AXt−1​,Xt​​Any π \pi πLinear Gassian Kalman DM N ( A X t − 1 B , Q ) N(AX_{t-1}B,Q)…

js中如何判断一个变量是否为数字类型?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐使用Number.isNaN()方法⭐使用正则表达式⭐使用isNaN()函数⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个…

企业架构LNMP学习笔记48

数据结构类型操作&#xff1a; 数据结构&#xff1a;存储数据的方式 数据类型 算法&#xff1a;取数据的方式&#xff0c;代码就把数据进行组合&#xff0c;计算、存储、取出。 排序算法&#xff1a;冒泡排序、堆排序 二分。 key&#xff1a; key的命名规则不同于一般语言…

vue使用swiper轮播组件开启loop模式点击不了问题处理

1.原本在这里的点击事件换成 :data-href"func_str(item)" 2.在methods里面写好方法 func_str(item){ return JSON.stringify(item); } 3.在原本的调用调用轮播图方法里面加入点击事件 onClick:function(swiper){ var item JSON.parse(swiper.clickedSlide.attrib…

Feign远程接口调用

概述 目的&#xff1a;解决微服务调用问题。如何从微服务A调用微服务B提供的接口。 特性&#xff1a; 声明式语法&#xff0c;简化接口调用代码开发。像调用本地方法一样调用其他微服务中的接口。集成了Eureka服务发现&#xff0c;可以从注册中心中发现微服务。集成了Spring…

如何恢复U盘里面的已经损坏的数据?

弹出使用驱动器之前&#xff0c;先将U盘格式化的信息框&#xff0c;是Windows系统针对某些特定类型的U盘或移动硬盘的一种常见处理方式。一般来说&#xff0c;如果U盘或移动硬盘出现某些故障或问题&#xff0c;Windows系统会建议用户将其格式化。 格式化是一种常规的操作&…

python中argparse模块关于 parse_args() 函数详解(全)

目录 前言1. 函数讲解2. 基本用法3. 实战讲解 前言 原理&#xff1a;命令行解析使用argparse包作用&#xff1a;命令行传参赋值 可用在机器学习深度学习 或者 脚本运行等 了解这个函数需要了解其背后的原理以及具体参数 1. 函数讲解 在深度学习模型框架中几乎都有的模块 浓…

O(n)RMQ四毛子

有一种ST表&#xff0c;叫做1ST表 这种ST表可以在 O ( n ) O(n) O(n) 的时刻内完成建树 其本质就是分块&#xff0c;大块为整除的ST表&#xff0c;小块的差分数组种类不多&#xff0c;完全可以预处理 现在考虑推广到普通的ST表里 我们发现我们真正关心的是数之间的大小关系…