C++ 类和对象 构造函数

一 类的6个默认成员函数:

如果一个类中什么成员都没有,简称为空类。

例:

#include <iostream>
class Empty 
{// 空类,什么成员都没有
};

空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员 函数。

默认构造函数:如果用户没有定义任何构造函数,编译器会自动生成一个默认构造函数。

拷贝构造函数:用于创建一个对象是另一个对象的副本。如果用户没有定义,编译器会生成一个默认的拷贝构造函数。

拷贝赋值运算符:用于将一个对象赋值给另一个对象。如果用户没有定义,编译器会生成一个默认的拷贝赋值运算符。

移动构造函数:用于将资源从一个对象移动到另一个对象。如果用户没有定义,编译器会生成一个默认的移动构造函数。

移动赋值运算符:用于将资源从一个对象移动并赋值给另一个对象。如果用户没有定义,编译器会生成一个默认的移动赋值运算符。

析构函数:用于销毁对象并释放资源。如果用户没有定义,编译器会生成一个默认的析构函数。

默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。

二 构造函数:

2.1:构造函数的概念:

构造函数是一个特殊的成员函数,它的名称与类名相同,没有返回值。在创建类的对象时,构造函数由编译器自动调用,用于初始化对象的数据成员

2.2:构造函数的特征

函数名与类名相同。

没有返回值。

在对象实例化时由编译器自动调用。

构造函数可以重载,即一个类可以有多个构造函数,只要它们的参数列表不同。

2.3:无参/有参构造函数代码示例

class Date
{
public://有参数的构造函数://Date(int _year = 1999 , int _month = 2 , int _day = 26)// 无参构造函数:Date() //函数名与类名相同。{// 使用 this 指针访问成员变量this->_year = 2024;this->_month = 7;this->_day = 6;}void Print(){std::cout << this->_year << "-" << this->_month << "-" << this->_day << std::endl;}private:int _year;int _month;int _day;
};int main()
{Date d1; //调用无参数构造函数 d1.Print();//Date d2(2022, 7, 6); //调用带参构造函数//d2.Print();return 0;
}

Date()是无参的构造函数,没有参数。在对象 d1 创建时自动调用。你们有可能会问了,为什么在无参的构造函数里面this指针指向成员变量,那为什么main函数里见不到this指针呢?因为当 Date d1; 创建对象时,编译器会自动传递 d1 的地址给 this 指针所以就不需要显示this指针。

如果类中没有显式定义构造函数,编译器会自动生成一个无参的默认构造函数。一旦用户显式定义了任何构造函数,编译器将不再生成无参的默认构造函数。

2.4:默认构造函数代码示例

class Date 
{
public:void Print() {std::cout << _year << "-" << _month << "-" << _day << std::endl;}private:int _year;int _month;int _day;
};int main() 
{Date d1;d1.Print();return 0;
}

输出:

上面代码因我未显示定义构造函数所以编译器帮我生成了一个默认的构造函数而且是看不见的,那为什么默认生成的输出的值是随机值呢?

原来C++把类型分为内置类型和自定义类型,内置类型就是语言提供的基本数据类型,如intchar等。自定义类型是用户定义的类型,如使用classstructunion定义的类型。

2.5:内置类型和自定义类型的默认构造函数处理

内置类型:

   1.内置类型的成员变量在默认构造函数中不会被自动初始化

   2.如果不显式初始化,成员变量的值将是未定义的(即随机值)

自定义类型:

   1.自定义类型的成员变量在默认构造函数中会调用其默认构造函数。

   这意味着,即使你没有显式定义自定义类型的构造函数,编译器也会自动调用默认构造函数来       初始化这些成员变量。

例子:

class Time 
{
public:Time() {// Time类的无参构造函数std::cout << "Time()" << std::endl;_hour = 0;_minute = 0;_second = 0;}private:int _hour;int _minute;int _second;
};class Date 
{
public:Date()// 初始化内置类型成员变量{this->_year = 2024;this->_month = 7;this->_day = 5;}void Print(){std::cout << _year << "-" << _month << "-" << _day << std::endl;}private:int _year;  // 内置类型int _month; // 内置类型int _day;   // 内置类型Time _t;    // 自定义类型
};int main() 
{Date d;  // 调用无参构造函数d.Print();return 0;
}

输出:

我们来说一下它的执行顺序:首先是执行主函数main当执行到 Date d; 时编译器就会先去调用自定义函数Time_t;然后等它全部初始化完成 再去调用无参数构造并且初始化里面的内置类型。

那我们这是显式定义自定义类型的构造函数并且给成员变量赋值了,所以就不会出现随机值,如果想要显式定义自定义类型的构造函数并且不想要随机值那该怎么办呢?这时候C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在类中声明时可以给默认值。

例子:

class Date 
{
public:void Print(){std::cout << _year << "-" << _month << "-" << _day << std::endl;}private:int _year = 2024;  // 内置类型int _month = 2; // 内置类型int _day = 1;   // 内置类型
};

输出:

2.6:默认构造函数

在C++中,默认构造函数是指在创建对象时不需要提供任何参数的构造函数。默认构造函数可以分为两种:

