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

C++——构造函数

C++——构造函数

什么是构造函数

类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。

构造,那构造的是什么呢?

构造成员变量的初始化值,内存空间等

构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。

示例

#include <iostream>using namespace std;class Car {
public:string brand; // 不需要使用std::stringint year;Car(){cout<<"无参函数被调用"<<endl;}Car(string b,int y){cout<<"带两个参数函数被调用"<<endl;brand=b;year=y;}Car(string b){cout<<"带一个参数函数被调用"<<endl;brand=b;}void display(){cout<<"brand:"<<brand<<",year:"<<year<<endl;}
};int main()
{Car car;car.brand="比亚迪";car.year=2022;car.display();Car *car2=new  Car("宝马");car2->year=2023;car2->display();Car *car3=new Car("奇瑞",2024);car3->display();return 0;
}

使用初始化列表

在C++中,使用初始化列表来初始化类的字段是一种高效的初始化方式,尤其在构造函数中。初始化列表直接在对象的构造过程中初始化成员变量,而不是先创建成员变量后再赋值。这对于提高性能尤其重要,特别是在涉及到复杂对象或引用和常量成员的情况下。

初始化列表紧跟在构造函数参数列表后面,以冒号( : )开始,后跟一个或多个初始化表达式,每个表达式通常用逗号分隔。

下面是使用初始化列表初始化字段的例子:

class MyClass {private:int a;double b;std::string c;
public:// 使用初始化列表来初始化字段MyClass(int x, double y, const std::string& z) : a(x), b(y), c(z) {// 构造函数体}
}

在这个例子中, MyClass 有三个成员变量: a ( int 类型)、 b ( double 类型)和 c( std::string 类型)。当创建 MyClass 的一个实例时,我们通过构造函数传递三个参数,这些参数

被用于通过初始化列表直接初始化成员变量。初始化列表 : a(x), b(y), c(z) 的意思是用 x 初始化a ,用 y 初始化 b ,用 z 初始化 c 。

初始化列表的优点包括:

  1. 效率:对于非基本类型的对象,使用初始化列表比在构造函数体内赋值更高效,因为它避免了先默

认构造然后再赋值的额外开销。

  1. 必要性:对于引用类型和常量类型的成员变量,必须使用初始化列表,因为这些类型的成员变量在

构造函数体内不能被赋值。

  1. 顺序:成员变量的初始化顺序是按照它们在类中声明的顺序,而不是初始化列表中的顺序。

使用初始化列表是C++中推荐的初始化类成员变量的方式,因为它提供了更好的性能和灵活性。

相关文章:

  • Android使用ScrollView导致鼠标点击事件无效
  • LeetCode 热题 100 | 链表(上)
  • 解决Docker AList本地挂载失效的问题。
  • 免费电视TV盒子软件,好用的免费电视盒子软件大全,免费电视盒子APP大全,2024最新整理
  • 影院购票|电影院订票选座小程序|基于微信小程序的电影院购票系统设计与实现(源码+数据库+文档)
  • npm 以组织为单位发布依赖包(@username/package-name、@org-name/package-name)
  • 【全网最全】2024美赛ABCDEF题思路模型全解(后续会更新)
  • go语言标准库flag命令行参数解析
  • HDFS Federation前世今生
  • ChatGPT炸裂了
  • Mac安装及配置MySql及图形化工具MySQLworkbench安装
  • 贪吃蛇/链表实现(C/C++)
  • Django_基本增删改查
  • Leetcode—2950. 可整除子串的数量【中等】Plus(前缀和题型)
  • 面试经典 150 题 -- 滑动窗口 (总结)
  • [译]如何构建服务器端web组件,为何要构建?
  • Android 架构优化~MVP 架构改造
  • const let
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • go append函数以及写入
  • JAVA多线程机制解析-volatilesynchronized
  • Java反射-动态类加载和重新加载
  • Material Design
  • mongo索引构建
  • React中的“虫洞”——Context
  • VuePress 静态网站生成
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 搭建gitbook 和 访问权限认证
  • 协程
  • 怎样选择前端框架
  • 找一份好的前端工作,起点很重要
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • # C++之functional库用法整理
  • #include<初见C语言之指针(5)>
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (C语言)字符分类函数
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .libPaths()设置包加载目录
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET CF命令行调试器MDbg入门(一)
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET 设计一套高性能的弱事件机制
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .NET企业级应用架构设计系列之结尾篇
  • .net项目IIS、VS 附加进程调试
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [Android 13]Input系列--获取触摸窗口
  • [Angular] 笔记 18:Angular Router
  • [C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh
  • [INSTALL_FAILED_TEST_ONLY],Android开发出现应用未安装
  • [Jquery] 实现鼠标移到某个对象,在旁边显示层。
  • [leetcode top100] 0924 找到数组中消失的数,合并二叉树,比特位计数,汉明距离