类和对象中阶1⃣️-默认成员函数(构造函数 析构函数)

目录

1.类的6个默认成员函数

2.构造函数

2.1 概念

3.析构函数

3.1 概念

3.2 特性


1.类的6个默认成员函数

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

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

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

class Date{};

2.构造函数

2.1 概念

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

其特征如下:

  1. 函数名与类名相同。
  2. 无返回值
  3. 对象实例化时编译器自动调用对应的构造函数。
  4. 构造函数可以重载
class Date{
public:
//1.无参构造函数
Date(){_year = 0;_month = 0;_day = 0;
}//2.带参构造函数
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;
};void TestDate(){Date d1;//调用无参构造Date d2(2024,2,9);//调用带参构造函数d1.Print();d2.Print();
}//注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明
//也就是这种方式是错误的 Date d3();int main(int argc, const char * argv[]) {TestDate();return0;
}
  1. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义,编译器将不再生成。
  2. 默认构造函数不会对内置类型做任何改变,但是对于自定义类型来说,会调用自定义类型的构造函数。但是在,C++11 中针对内置类型成员不初始化的缺陷,内置类型成员变量在类中声明时可以给默认值

ps:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类型,如:int /char...,自定义类型就是我们使用class/struct/union等自己定义的类型。

class A
{
public:A()
{_a = 0;
}private:
int _a;
};class Time{public:Time(int hour){cout<<"Time()"<<endl;_hour = hour;_minute = 0;_second = 0;
}private:
int _hour;
int _minute;
int _second;
A aa;//自定义类型aa;调用Time()时,会自动调用A()构造函数
//自定义类型调用默认构造函数
};int main(int argc, const char * argv[]) {Time d3(3);return0;
}

  1. 无参的构造函数全缺省的构造函数都被称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。
class Time{
public:Time(){//无任何参数的也称为默认构造函数_hour = 0;_minute = 0;_second = 0;}//有参但不是缺省参数的构造函数重载Time(int hour){cout<<"Time()"<<endl;_hour = hour;_minute = 0;_second = 0;}private:int _hour = 9;int _minute = 8;int _second = 7;//内置类型成员变量在类中声明时可以给默认值};int main(int argc, const char * argv[]) {Time d1;//不写参数时调用无参构造,不给参数时不用写括号,否则编译器将无法辨认是函数声明是实例化Time d2(9);//有参构造函数调用return 0;
}输出结果:
无参构造函数调用
有参构造函数调用
0 0 0
9 0 0
class Date
{
private:
//内置类型没有规定要处理(可处理,可不处理,看编译器)int _day;int _month;int _year;
public:Date(){//无任何参数的也称为默认构造函数cout << "无参构造函数调用" << endl;}//全缺省默认构造函数Date(int year = 2024, int month = 3, int day = 20){_year = year;_month = month;_day = day;}void print(){cout << _year << "-" << _month << "-" << _day << endl;}
};int main(int argc, const char * argv[]) {Date d;//不写参数时调用无参构造以及编译器自动生成的构造d.print();return 0;
}
报错:Call to constructor of 'Date' is ambiguous
编译器不知道调用哪一个

实践中总结:

  1. 一般情况构造函数都需要我们自己显示的去实现
  2. 只有少数情况下可以让编译器自动生成构造函数,类似MyQueue,成员全是自定义类型

3.析构函数

3.1 概念

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

3.2 特性

析构函数是特殊的成员函数,其特征如下:

