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

C++构造函数详解

构造函数详解:C++ 中对象初始化与构造函数的使用

在这里插入图片描述

在 C++ 中,构造函数是一种特殊的成员函数,它在创建对象时自动调用,用来初始化对象的状态。构造函数帮助我们确保每个对象在被创建时就处于一个有效的状态,并且在不传递任何参数的情况下,也能保证对象有合理的初始值。本文将详细探讨构造函数的作用、类型、用法,并通过具体的例子来展示如何使用构造函数进行对象初始化。


1. 构造函数的作用

构造函数的主要作用是初始化对象。当我们创建一个对象时,构造函数会被自动调用,给对象的成员变量赋初值。通过构造函数,程序员可以控制对象创建时的初始化过程,确保对象处于合适的状态。

  • 对象初始化:构造函数用于给对象的成员变量赋初值。
  • 保证一致性:构造函数能确保对象在创建时被初始化为合法状态,避免对象的成员变量处于未定义的状态。

2. 构造函数的类型

构造函数可以根据其是否需要参数,分为两种类型:

  • 无参构造函数:不带任何参数,通常用于创建对象时没有特殊初始化需求。
  • 带参构造函数:带有一个或多个参数,可以在创建对象时传递特定的初始值。
2.1 无参构造函数

无参构造函数是默认的构造函数,它通常用于给成员变量赋一个通用的默认值。如果没有为对象提供参数,构造函数会被自动调用,初始化对象。

示例:

class Box {
public:int height, width, length;// 无参构造函数Box() {height = 10;width = 10;length = 10;}void display() {cout << "Height: " << height << ", Width: " << width << ", Length: " << length << endl;}
};int main() {Box box1;  // 调用无参构造函数box1.display();  // 输出: Height: 10, Width: 10, Length: 10return 0;
}

解释

  • 在这个例子中,Box 类的无参构造函数为 heightwidthlength 成员变量赋了默认值 10
  • box1 对象被创建时,构造函数会被自动调用,并初始化成员变量。
2.2 带参构造函数

带参构造函数允许在对象创建时为成员变量传递初始值。它适用于在创建对象时,需要指定对象属性的场景。

示例:

class Box {
public:int height, width, length;// 带参构造函数Box(int h, int w, int l) {height = h;width = w;length = l;}void display() {cout << "Height: " << height << ", Width: " << width << ", Length: " << length << endl;}
};int main() {Box box2(15, 20, 25);  // 调用带参构造函数box2.display();  // 输出: Height: 15, Width: 20, Length: 25return 0;
}

解释

  • 在此例中,带参构造函数通过 heightwidthlength 三个参数初始化对象的成员变量。
  • 通过 box2(15, 20, 25) 创建 box2 对象时,构造函数会自动被调用,并使用提供的参数值初始化成员变量。

3. 使用初始化列表

初始化列表是在构造函数的头部列出对成员变量的初始化方式,这种方式比在构造函数体内赋值更加高效。使用初始化列表,C++ 会直接在对象创建时对成员进行初始化,而不是先分配内存后再赋值。

示例:

class Box {
public:int height, width, length;// 使用初始化列表Box(int h, int w, int l) : height(h), width(w), length(l) {}void display() {cout << "Height: " << height << ", Width: " << width << ", Length: " << length << endl;}
};int main() {Box box3(10, 20, 30);  // 调用带参构造函数并使用初始化列表box3.display();  // 输出: Height: 10, Width: 20, Length: 30return 0;
}

解释

  • Box(int h, int w, int l) : height(h), width(w), length(l) 是初始化列表,它直接在对象创建时为成员变量赋值。
  • 相比于在构造函数体内进行赋值,初始化列表更加高效。

4. 构造函数的重载

构造函数支持重载,即同一个类中可以定义多个构造函数,只要它们的参数列表不同。这样我们就可以根据不同的初始化需求,使用不同的构造函数。

示例:

