【C++成长记】C++入门 | 类和对象(中) |类的6个默认成员函数、构造函数、析构函数-程序员宅基地

技术标签: C++  c++  开发语言  

博主主页:​倔强的大蜗牛

专栏分类:C++
️感谢大家点赞收藏评论️

目录

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

 二、构造函数  

 1、概念

2、特性  

三、析构函数 

1、概念

2、特性  


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

如果一个类中什么成员都没有,简称为空类。
空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员
函数。
默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
class Date {};


 二、构造函数  

 1、概念

构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证
每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次

2、特性  

构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任
并不是开空间创建对象,而是初始化对象

特征:

  • 函数名与类名相同。
  • 无返回值。
  • 对象实例化时编译器自动调用对应的构造函数。
  • 构造函数可以重载。
 class Date
 {
  public:
      // 1.无参构造函数
      Date()
     {}
  
      // 2.带参构造函数
      Date(int year, int month, int day)
     {
          _year = year;
          _month = month;
          _day = day;
     }
  private:
      int _year;
      int _month;
      int _day;
 };
  
  void TestDate()
 {
      Date d1; // 调用无参构造函数
      Date d2(2015, 1, 1); // 调用带参的构造函数
  
      // 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明
      // 以下代码的函数:声明了d3函数,该函数无参,返回一个日期类型的对象
      // warning C4930: “Date d3(void)”: 未调用原型函数(是否是有意用变量定义的?)
      Date d3();
 }
  • 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦
    用户显式定义编译器将不再生成。
 class Date
 {
  public:
 /*
 // 如果用户显式定义了构造函数,编译器将不再生成
 Date(int year, int month, int day)
 {
 _year = year;
 _month = month;
 _day = day;
 }
 */
 
 void Print()
 {
 cout << _year << "-" << _month << "-" << _day << endl;
 }
  
  private:
 int _year;
 int _month;
 int _day;
 };
  
  int main()
 {
 // 将Date类中构造函数屏蔽后,代码可以通过编译,因为编译器生成了一个无参的默认构造函
数
 // 将Date类中构造函数放开,代码编译失败,因为一旦显式定义任何构造函数,编译器将不再
生成
      // 无参构造函数,放开后报错:error C2512: “Date”: 没有合适的默认构造函数可用
 Date d1;
 return 0;
 }
  • C++把类型分成内置类型(基本类型)和自定义类型。
内置类型:int、float、char 等
自定义类型:class、struct、union等
class Time
{
public:
 Time()
 {
 cout << "Time()" << endl;
 _hour = 0;
 _minute = 0;
 _second = 0;
 }
private:
 int _hour;
 int _minute;
 int _second;
};
class Date
{
private:
 // 基本类型(内置类型)
 int _year;
 int _month;
 int _day;
 // 自定义类型
 Time _t;
};
int main()
{
 Date d;
 return 0;
}
注意:C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在
类中声明时可以给默认值
class Time
{
public:
 Time()
 {
 cout << "Time()" << endl;
 _hour = 0;
 _minute = 0;
_second = 0;
 }
private:
 int _hour;
 int _minute;
 int _second;
};
class Date
{
private:
 // 基本类型(内置类型)
 int _year = 1970;
 int _month = 1;
 int _day = 1;
 // 自定义类型
 Time _t;
};
int main()
{
 Date d;
 return 0;
}
  • 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。
注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为
是默认构造函数。 

三、析构函数 

1、概念

析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由
编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作

2、特性  

析构函数是特殊的成员函数,其特征如下:
  • 析构函数名是在类名前加上字符 ~
  • 无参数无返回值类型
  •  一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构 函数不能重载
  • 对象生命周期结束时,C++编译系统系统自动调用析构函数
  • 编译器生成的默认析构函数,对自定类型成员调用它的析构函数
  • 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如 Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类

结语: 

本次精彩内容已圆满结束!希望各位读者在阅读过程中能够收获满满。在此,特别感谢各位读者的支持与三连赞。如果文章中存在任何问题或不足之处,欢迎在评论区留言,蜗牛必定会认真对待并加以改进,以便为大家呈现更优质的文章。你们的支持与鼓励,将是博主不断前进的最大动力。再次感谢大家的陪伴与支持!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_73736495/article/details/137753802

智能推荐

【JAVA长虹键法】第三式 简单工厂模式(23种设计模式)_长虹java面试-程序员宅基地

文章浏览阅读1k次,点赞25次,收藏30次。【JAVA长虹键法】主要讲了23种设计模式,本系列专栏会以虹猫蓝兔七侠传的故事为例来给大家详细分析所有模式,希望能给大家带来帮助!简单工厂模式一个天外陨石(抽象产品),三把剑(产品),一个铸剑师(工厂)。虹猫蓝兔莎莉分别找铸剑师造了三把剑。定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。1、按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。

jquery.base64.js-程序员宅基地

