【C++】构造函数分类 ③ ( 调用有参构造函数的方法 | 括号法 | 等号法 )

news2024/11/17 19:46:56

文章目录

  • 一、在不同的内存中创建类的实例对象
    • 1、括号法调用构造函数
    • 2、等号法调用构造函数
  • 二、完整代码示例





一、在不同的内存中创建类的实例对象



在上一篇博客 【C++】构造函数分类 ② ( 在不同的内存中创建类的实例对象 | 栈内存中创建实例对象 | new 关键字创建对象 ) 中 , 分析了 在 栈内存 和 堆内存 中创建对象 的 两种情况 ;

本篇博客中 , 继续分析 , 栈内存中调用 有参构造函数的 两种方法 :

  • 括号法
  • 等号法

C++ 类成员变量为 :

public:
	int m_age;
	char* m_name;

之后都是以该成员变量为参考 , 为这两个成员变量赋值 ;


1、括号法调用构造函数


首先 , 在 Student 类中, 定义两个有参的构造函数 , 之后就使用括号法调用上述构造函数 ;

	// 有参构造函数
	Student(int age, const char* name)
	{
		// 方法体 省略
		cout << "调用有参构造函数" << endl;
	}

不推荐的用法 : 通过 Student(18, “Tom”) 方法 , 手动调用有参的构造函数 , 上述代码会产生一个匿名的 Student 实例对象 , 然后再将该 匿名对象 赋值给 栈内存中的 Student s2 变量 ;

匿名对象创建完成后 , 会立刻进行初始化 ;

	// 手动调用有参构造函数
	// 直接调用构造函数会产生匿名对象, 涉及到该匿名对象的生命周期
	Student s2 = Student(18, "Tom");

推荐的用法 : 在栈内存中创建 类的 实例对象 , 推荐使用 下面的方法 , 在声明的 栈内存变量名称后 , 直接使用括号 , 并传入构造函数的参数 ;

	// 使用 括号法 调用有参构造函数
	Student s4(1, "J");

调用 Student s4(1, “J”) 创建实例对象 , 相当于调用了 Student(int age, const char* name) 有参构造函数 , 然后将实例对象赋值给了 s4 变量 ;


2、等号法调用构造函数


首先 , 定义单个参数的 构造函数 ;

	// 有参构造函数
	Student(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 = 0;

		cout << "调用有参构造函数" << endl;
	}

使用 等号法 调用 有一个参数的 有参构造函数 ,

将 字符串 直接赋值给 Student s5 变量 , 相当于调用了 Student(const char* name) 有参构造函数 , 并将创建的 实例对象 赋值给 s5 变量 ,

这是 C++ 对 = 等号运算符的增强 ;

	// 使用 等号法 调用 有一个参数的 有参构造函数
	// C++ 对等号进行了功能增强
	Student s5 = "K";




二、完整代码示例



在下面的代码中 ,

声明 Student 类时 , 定义了 :

  • 默认无参构造函数
  • 有参构造函数 - 1 个参数
  • 有参构造函数 - 2 个参数
  • 拷贝构造函数 - 1 个参数的有参构造函数 , 函数类型是 Student(const Student& obj)

调用构造函数 创建实例对象 时 , 分别使用了

  • 直接声明 Student 变量 , 自动调用 默认无参构造函数 ,
  • 使用括号法调用 2 参数有参构造函数
  • 调用 拷贝构造函数
  • 使用等号法调用 1 参数有参构造函数

代码示例 :

#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(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 = 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 s4(1, "J");
	// 打印 Student s4 实例对象值
	cout << "name : " << s4.m_name << " , age : " << s4.m_age << endl;

	// 使用 等号法 调用 有一个参数的 有参构造函数
	// C++ 对等号进行了功能增强
	Student s5 = "K";
	// 打印 Student s4 实例对象值
	cout << "name : " << s5.m_name << " , age : " << s5.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 : J , age : 1
调用有参构造函数
name : K , age : 0
调用拷贝构造函数
name : Tom , age : 18
请按任意键继续. . .