class Box {
public:int height, width, length;// 无参构造函数Box() {height = 10;width = 10;length = 10;}// 带参构造函数Box(int h, int w, int l) : height(h), width(w), length(l) {}void display() {cout << "Height: " << height << ", Width: " << width << ", Length: " << length << endl;}
};int main() {Box box1;  // 调用无参构造函数Box box2(15, 20, 25);  // 调用带参构造函数box1.display();  // 输出: Height: 10, Width: 10, Length: 10box2.display();  // 输出: Height: 15, Width: 20, Length: 25return 0;
}

解释

  • Box 类定义了两个构造函数:一个无参构造函数和一个带参构造函数。
  • main 函数中,我们可以根据需求选择使用不同的构造函数来初始化对象。

5. 构造函数重载中的歧义性

构造函数重载可能会引发歧义,特别是当构造函数的参数有默认值时。如果调用时参数的数量不确定,编译器可能无法确定调用哪个构造函数。

示例:

class Box {
public:int height, width, length;// 带默认参数的构造函数Box(int h, int w = 10, int l = 10) : height(h), width(w), length(l) {}// 两个参数的构造函数Box(int h, int w) : height(h), width(w), length(10) {}void display() {cout << "Height: " << height << ", Width: " << width << ", Length: " << length << endl;}
};int main() {Box box1(15);  // 产生歧义:调用哪个构造函数?box1.display();return 0;
}

解释

  • Box(15) 调用时,编译器无法确定调用哪个构造函数,因为 Box(int h, int w = 10, int l = 10)Box(int h, int w) 都可以匹配 15 作为参数。为了避免这种歧义,通常可以明确指定所有参数或避免使用多个带默认值的构造函数。

6. 使用默认参数的构造函数

构造函数可以使用默认参数值,使得在调用时可以选择性地传递参数,而其他参数则使用默认值。这种方式通常非常有用,可以简化代码。

示例:

class Box {
public:int height, width, length;// 带默认参数的构造函数Box(int h = 10, int w = 10, int l = 10) : height(h), width(w), length(l) {}void display() {cout << "Height: " << height << ", Width: " << width << ", Length: " << length << endl;}
};int main() {Box box1;            // 使用默认参数,所有参数都为10Box box2(15);        // 使用默认参数,height = 15,其他参数为10Box box3(20, 30);    // 使用默认参数,height = 20,width = 30,length = 10box1.display();      // 输出: Height: 10, Width: 10, Length: 10box2.display();      // 输出: Height: 15, Width: 10, Length: 10box3.display();      // 输出: Height: 20, Width: 30, Length: 10return 0;
}

解释

  • 使用默认参数的构造函数,允许在调用时只传递部分参数,而其他参数则使用默认值。

7. 总结

构造函数是 C++ 中非常重要的一部分,它帮助我们初始化对象的状态,确保对象在创建时处于一个有效的状态。通过理解无参构造函数、带参构造函数、初始化列表、构造函数重载等内容,我们可以更加灵活地使用构造函数来创建和初始化对象。

  • 无参构造函数:用于给对象赋予默认值。
  • 带参构造函数:用于传递特定的初始值。
  • 初始化列表:更高效的成员初始化方式。
  • 构造函数重载:根据不同的初始化需求,选择合适的构造函数。
  • 默认参数:通过使用默认参数简化对象创建的代码。

希望通过这篇文章,您能更好地理解 C++ 中构造函数的用法,并能够在实际编程中灵活应用构造函数来初始化对象。

相关文章:

C++构造函数详解

构造函数详解&#xff1a;C 中对象初始化与构造函数的使用 在 C 中&#xff0c;构造函数是一种特殊的成员函数&#xff0c;它在创建对象时自动调用&#xff0c;用来初始化对象的状态。构造函数帮助我们确保每个对象在被创建时就处于一个有效的状态&#xff0c;并且在不传递任何…...

POI实现根据PPTX模板渲染PPT

目录 1、前言 2、了解pptx文件结构 3、POI组件 3.1、引入依赖 3.2、常见的类 3.3、实现原理 3.4、关键代码片段 3.4.1、获取ppt实例 3.4.2、获取每页幻灯片 3.4.3、循环遍历幻灯片处理 3.4.3.1、文本 3.4.3.2、饼图 3.4.3.3、柱状图 3.4.3.4、表格 3.4.3.5、本地…...

