当前位置: 首页 > news >正文

【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用 )

文章目录

  • 一、构造函数分类
    • 1、构造函数分类简介
    • 2、构造函数分类代码分析
      • 无参构造函数
      • 有参构造函数
      • 拷贝构造函数
  • 二、代码示例 - 三种类型构造函数定义与调用





一、构造函数分类




1、构造函数分类简介


C++ 构造函数可以分为以下几类 :

  • 无参构造函数 : 最简单也是默认的构造函数 , 函数没有参数 , 如果创建一个对象 , 没有传入参数 , 调用的就是该类型的 构造函数 ;
  • 有参构造函数 : 带参数的 构造函数 , 创建 实例对象 时 , 为成员变量提供初始值 ;
  • 拷贝构造函数 : 拷贝现有 实例对象 , 并以此拷贝的副本为数据 创建一个新的 实例对象 , 相当于创建了一个现有实例对象的副本 , 参数中包含 一个 相同类型 实例对象 引用 ;

2、构造函数分类代码分析


定义成员变量 : 下面的简介示例中是以该成员变量为基础进行赋值的 ;

public:int m_age;char* m_name;

无参构造函数


无参构造函数 : 只负责为指针类型的成员变量分配内存 , 并赋值一个初始值 , 没有具体的赋值信息 , 该初始化只能为 成员变量 赋值一个默认值 ;

// 无参构造函数
Student()
{// 为 m_name 成员分配内存m_name = (char*)malloc(100);// 为 m_name 成员设置字符串值if(m_name != NULL){strcpy_s(m_name, 5, "name");}// 为 m_age 成员设置初始值m_age = 0;cout << "调用无参构造函数" << endl;
}

下面的代码 , 是自动调用无参构造函数 , 创建 实例对象 的方法 ;

	// 调用无参构造函数Student s1;// 打印 Student s1 实例对象值cout << "name : " << s1.m_name << " , age : " << s1.m_age << endl;

有参构造函数


有参构造函数 : 可以将 为 成员变量 赋值的数据放在 构造函数 参数中 , 传递进来 , 并在 构造函数 中 , 为 成员变量 赋值具体的值 ;

此处需要注意的是 , 这里传入的是 C 语言中的字符串 , 也就是 char * 类型的指针 , 传入后拷贝字符串时 , 需要判定字符串的长度 ;

// 有参构造函数
Student(int age, const char* name)
{// 为 m_name 成员分配内存m_name = (char*)malloc(100);// 为 m_name 成员设置字符串值if (m_name != NULL){strcpy_s(m_name, length, name);}// 为 m_age 成员设置初始值m_age = age;cout << "调用有参构造函数" << endl;
}

下面的代码 , 使用了 2 种方法 , 手动调用了 有参构造函数 ;

// 调用有参构造函数
Student s2 = Student(18, "Tom");
// 打印 Student s1 实例对象值
cout << "name : " << s2.m_name << " , age : " << s2.m_age << endl;

有参构造函数有很多调用方法 , 下一篇博客详细分析每种调用方法的作用 ;


拷贝构造函数


拷贝构造函数 : 拷贝构造函数 也是 有参构造函数 中的一种 , 传入的是 相同类型的 常量引用 , 该引用指向的内容在函数内不可修改 ;

在 " 拷贝构造函数 " 中 , 主要读取 现有 实例对象 中每个 成员变量的值 , 将其赋值给 新创建的 实例对象 中的每个成员变量值 ;

新创建的 实例对象 , 与原来的 实例对象 只是值相同 , 数据地址完全不同 , 没有引用关系 ;

	// 拷贝构造函数Student(const Student& obj){// 为 m_name 成员分配内存m_name = (char*)malloc(100);// 为 m_name 成员设置字符串值if (m_name != NULL){strcpy_s(m_name, sizeof(obj.m_name), obj.m_name);}// 为 m_age 成员设置初始值m_age = obj.m_age;cout << "调用拷贝构造函数" << endl;}




二、代码示例 - 三种类型构造函数定义与调用



在下面的代码中 , 分别在 Student 类中定义了

  • 无参构造函数
  • 有参构造函数
  • 拷贝构造函数

分别调用了上述三种类型的 构造函数 ;


完整代码示例 :