在这里插入图片描述

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

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

相关文章

从0到1学会Git(第三部分):Git的远程仓库链接与操作

写在前面:前面两篇文章我们已经学会了git如何在本地进行使用&#xff0c;这篇文章将讲解如何将本地的git仓库和云端的远程仓库链接起来并使用 为什么要使用远程仓库:因为我们需要拷贝我们的代码给别人以及进行协同开发&#xff0c;就需要有一个云端仓库进行代码的存储和同步&a…

nginx配置-gzip

1、想看nginx配置的时候&#xff0c;发现没有nginx命令&#xff0c;是没有配置环境变量。 cd etc/ vim profile 加入 unset i unset -f pathmunge PATH/usr/local/nginx/sbin:$JAVA_HOME/bin:$PATH //这一行 export JAVA_HOME/usr/local/soft/jdk8 expo…

qpushbutton 样式表

QPushButton {color:#ffffff; /*文字颜色*/background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #aa55ff, stop: 1 #1296db);/*背景色*/border-style:outset; /*边框风格*/border-width:2px;/*边框宽度*/border-color:#0055ff; /*边框颜色*/border-radius:10…

如何用 Java 找到字符串中的元音

这个题目其实不难&#xff0c;这是一个公司面试的时候要求的题目。 这个公司的面试有点意思&#xff0c;他们希望 Zoom 看我的电脑&#xff0c;然后让我解决问题。 题目 题目就非常简单了&#xff0c;他们给了我 2 个字符串。 其中一个是测试字符串&#xff0c;另外一个是元…

I2C 验证中需要注意的问题

I2C验证中需要注意的问题 1.NACK出现的时刻2.Restart和Start区别3.保持时间&#xff08;Thd&#xff09; 1.NACK出现的时刻 通常&#xff0c;在Master访问到错误的Device ID时&#xff0c;Slave会返回Nack&#xff0c;表示访问失败。此外&#xff0c;在Master对Slave读访问时&…

JWT认证、drf-jwt安装和简单使用、实战之使用Django auth的User表自动签发、实战之自定义User表,手动签发

一 JWT认证 在用户注册或登录后&#xff0c;我们想记录用户的登录状态&#xff0c;或者为用户创建身份认证的凭证。 我们不再使用Session认证机制&#xff0c;而使用Json Web Token&#xff08;本质就是token&#xff09;认证机制。Json web token (JWT), 是为了在网络应用环境…

沙丁鱼优化算法(Sardine optimization algorithm,SOA)求解23个函数MATLAB

一、沙丁鱼优化算法 沙丁鱼优化算法(Sardine optimization algorithm,SOA)由Zhang HongGuang等人于2023年提出&#xff0c;该算法模拟沙丁鱼的生存策略&#xff0c;具有搜索能力强&#xff0c;求解精度高等特点。 沙丁鱼主要以浮游生物为食&#xff0c;这些生物包括细菌、腔肠…

性能测试 —— Jmeter定时器

固定定时器 如果你需要让每个线程在请求之前按相同的指定时间停顿&#xff0c;那么可以使用这个定时器&#xff1b;需要注意的是&#xff0c;固定定时器的延时不会计入单个sampler的响应时间&#xff0c;但会计入事务控制器的时间 1、使用固定定时器位置在http请求中&#xf…

5.9.Webrtc线程事件处理

在前面的课程中呢&#xff0c;我已经向你介绍了事件处理的一些基础知识&#xff0c;那今天呢&#xff0c;我们再来看一下外边儿rtc下事件处理的基本逻辑是什么&#xff1f; 那首先呢&#xff0c;我们来看一下事件是如何协调线程工作的&#xff0c;那就如果这张图所展示的有两个…

一起学数据结构(6)——栈和队列

上篇文章中&#xff0c;对栈的概念及特点进行了解释&#xff0c;并且给出了栈实现的具体代码。本篇文章将给出队列的基本概念及特点。并给出相应的代码。 1. 队列的概念及结构&#xff1a; 在给出队列的概念之前&#xff0c;先给出上篇文章中提到的栈的概念&#xff1a;一种只…

JVM系列 运行时数据区

系列文章目录 第一章 运行区实验 文章目录 系列文章目录前言一、堆&#xff08;Heap&#xff09;1.1、新生代/Young区1.1.1、Eden区1.1.2、Survival区 1.2、年老代&#xff08;old区&#xff09; 二、虚拟机栈&#xff08;Stack&#xff09;2.1、栈顶缓存技术2.2、溢出2.3、栈…

约瑟夫环(循环列表实现)

约瑟夫&#xff08;Joseph&#xff09;问题的一种描述是&#xff1a;编号为1&#xff0c;2&#xff0c;3&#xff0c;…&#xff0c;n的n个人按顺时针方向围坐一圈。每人持有一个密码&#xff08;正整数&#xff09;。一开始任选一个正整数作为报数上限值m&#xff0c;从第一个…

vscode c++解决包含头文件红色波浪线问题

安装c/c插件后&#xff0c;按ctrlshiftp&#xff0c; 点击打开了c_cpp_properties.json文件&#xff0c;对其中的IncludePath进行编辑&#xff0c;示例如下&#xff1a; "includePath": ["${workspaceFolder}/**","${workspaceFolder}/include/**&q…

FastChat

Fast Chat是一个用于训练/部署和评估基于大型语言模型的聊天机器人的开发平台。其核心功能包括&#xff1a; 最先进模型的权重/训练代码和评估代码(例如Vicuna/FastChat-T5)基于分布式多模型的服务系统&#xff0c;具有Web界面和与OpenAI兼容的RESTful API。 安装 pip instal…

Dajngo01_Django框架基础与环境搭建

Dajngo01_Django框架基础与环境搭建 在正式开始学习Django之前&#xff0c;我们先简单了解一下Web应用程序的本质&#xff1a; 接收并解析HTTP请求&#xff0c;获取具体的请求信息处理本次HTTP请求&#xff0c;即完成本次请求的业务逻辑处理构造并返回处理结果——HTTP响应 那么…

Redis 数据一致性方案的分析与研究

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ 一般的业务场景都是读多写少的&#xff0c;当客户端的请求太多&#xff0c;对数据库的压力越来越大&#xff0c;引入缓存来降低数据库的压力是必然选择&#xff0c;目前业内…

【移动开发】最新uniapp开发的多端影视APP+后端对接的苹果CMS源码(可打包多端app)

介绍&#xff1a; 分享一款uniapp开发的多端影视APP源码&#xff0c;后端对接的是苹果10CMS。 这个APP有缓存、投屏、回放记录、收藏等功能&#xff0c;非常完善。 会员中心也使用苹果cms的数据。 可以打包到多个端的代码。 本APP前端用的UI框架是特漂亮的colorUI&#xff0…

当我们谈外包,我们在谈什么?

大家好&#xff0c;我是苍何&#xff0c;周末发小来找我玩耍&#xff0c;聊到了他当初在华为外包的经历&#xff0c;感触挺大的&#xff0c;给大家做下分享。 小 Z 大学专科材料专业毕业&#xff0c;毕业后报名了 IT 培训班&#xff0c;学习了一年&#xff0c;之后面试去了华为…

关于安卓grovvy开发(一)bugly混淆自动上报

背景 打包&#xff0c;mapping&#xff0c;上传&#xff0c;这些是不是都困扰了开发很多。苦于复制粘贴&#xff1f;反正我是。于是&#xff0c;有了这个 最终效果 最终的效果&#xff0c;就是点击项目的打包gradle&#xff0c;复制mapping文件且进行bugly混淆的自动上报。 …

基于单片机超声波测距语音播放

一、系统方案 本设计采用52单片机作为主控器&#xff0c;HC-SR04测距&#xff0c;液晶1602显示&#xff0c;按键设置报警阀值&#xff0c;语音报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 uint dist; // 保存超声波模块测量到的结果…