  1. 析构函数名是在类名前加上字符~。
  2. 无参数无返回值类型。
  3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载。
  4. 对象生命周期结束时,C++编译系统自动调用析构函数
typedef int DataType;class Stack{
private:DataType* _array;int _capacity;int _size;public:Stack(size_t capacity = 3){//全缺省构造函数_array = (DataType*)malloc(sizeof(DataType)*capacity);if(_array == nullptr){perror("malloc fail");}_capacity = capacity;_size = 0;}void Push(DataType x){_array[_size++] = x;}//...其他方法~Stack(){		//析构函数,结束时自动调用if(_array){free(_array);_array = nullptr;_capacity = 0;_size = 0;}}};void TestStack(){Stack s;s.Push(1);s.Push(2);
}int main(int argc, const char * argv[]) {TestStack();return 0;
}

5. 对于编译器生成的默认析构函数,不处理内置类型,对自定义类型成员调用它的析构函数,与构造函数自定义类型调用默认构造函数相同

class Time
{
private:int _time;
public:Time()//无参构造函数{_time = 0;}~Time()//析构函数{}
};class Date
{
private:int _day;int _month;int _year;Time _t; //自定义类型
public:Date(int day = 20, int month = 3, int year = 2024)//全缺省构造函数{_day = day;_month = month;_year = year;}};int main()
{Date d;return 0;
}

6. 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数;有资源申请时,一定要写,否则会造成内存泄漏

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

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

相关文章

Linux安装Oracle11g(无图形界面下的静默安装)

Oracle11g安装文档-Linux静默安装 环境准备安装数据库配置监听器创建数据库测试打开防火墙 环境准备 创建组和用户 [rootlocalhost ~]# groupadd oinstall #创建oinstall组 [rootlocalhost ~]# groupadd dba  #创建dba组 [rootlocalhost ~]# useradd -g oinstall -G dba -m…

Linux云计算之Linux基础3——Linux系统基础2

1、终端 终端(terminal)&#xff1a;人和系统交互的必要设备&#xff0c;人机交互最后一个界面&#xff08;包含独立的输入输出设备&#xff09; 物理终端(console)&#xff1a;直接接入本机器的键盘设备和显示器虚拟终端(tty)&#xff1a;通过软件方式虚拟实现的终端。它可以…

websocket实践

文章目录 背景WebSocket API使用场景优点 实例步骤 1: 设置 WebSocket 服务器步骤 2: 创建客户端 HTML 页面步骤 3: 测试 WebSocket 通信注意事项实际操作 参考资料 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它使得浏览器和服务器只需建立一个连接&#xff0c;…

金三银四面试题(十九):MySQL中的锁

在MySQL中&#xff0c;锁是非常重要的&#xff0c;特别是在多用户并发访问数据库的环境中&#xff0c;因此也是面试中常问的话题。 请说说数据库的锁&#xff1f; 关于MySQL 的锁机制&#xff0c;可能会问很多问题&#xff0c;不过这也得看面试官在这方面的知识储备。 MySQL …

07 Php学习:运算符

PHP 算术运算符 在 PHP 中&#xff0c;算术运算符用于执行基本的数学运算&#xff0c;包括加法、减法、乘法、除法、取余数&#xff0c;负数运算、取反和并置运算。以下是这些运算符的详细解释和示例&#xff1a; 加法运算符 &#xff1a;用于将两个数值相加。 $a 5; $b 3;…

论文阅读——Sat2Vid

Sat2Vid: Street-view Panoramic Video Synthesis from a Single Satellite Image 提出了一种新颖的方法&#xff0c;用于从单个卫星图像和摄像机轨迹合成时间和几何一致的街景全景视频。 即根据单个卫星图像和给定的观看位置尽可能真实地、尽可能一致地合成街景全景视频序列。…

【汇编语言实战】统计个数(创新版)

内存中有10个分布在0至100内的正整数&#xff0c; 求小于60的数的个数num1&#xff0c;大于或等于60且小于80的数的个数num2&#xff0c;大于或等于80且小于100的数的个数num3 C语言描述该程序流程&#xff1a; #include <stdio.h> int main() {int a[]{1, 20, 95, 32,…

RecyclerView的复用与回收

目录 0.前言&#xff1a;推荐初学者阅读RecyclerView机制 1.复用与回收的关系 1.1复用流程 1.2回收流程 1.3复用与回收的先后关系 2.刷新机制 0.前言&#xff1a;推荐初学者阅读RecyclerView机制 http://t.csdnimg.cn/2hUeU 1.复用与回收的关系 滚动屏幕——“先复用&…

东方博宜 1738. 胜负对决

东方博宜 1738. 胜负对决 以为这道题很简单呢&#xff0c;结果提交两次还不对&#xff0c;气死个人~ 思路&#xff1a;这道题的重点在于看清楚题意&#xff0c;是第奇数个&#xff0c;而不是数是奇数 。 还有&#xff0c;如果按照位数的奇偶来判定&#xff0c;那在读取数组的时…

台灯哪个牌子好,五大护眼灯品牌排行分享

​当前&#xff0c;我国青少年的近视率已超过半数&#xff0c;位居全球之首&#xff0c;且近视发生年龄呈现下降趋势。长时间用眼和过度使用电子产品是导致近视高发的主要因素。面对这一挑战&#xff0c;如何改善现状成为了一个亟待解决的问题。对于儿童而言&#xff0c;降低近…

浅谈在线监测系统在水厂水质管理工程中的应用与研究

【摘要】&#xff1a;随着水厂水质管理技术和管理水平的提升&#xff0c;达到了在线监测系统通过监测数据的反馈&#xff0c;及时发现问题&#xff0c;快速处理事故&#xff0c;优化了水资源的利用率&#xff0c;提高了供水系统的稳定性和安全性&#xff0c;从而有效地提高供水…

2.网络编程-HTTP和HTTPS

目录 HTTP介绍 HTTP协议主要组成部分 GET 和 POST有什么区别 常见的 HTTP 状态码有哪些 http状态码100 HTTP1.1 和 HTTP1.0 的区别有哪些 HTTPS 和 HTTP 的区别是什么 HTTP2 和 HTTP1.1 的区别是什么 HTTP3 和 HTTP2 的区别是什么 HTTPS的请求过程 对称加密和非对称…

初识--数据结构

什么是数据结构&#xff1f;我们为什么要学习数据结构呢....一系列的问题就促使我们不得不了解数据结构。我们不禁要问了&#xff0c;学习C语言不就够了吗&#xff1f;为什么还要学习数据结构呢&#xff1f;这是因为&#xff1a;数据结构能够解决C语言解决不了的问题&#xff0…

【NLP】隐马尔可夫模型(HMM)与条件随机场(CRF)简介

一. HMM 隐马尔可夫模型&#xff08;Hidden Markov Model, HMM&#xff09;是一种用于处理含有隐藏状态的序列数据的统计学习模型。通过建模隐藏状态之间的转移关系以及隐藏状态与观测数据的生成关系&#xff0c;HMM能够在仅观察到部分信息的情况下进行状态推理、概率计算、序…

一分钟了解机器人自由度

目录 自由度的定义 自由度的分类 自由度的影响 影响自由度的主要参数 关节类型和数量 机械结构 控制系统 自由度控制的硬件架构原理 传感器 执行器 控制器 通信接口 软件和算法 机器人的自由度是指机器人在空间中可以独立移动的方向和角度的数量&#xff0c;它是衡…

面向对象设计原则实验“依赖倒置原则”

高层模块不应该依赖于低层模块。二者都应该依赖于抽象。抽象不应该依赖于细节。细节应该依赖于抽象。 &#xff08;开闭原则、里氏代换原则和依赖倒转原则的三个实例很相似&#xff0c;原因是它之间的关系很紧密&#xff0c;在实现很多重构时通常需要同时使用这三个原则。开闭…

【C++】模版

目录 一、泛型编程二、函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则 三、类模板3.1 类模板的定义格式3.2 类模板的实例化 四、非类型模板参数五、模板的特化5.1 概念5.2 函数模板特化5.3 类模板特化5.3.1 全特化5.3…

天书奇谈_源码_搭建架设_3D最新天启版_自带假人

本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 一. 效果演示 天书奇谈_源码_搭建架设 环境&#xff1a; centos7.6 &#xff0c; 放开所有端口 源码获取 https://…

泰山众筹:电商新模式解析与优势探讨

一、泰山众筹模式概述 泰山众筹&#xff0c;是一种创新的电商模式&#xff0c;其核心在于通过产品销售与积分众筹的结合&#xff0c;实现用户与平台的共赢。用户购买产品获得积分&#xff0c;随后可将积分投入众筹活动&#xff0c;成功出局者可获得奖励并提现。 二、泰山众筹的…

智能运维场景 | 科技风险预警,能实现到什么程度?

[ 原作者&#xff1a;擎创夏洛克&#xff0c;本文略做了节选和改编 ] 每次一说到“风险预警”&#xff0c;就会有客户问我们能做怎样的风险预警。实际上在智能运维厂商来说&#xff0c;此风险非彼风险&#xff0c;不是能做银行的业务上的风险预警&#xff08;比如贷款风险等&a…