【论文模型复现】深度学习、地质流体识别、交叉学科融合?什么情况,让我们来看看

文献&#xff1a;蓝茜茜,张逸伦,康志宏.基于深度学习的复杂储层流体性质测井识别——以车排子油田某井区为例[J].科学技术与工程,2020,20(29):11923-11930. 本文目录 一、前言二、文献阅读-基于深度学习的复杂储层流体性质测井识别2.1 摘要2.2 当前研究不足2.3 本文创新2.4 论文…...

树的直径计算:算法详解与实现

树的直径计算:算法详解与实现 1. 引言2. 算法概述3. 伪代码实现4. C语言实现5. 算法分析6. 结论在图论中,树的直径是一个关键概念,它表示树中任意两点间最长路径的长度。对于给定的树T=(V,E),其中V是顶点集,E是边集,树的直径定义为所有顶点对(u,v)之间最短路径的最大值。…...

conda创建 、查看、 激活、删除 python 虚拟环境

1、创建 python 虚拟环境 ,假设该环境命名为 “name”。 conda create -n name python3.11 2、查看 python 虚拟环境。 conda info -e 3、激活使用 python 虚拟环境。 conda activate name 4、删除 python 虚拟环境 conda remove -n name --all ​​ 助力快速掌握数据集…...

vs2022搭建opencv开发环境

1 下载OpenCV库 https://opencv.org/ 下载对应版本然后进行安装 将bin目录添加到系统环境变量opencv\build\x64\vc16\bin 复制该路径 打开高级设置添加环境变量 vs2022新建一个空项目 修改属性添加头文件路径和库路径 修改链接器&#xff0c;将OpenCV中lib库里的o…...

NVIDIA NIM 开发者指南:入门

NVIDIA NIM 开发者指南&#xff1a;入门 NVIDIA 开发者计划 想要了解有关 NIM 的更多信息&#xff1f;加入 NVIDIA 开发者计划&#xff0c;即可免费访问任何基础设施云、数据中心或个人工作站上最多 16 个 GPU 上的自托管 NVIDIA NIM 和微服务。 加入免费的 NVIDIA 开发者计…...

探索Python网络请求新纪元:httpx库的崛起

文章目录 **探索Python网络请求新纪元&#xff1a;httpx库的崛起**第一部分&#xff1a;背景介绍第二部分&#xff1a;httpx库是什么&#xff1f;第三部分&#xff1a;如何安装httpx库&#xff1f;第四部分&#xff1a;简单的库函数使用方法1. 发送GET请求2. 发送POST请求3. 超…...

学了Arcgis的水文分析——捕捉倾泻点,河流提取与河网分级,3D图层转要素失败的解决方法,测量学综合实习网站存着

ArcGIS水文分析实战教程&#xff08;7&#xff09;细说流域提取_汇流域栅格-CSDN博客 ArcGIS水文分析实战教程&#xff08;6&#xff09;河流提取与河网分级_arcgis的dem河流分级-CSDN博客 ArcGIS水文分析实战教程&#xff08;5&#xff09;细说流向与流量-CSDN博客 ArcGIS …...

QQ 小程序已发布,但无法被搜索的解决方案

前言 我的 QQ 小程序在 2024 年 8 月就已经审核通过&#xff0c;上架后却一直无法被搜索到。打开后&#xff0c;再在 QQ 上下拉查看 “最近使用”&#xff0c;发现他出现一下又马上消失。 上线是按正常流程走的&#xff0c;开发、备案、审核&#xff0c;没有任何违规&#xf…...

【C++】拷贝构造 和 赋值运算符重载

目录&#xff1a; 一、拷贝构造 &#xff08;一&#xff09;拷贝函数的特点 二、赋值运算符重载 &#xff08;一&#xff09;运算符重载 &#xff08;二&#xff09;赋值运算符重载 正文 一、拷贝构造 如果一个构造函数的第一个参数是自身类类型的引用&#xff0c;且任何…...

21.UE5游戏存档,读档,函数库