  1. 默认构造函数:一个类只能有一个真正的默认构造函数(不需要参数)。
  2. 无参构造函数和全缺省参数构造函数
    • 如果参数不同,它们会重载,编译器不会报错。
    • 如果参数相同(即都没有参数),它们就相当于有两个默认构造函数,这时编译器会报错,因为无法区分调用哪个构造函数。

关键点

无参构造函数:没有参数的构造函数。 全缺省参数构造函数:所有参数都有默认值的构造函数。 重载:当构造函数的参数列表不同,它们可以共存且不会冲突。

 

例子:

class Date 
{
public:// 无参构造函数Date() {_year = 2024;_month = 7;_day = 2;}// 全缺省参数构造函数Date(int year = 2023, int month = 1, int day = 1) {_year = year;_month = month;_day = day;}void Print(){std::cout << _year << "-" << _month << "-" << _day << std::endl;}private:int _year;int _month;int _day;
};int main() 
{Date d;  // 调用无参构造函数d.Print();Date d2(2023, 4, 3);  // 调用全缺省参数构造函数d2.Print(); return 0;
}

输出:

之所以会报错是因为全缺省参数构造函数和无参数构造函数它们都有自己的默认值,当执行到Date d; 时它并不知道到底要调用哪一个所以就会报错,那怎么更改呢?只需要把全缺省参数的默认值给去掉就行了,这样编译器就不会迷糊到底要调用哪一个了

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用 SwiftUI 构建 visionOS 应用

文章目录 前言WindowsVolumes沉浸式空间结论 前言 Apple Vision Pro 即将推出&#xff0c;现在是看看 SwiftUI API 的完美时机&#xff0c;这使我们能够将我们的应用程序适应 visionOS 提供的沉浸式世界。苹果表示&#xff0c;构建应用程序的最佳方式是使用 Swift 和 SwiftUI。…

鸿翼ECM统一AI检索应用全景,为企业打造全方位搜索服务

随着企业的发展和信息化进程的加快&#xff0c;海量数据已沉淀至企业各类系统&#xff0c;系统间信息孤立、信息利用率低、数据价值无法发挥成为制约企业发展的重要因素。如何对散落在企业各系统中的数据、内容进行统一管理和高效利用&#xff0c;实现高效精准的信息检索&#…

谷粒商城学习-07-虚拟机网络设置

文章目录 一&#xff0c;找到配置文件Vagrantfile二&#xff0c;查询虚拟机网卡地址1&#xff0c;查看虚拟机网络配置2&#xff0c;查看宿主机网络配置 三&#xff0c;修改配置文件下的IP配置四&#xff0c;重新启动虚拟机即可生效五&#xff0c;Vagrantfile 的作用1&#xff0…

Qt中使用MySQL数据库详解,好用的模块类封装

本文将详细介绍如何在Qt应用程序中集成MySQL数据库&#xff0c;并封装实现好用的mysql数据库操作类。包括环境准备、连接数据库、执行查询及异常处理等关键步骤&#xff0c;同时包含mysql驱动的编译。分享给有需要的小伙伴&#xff0c;喜欢的可以点击收藏。 目录 环境准备 项…

Pinia:Vue 2 和 Vue 3 中更好用的状态管理框架

前言 还在用Vuex? 在Vue应用程序的开发过程中&#xff0c;高效且易于维护的状态管理一直是开发者关注的核心问题之一。随着Vue 3的发布&#xff0c;状态管理领域迎来了一位新星——Pinia&#xff0c;它不仅为Vue 3量身打造&#xff0c;同时也向下兼容Vue 2&#xff0c;以其简…

《C语言》认识数据类型和理解变量

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;C语言基础 目录 前言 一、数据类型的介绍 1.1 字符型 1.2 整形 1.3 浮点型 1.4 布尔类型 1.5 各种数据类型的长度 1.5.1 sizeof操作符 1.5.2 数据类型长度…

【博士每天一篇文献-算法】Adult neurogenesis acts as a neural regularizer

阅读时间&#xff1a;2023-12-20 1 介绍 年份&#xff1a;2022 作者&#xff1a;Lina M. Tran&#xff0c;Adam Santoro&#xff0c;谷歌DeepMind 期刊&#xff1a; Proceedings of the National Academy of Sciences 引用量&#xff1a;13 代码&#xff1a;https://github.c…

class类和style内联样式的绑定

这里的绑定其实就是v-bind的绑定&#xff0c;如代码所示&#xff0c;div后面的引号就是v-bind绑定&#xff0c;然后大括号将整个对象括起来&#xff0c;对象内先是属性&#xff0c;属性后接的是变量&#xff0c;这个变量是定义在script中的&#xff0c;后通过这个变量&#xff…

《昇思25天学习打卡营第10天|使用静态图加速》

文章目录 今日所学&#xff1a;一、背景介绍1. 动态图模式2. 静态图模式 三、静态图模式的使用场景四、静态图模式开启方式1. 基于装饰器的开启方式2. 基于context的开启方式 总结&#xff1a; 今日所学&#xff1a; 在上一集中&#xff0c;我学习了保存与加载的方法&#xff…

【网络安全】修改Host文件实现域名解析

场景 开发一个网站或者服务&#xff0c;需要在本地测试时&#xff0c;可以将线上的域名指向本地开发环境的IP地址。从而模拟真实环境中的域名访问&#xff0c;方便调试和开发。 步骤 1、以管理员身份打开命令提示符 2、编辑hosts文件&#xff1a; 输入以下命令打开hosts文…

六西格玛绿带培训如何告别“走过场”?落地生根

近年来&#xff0c;六西格玛绿带培训已经成为了众多企业提升管理水平和员工技能的重要途径。然而&#xff0c;不少企业在实施六西格玛绿带培训时&#xff0c;往往陷入形式主义的泥潭&#xff0c;导致培训效果大打折扣。那么&#xff0c;如何避免六西格玛绿带培训变成“走过场”…

联合概率密度函数

目录 1. 什么是概率密度由联合概率密度求概率参考链接 1. 什么是概率密度 概率密度到底在表达什么&#xff1f; 外卖在20-40分钟内送达的概率 随机变量落在[20,40]之间的概率。下图中&#xff0c;对总面积做规范化处理&#xff0c;令总面积1&#xff0c; f ( x ) f(x) f(x)则成…

交互未来入选“北京市通用人工智能产业创新伙伴计划”模型伙伴

在“开启数智新时代&#xff0c;共享数字新未来”的宏大主题下&#xff0c;2024全球数字经济大会于近日盛大开幕&#xff0c;汇聚全球智慧&#xff0c;共谋数字经济新篇章。大会首日&#xff0c;备受瞩目的人工智能专题论坛率先拉开帷幕&#xff0c;以“应用即未来——大模型赋…

基于MCU平台的HMI开发的性能优化与实战(下)

继上篇《基于MCU平台的HMI开发的性能优化与实战&#xff08;上&#xff09;》深入探讨了提升MCU平台HMI开发效率和应用性能的策略后&#xff0c;本文将专注于NXP i.MX RT1170 MCU平台的仪表盘开发实践。我们将重点介绍Qt for MCUs的优化技巧&#xff0c;展示如何通过实际案例应…

【SpringBoot】SpringBoot使用mail实现登录邮箱验证

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 一、前期准备 1 开启邮箱服务 2 SpringBoot导入依赖 3 创建application.yml配置文件 4 创建数据库文件 5 配置redis服务 二、验证邮件发送功能 三、注册功能实现邮箱验证 1 创建User实体类 2 创建UserPa…

昆虫学(书籍学习资料)

包括昆虫分类&#xff08;上下册&#xff09;、昆虫生态大图鉴等书籍资料。

APKDeepLens:一款针对Android应用程序的安全扫描工具

关于APKDeepLens APKDeepLens是一款针对Android应用程序的安全扫描工具&#xff0c;该工具基于Python开发&#xff0c;旨在扫描和识别Android应用程序&#xff08;APK文件&#xff09;中的安全漏洞。 APKDeepLens主要针对的是OWASP Top 10移动端安全漏洞&#xff0c;并为开发人…

[Microsoft Office]Word设置页码从第二页开始为1

目录 第一步&#xff1a;设置页码格式 第二步&#xff1a;设置“起始页码”为0 第三步&#xff1a;双击页码&#xff0c;出现“页脚”提示 第四步&#xff1a;选中“首页不同” 第一步&#xff1a;设置页码格式 第二步&#xff1a;设置“起始页码”为0 第三步&#xff1a;双…

与Flat Ads相约ChinaJoy 2024,共探全球化增长

在当今全球数字化浪潮的推动下,游戏产业作为文化与技术融合的先锋,正以前所未有的速度跨越国界,开启全球化发展的新篇章。随着第二十一届ChinaJoy的临近,全球的目光再次聚焦于上海新国际博览中心,这里即将成为数字娱乐与科技创新碰撞与交融的璀璨舞台。 而在这场盛会上,Flat A…

四川赤橙宏海商务信息咨询有限公司引领抖音电商浪潮

在数字时代的浪潮下&#xff0c;电商行业飞速发展&#xff0c;抖音电商作为新兴的电商模式&#xff0c;凭借其独特的社交属性和短视频形式&#xff0c;迅速吸引了众多消费者和商家的目光。四川赤橙宏海商务信息咨询有限公司&#xff0c;作为抖音电商服务的佼佼者&#xff0c;凭…