#include "iostream"
using namespace std;class Student
{
public:// 无参构造函数Student(){// 为 m_name 成员分配内存m_name = (char*)malloc(100);// 为 m_name 成员设置字符串值if(m_name != NULL){strcpy_s(m_name, 5, "name");}// 为 m_age 成员设置初始值m_age = 0;cout << "调用无参构造函数" << endl;}// 有参构造函数Student(int age, const char* name){// 为 m_name 成员分配内存m_name = (char*)malloc(100);// 为 m_name 成员设置字符串值if (m_name != NULL){strcpy_s(m_name, sizeof(name), name);}// 为 m_age 成员设置初始值m_age = age;cout << "调用有参构造函数" << endl;}// 拷贝构造函数Student(const Student& obj){// 为 m_name 成员分配内存m_name = (char*)malloc(100);// 为 m_name 成员设置字符串值if (m_name != NULL){strcpy_s(m_name, sizeof(obj.m_name), obj.m_name);}// 为 m_age 成员设置初始值m_age = obj.m_age;cout << "调用拷贝构造函数" << endl;}~Student(){// 销毁 name 指向的堆内存空间if (m_name != NULL){free(m_name);}cout << "调用析构函数" << endl;}public:int m_age;char* m_name;
};int main()
{// 声明 Student 类型实例对象// 调用无参构造函数Student s1;// 打印 Student s1 实例对象值cout << "name : " << s1.m_name << " , age : " << s1.m_age << endl;// 手动调用有参构造函数// 直接调用构造函数会产生匿名对象, 涉及到该匿名对象的生命周期Student s2 = Student(18, "Tom");// 打印 Student s1 实例对象值cout << "name : " << s2.m_name << " , age : " << s2.m_age << endl;// 调用拷贝构造函数Student s3 = Student(s2);// 打印 Student s3 实例对象值cout << "name : " << s3.m_name << " , age : " << s3.m_age << endl;// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
}

执行结果 :

调用无参构造函数
name : name , age : 0
调用有参构造函数
name : Tom , age : 18
调用拷贝构造函数
name : Tom , age : 18
Press any key to continue . . .

在这里插入图片描述

相关文章:

【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用 )

文章目录 一、构造函数分类1、构造函数分类简介2、构造函数分类代码分析无参构造函数有参构造函数拷贝构造函数 二、代码示例 - 三种类型构造函数定义与调用 一、构造函数分类 1、构造函数分类简介 C 构造函数可以分为以下几类 : 无参构造函数 : 最简单也是默认的构造函数 , 函…...

胡焕庸线,我国东西地级市分布密度分界线

背景 黑河—腾冲线&#xff0c;又名胡焕庸线&#xff0c;是我国人口密度分布的东西近似分界线。今天把地级市坐标分布密度做成热力图&#xff0c;并与胡焕庸线一起展示时&#xff0c;惊奇的发现&#xff0c;胡焕庸线貌似也是我车东西地级市分布密度的分界线。 生成folium地图…...

里氏替换原则在继承关系中子类对父类方法的重写(覆盖)或重载时应遵循的规则

什么是里氏替换原则&#xff1a;只要父类能出现的地方子类就可以出现&#xff0c;而且 替换为子类也不会产生任何错误或异常&#xff0c;使用者可能根本就不需要知道是父类还是子类。但是&#xff0c;反过来就不行了&#xff0c;有子类出现的地方&#xff0c;父类未必就能适应。…...

【脑机接口开源数据处理包】brainflowBrainFlow是一个库,旨在获取,解析和分析脑电图,肌电图,心电图和其他类型的数据从生物传感器。

BrainFlow是一个库&#xff0c;旨在获取&#xff0c;解析和分析脑电图&#xff0c;肌电图&#xff0c;心电图和其他类型的数据从生物传感器。 brainflow开源库官网地址 [https://brainflow.readthedocs.io/en/stable/](https://brainflow.readthedocs.io/en/stable/) 它提供了…...

#452. 序列操作

序列操作 - 题目 - Daimayuan Online Judge 问题描述&#xff1a; 思路&#xff1a;首先想的是第二次操作的y可以将前面所以操作进行抵消&#xff0c;只需要第二次操作的最大值即可。但是发现&#xff0c;对于第一个操作&#xff0c;它是单点修改&#xff0c;每修改一次对于第…...

《Python深度学习-Keras》精华笔记3:解决深度学习多分类问题

公众号&#xff1a;机器学习杂货店作者&#xff1a;Peter编辑&#xff1a;Peter 持续更新《Python深度学习》一书的精华内容&#xff0c;仅作为学习笔记分享。 本文是第三篇&#xff1a;介绍如何使用Keras解决Python深度学习中的多分类问题。 多分类问题和二分类问题的区别注意…...

区块链世界的大数据入门之zkMapReduce简介

1. 引言 跨链互操作性的未来将围绕多链dapp之间的动态和数据丰富的关系构建。Lagrange Labs 正在构建粘合剂&#xff0c;以帮助安全地扩展基于零知识证明的互操作性。 2. ZK大数据栈 Lagrange Labs 的ZK大数据栈 为一种专有的证明结构&#xff0c;用于在任意动态分布式计算的…...

Python流程控制语句-条件判断语句练习及应用详解