2-23 游戏存档、读档、函数库_哔哩哔哩_bilibili 目录 1.存档蓝图 2.函数库 2.1保存存档 2.2读取存档&#xff1a; 3.加载游戏&#xff0c;保存游戏 3.1游戏实例对象 3.2 加载游戏 3.3保存游戏 这一节的内容较为错综复杂&#xff0c;中间没有运行程序进行阶段性成果的验…...

「Mac玩转仓颉内测版14」PTA刷题篇5 - L1-005 考试座位号

本篇将继续讲解PTA平台上的题目 L1-005 考试座位号&#xff0c;通过考生准考证号与座位号的对应关系&#xff0c;掌握简单的数据查询与映射操作&#xff0c;进一步提升Cangjie编程语言的实际应用能力。 关键词 PTA刷题数据查询映射操作输入输出Cangjie语言 一、L1-005 考试座位…...

Vue3引用高德地图,进行位置标记获取标记信息

首先安装地图插件 cnpm i amap/amap-jsapi-loader --save封装地图子组件 <template><el-dialogtitle"选择地点"width"740px"class"select-map-dialog"v-model"dialogShow":close-on-click-modal"false":modal-or…...

《C++设计模式:重塑游戏角色系统类结构的秘籍》

在游戏开发领域&#xff0c;游戏角色系统的类结构设计至关重要。一个良好的类结构可以使游戏更易于扩展、维护和优化&#xff0c;而 C中的设计模式为我们提供了强大的工具来实现这一目标。 一、理解游戏角色系统的复杂性 游戏角色系统通常具有高度的复杂性。每个角色都有自己…...

深入浅出 Go 语言:现代编程的高效选择

深入浅出 Go 语言:现代编程的高效选择 引言 Go 语言(也称 Golang)是由 Google 开发的一种现代编程语言,面向高效、简单和并发。自 2009 年问世以来,它已迅速成长为许多企业和开发者首选的语言,尤其是在后端开发、云计算和微服务领域。 本文旨在从 Go 语言的设计哲学、…...

RDIFramework.NET CS敏捷开发框架 V6.1发布(.NET6+、Framework双引擎、全网唯一)

RDIFramework.NET C/S敏捷开发框架V6.1版本迎来重大更新与调整&#xff0c;全面重新设计业务逻辑代码&#xff0c;代码量减少一半以上&#xff0c;开发更加高效。全系统引入全新字体图标&#xff0c;整个界面焕然一新。底层引入最易上手的ORM框架SqlSugar&#xff0c;让开发更加…...

vue路由的钩子函数?

在 Vue 中&#xff0c;路由的钩子函数可以用来在导航过程中执行一些操作&#xff0c;比如进行权限验证、页面加载前后的处理等。常用的路由钩子函数包括全局前置守卫、全局解析守卫、全局后置钩子以及路由独享守卫。下面是这些路由守卫函数的简要说明&#xff1a; 全局前置守卫…...

【Java】枚举类映射

在数据库中常用数字来代替字符串类型&#xff0c;编写一个枚举映射类 当数据库的介质类型要存储数字&#xff0c;前端可以任意传参&#xff0c;通过枚举转换后端都会转成数字对应类型 import lombok.Getter;/*** <p>* 存档介质类型* </p>** author Jyang* date 2…...

精华帖分享|浅谈金融时间序列分析与股价随机游走

本文来源于量化小论坛公共讨论区板块精华帖&#xff0c;作者为正扬&#xff0c;发布于2024年6月3日。 以下为精华帖正文&#xff1a; 01 引 时间序列分析是个很唬人的术语&#xff0c;实际上它也不是一个很容易接近的话题。我本科曾经短暂地学过一点点&#xff0c;又看到互联…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...

Linux-进程间的通信

1、IPC&#xff1a; Inter Process Communication&#xff08;进程间通信&#xff09;&#xff1a; 由于每个进程在操作系统中有独立的地址空间&#xff0c;它们不能像线程那样直接访问彼此的内存&#xff0c;所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...

字符串哈希+KMP

P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...

react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架

1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...