文章浏览阅读1.5k次。(function($) { $.base64 = function(options) { var defaults = { data:"", type:0, unicode:true }; var opts = $.extend(defaults,op..._jquery.base64.js

源码编译libyuv_libyuv源码-程序员宅基地

文章浏览阅读432次,点赞4次,收藏9次。libyuv 是常用的处理YUV数据的库,例如将YUV进行缩放。_libyuv源码

vue 水印组件_vue 水印插件-程序员宅基地

文章浏览阅读2.2k次,点赞4次,收藏5次。vue2 水印效果,使用MutationObserver监听元素结构,支持水印防篡改。_vue 水印插件

什么是分布式系统,这么讲不信你不会-程序员宅基地

文章浏览阅读336次。戳蓝字“CSDN云计算”关注我们哦!我曾在网络上搜索过”如何学习分布式系统“,也在知乎上关注了该话题,但并没有看到一个全面的、有指导意义的答案。本文的目标是给打算全面学习分布式系统的自己..._分布式系统的基本概念和原理

D3D网格(二)-程序员宅基地

文章浏览阅读1.7k次。从网格XFile文件中导入网格数据,并渲染出来;实际中一般自定义自己的二进制格式文件,实现导出模块,和加载模板,包括了模型和动画。计算网格中的顶点法向量。ID3DXPMesh渐进式网格的创建和使用。用网格顶点创建网格包围体,AABB或球体;实际中很多是在3ds max中创建好包围盒导出,并跟随物体网格一起移动。1.从XFile文件中导入ID3DXMesh网格函数为D3D

随便推点

Android BLE设备蓝牙通信框架BluetoothKit-程序员宅基地

文章浏览阅读814次,点赞19次,收藏13次。一、统一解决Android蓝牙通信过程中的兼容性问题二、提供尽可能简单易用的接口,屏蔽蓝牙通信中的技术细节,只开放连接,读写,通知等语义。三、实现串行化任务队列,统一处理蓝牙通信中的失败以及超时,支持可配置的容错处理四、统一管理连接句柄,避免句柄泄露五、方便监控各设备连接状态,比如手机可同时连接的设备数有限,可以检测设备连接活跃度,在尽可能维持连接的情况下,将最不活跃的设备自动断开。六、支持多进程APP架构下蓝牙连接的管理七、支持拦截所有对蓝牙原生接口的调用。

flutter学习(一)——安装flutter并配置环境_安装flutter环境visual studio需要下载什么依赖-程序员宅基地

文章浏览阅读7.4k次。文章目录一、下载flutter安装包二、flutter doctor三、配置编辑器一、下载flutter安装包中文文档:https://flutter.cn/docs/get-started/install/windowslink下载安装包解压到指定目录,我解压的目录是D盘下的software把flutter中的bin目录添加至环境变量在左下角搜索env,打开系统环境变量设置(如果修改环境变量之前打开了cmd,就重新打开另一个cmd打开验证)在cmd中验证flutter是否安装完成_安装flutter环境visual studio需要下载什么依赖

干货丨如何优雅地设计并控制一台协作机械臂-程序员宅基地

文章浏览阅读4.2k次,点赞7次,收藏63次。“本期技术干货,我们邀请到了小米机器人实验室工程师任赜宇,和大家分享如何去设计并控制一台协作机械臂。”一、前言协作机械臂,顾名思义,是适合与人类通力协作去解决实际问题的一类机械臂,作为机械臂家族的一员,与传统的工业机械臂相对应。工业机械臂经过多年的发展,在汽车、3C电子等工业自动化领域已经得到了广泛的落地与应用,而协作机械臂作为近几年来的新兴产物,在智能性、安全性与易用性..._机械臂感知 整体框架

mysql pager用不了_mysql pager 妙用!-程序员宅基地

文章浏览阅读72次。分页显示。mysql> pager lessPAGER set to 'less'mysql> show engine innodb status\G[...]退出pagermysql> pagerDefault pager wasn't set, using stdout.ormysql> \nPAGER set to stdout一些其他的用法mysql> pag..._pager has been disabled.

CS5265 USB-C to HDMI 4k@60Hz单转方案-程序员宅基地

文章浏览阅读212次。HDMI接口包括4个最小化传输差分信号时钟/数据对、DDC和HPD信号,支持高达6Gpbs的数据速率,足以处理FHD 1080p 120Hz和UHD 4k 60Hz视频分辨率。此外,它还包含支持HDCP1.4和HDCP2.3得HDCP引擎,嵌入式密钥提供最高级别的HDCP密钥安全性,确保安全传输受保护的内容。TypeC转HDMI音视频IC,TYPEC转HDMI带PD快充,TYPEC扩展坞方案,TYPEC转HDMI方案,TYPEC转HDMI2.0转换器。每个通道的更大数据速率高达6-Gps。

如何找微博大v做推广 CloudKOL为您揭露微博大v推广流程-程序员宅基地

文章浏览阅读387次,点赞4次,收藏7次。微博大V推广是品牌宣传的重要方式之一,但要找到合适的大V资源并进行推广,需要一定的技巧和方法。CloudKOL作为专业的大V推广平台,为您提供便捷、高效的推广服务,助您实现品牌推广的成功。垂询邮箱:[email protected] 网址:https://www.cloudkol.com。

推荐文章

热门文章

相关标签