文章目录 简介条件判断语句&#xff08;if语句&#xff09;练习1&#xff1a;判断奇偶数练习2&#xff1a;判断闰年练习3&#xff1a;计算狗的年龄相当于人的年龄练习4&#xff1a;根据成绩奖励练习5&#xff1a;选择婚姻对象 小结 python 学习专栏推荐python基础知识&#xff…...

(十)ElasticSearch高级使用【别名,重建索引,refresh操作,高亮查询,查询建议】

1.别名使用 1&#xff09;别名作用 在开发中&#xff0c;随着业务需求的迭代&#xff0c;较⽼的业务逻辑就要⾯临更新甚⾄是重构&#xff0c;⽽对于es来说&#xff0c;为了 适应新的业务逻辑&#xff0c;可能就要对原有的索引做⼀些修改&#xff0c;⽐如对某些字段做调整&…...

基于小波神经网络的中药材价格预测,基于ANN的小波神经网络中药材价格预测

目标 背影 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 小波神经网络(以小波基为传递函数的BP神经网络) 代码链接:基于小波神经网络的中药材价格预测,ANN小波神经网络中药材价格预测资源-CS…...

thinkPhp5返回某些指定字段

//去除掉密码$db new UserModel();$result $db->field(password,true)->where("username{$params[username]} AND password{$params[password]}")->find(); 或者指定要的字段的数组 $db new UserModel();$result $db->field([username,create_time…...

基于docker环境的tomcat开启远程调试

背景&#xff1a; Tomcat部署在docker环境中&#xff0c;使用rancher来进行管理&#xff0c;需要对其进行远程调试。 操作步骤&#xff1a; 1.将容器中的catalina.sh映射出来&#xff0c;便于对其修改&#xff0c;添加远程调试相关参数。 注意&#xff1a;/data/produce2201…...

ELK日志框架图总结

ELK日志框架图总结 本文目录 ELK日志框架图总结Elastic Stack介绍模式分层图beatselasticsearchkibana模式logstashelasticsearchkibana模式beatslogstashelasticsearchkibana模式beats缓存/消息队列logstashelasticsearchkibana模式elkspringboot Elastic Stack介绍 官网&…...

go 每天定时任务 --chatGPT

问&#xff1a;clearLog(hour&#xff0c;cmds),定时执行shell 命令&#xff0c;hour 为每天的几点&#xff0c;cmds 为linux命令数组字符串&#xff08;如 1&#xff0c;{"ls","cd"}&#xff09; gpt: 要编写一个 Go 函数 clearLog&#xff0c;该函数可…...

Lightdb 23.3 plorasql函数支持DML

开篇立意 oracle在函数中使用dml语句时&#xff0c;有两者情况。即&#xff1a;&#xff08;1&#xff09;直接使用select调用该函数&#xff1b;&#xff08;2&#xff09;在匿名块中调用该函数。 针对第一种情况我们测试一下 简单的函数&#xff1a; create table nested_t…...

电容笔值不值得买?开学季比较好用的电容笔

眼看着新学期即将到来&#xff0c;到底应该选择什么样的电容笔&#xff1f;一款原装的苹果Pencil&#xff0c;就卖到了将近一千块&#xff0c;这对于很多人来说&#xff0c;都是一个十分昂贵的价格。事实上&#xff0c;由于平替电容笔的价格非常便宜&#xff0c;只要一二百元就…...

Mybatis 框架 ( 五 ) 分页

4.6.分页 Mybatis-plus 内置分页插件, 并支持多种数据库 官网 : 分页插件 | MyBatis-Plus (baomidou.com) 4.6.1.增加拦截器 通过 MapperScan 指定 mapper接口的路径 import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plug…...

Python模板注入

概念 发生在使用模板引擎解析用户提供的输入时。模板注入漏洞可能导致攻击者能够执行恶意代码或访问未授权的数据。 模板引擎可以让&#xff08;网站&#xff09;程序实现界面与数据分离&#xff0c;业务代码与逻辑代码分离。即也拓宽了攻击面&#xff0c;注入到模板中的代码可…...

Java常用的设计模式

单例模式&#xff08;Singleton Pattern&#xff09;: 确保一个类只有一个实例&#xff0c;并提供一个全局访问点。示例&#xff1a;应用程序中的配置管理器。 工厂模式&#xff08;Factory Pattern&#xff09;: 用于创建对象的模式&#xff0c;封装对象的创建过程。示例&…...

攻防世界-WEB-Web_php_include

打开靶机 通过代码审计可以知道&#xff0c;存在文件包含漏洞&#xff0c;并且对伪协议php://进行了过滤。 发现根目录下存在phpinfo 观察phpinfo发现如下&#xff1a; 这两个都为on 所以我们就可以使用data://伪协议 payload如下&#xff1a; - ?pagedata://text/plain,…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...