C++——类和对象(2)

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

当一个类中什么都没有,编译器会帮类自动生成6个默认成员函数例如:

class Date
{};

此篇文章主要围绕构造函数与析构函数进行讲解。


2. 构造函数

2.1 概念

#define  _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;class Date
{
private:int _year;int _month;int _day;
public:void Init(int year = 1,int month = 1 ,int day = 1){this->_year = year;this->_month = month;this->_day = day;cout << "今天是" << _year << "/" << _month << "/" << _day << endl;}
};int main()
{Date d1;d1.Init(2024, 3, 15);return 0;
}
  •  对于以上的Date类,每次实例化对象之后都要对对象调用Init()函数,比较繁琐,其实编译器就可以帮我们完成。
  • 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。

2.2 特性

构造函数是特殊的成员函数,其定义语法上有以下几点:

  1. 构造函数函数名与类名相同;
  2. 无返回值;
  3. 构成重载;
  4. 对象实例化时编译器自动调用构造函数。
class Date
{
private:int _year;int _month;int _day;
public://带参构造函数Date(int year, int month = 1, int day = 1){this->_year = year;this->_month = month;this->_day = day;cout << "今天是" << _year << "/" << _month << "/" << _day << endl;}//无参构造函数Date(){this->_year = 1;this->_month = 1;this->_day = 1;cout << "今天是" << _year << "/" << _month << "/" << _day << endl;}
};int main()
{Date d1;Date d2(2024, 3, 15);return 0;
}
  • 如果你在类中没有给出构造函数,那么编译器将会自动给出构造函数,如果给了构造函数,编译器就不会生成:
class Date
{
private:int _year;int _month;int _day;
public:带参构造函数//Date(int year, int month = 1, int day = 1)//{//	this->_year = year;//	this->_month = month;//	this->_day = day;//	cout << "今天是" << _year << "/" << _month << "/" << _day << endl;//}无参构造函数//Date()//{//	this->_year = 1;//	this->_month = 1;//	this->_day = 1;//}void Print(){cout << "今天是" << _year << "/" << _month << "/" << _day << endl;}
};int main()
{Date d1;d1.Print();//Date d2(2024, 3, 15);return 0;
}

  •  以下这种情况就是你写了一份构造函数,但是没有匹配的,编译器也不会帮你生成。
class Date
{
private:int _year;int _month;int _day;
public://带参构造函数Date(int year, int month = 1, int day = 1){this->_year = year;this->_month = month;this->_day = day;cout << "今天是" << _year << "/" << _month << "/" << _day << endl;}//无参构造函数/*Date(){this->_year = 1;this->_month = 1;this->_day = 1;}*//*void Print(){cout << "今天是" << _year << "/" << _month << "/" << _day << endl;}*/
};int main()
{Date d1;//d1.Print();Date d2();return 0;
}

  • 如果你没有构造函数,编译器会帮你调用构造函数,在它本身的构造函数中,如果是内置类型,例如(int ,double, char,指针类型等),则编译器不会帮你初始化,如果不是内置类型,例如(struct,class定义自定义类型等),编译器会帮你调用它的构造函数,例如以下是两个栈实现队列的简单定义:
struct Stack
{int* _a;int _top;int _capacity;// 栈的构造函数Stack(){_a = nullptr;_capacity = 0;_top = 0;cout << "This is Stack struct" << endl;}void CheckCapacity(){if (_top == _capacity){int newcapacity = _capacity == 0 ? 4 : _capacity * 2;int* tmp = (int*)realloc(_a, sizeof(int) * newcapacity);if (tmp == nullptr){perror("realloc error!");exit(-1);}_a = tmp;_capacity = newcapacity;}}void Push(int x){CheckCapacity();_a[_top++] = x;}void Pop(){assert(_top > 0);_top--;}int Top(){return _a[_top - 1];}bool Empty(){return _top == 0;}void Print(){while (!Empty()){cout << _a[_top - 1] << endl;Pop();}}
};struct Queue
{//此处没有Queue的构造函数Stack st1;Stack st2;
};int main()
{Queue q;return 0;
}

 

  • C++11规定可以在类中的声明中给缺省值,例如:
class Date
{
public:void Print(){cout << _year << "/" << _month << "/" << _day << endl;}
private:int _year = 1;int _month = 1;int _day = 1;
};int main()
{Date d1;d1.Print();return 0;
}

  •  总的来说你可以根据是否需要构造函数来决定是否需要编写构造函数;
  • 通常情况下都是需要你自己编写构造函数的;
  • 特别注意在构造函数的时候虽然构成函数重载,但是切忌全缺省参数和无参数的构造同时出现,不然会发生编译错误。

2.3 构造函数总结

  1. 构造函数函数名与类名相同;
  2. 无返回值;
  3. 构成重载;
  4. 在对象实例化的时候自动调用构造函数;
  5. 如果自己没有编写构造函数那么编译器会帮你自动生成构造函数;
  6. 对于编译器生成的构造函数中,内置类型不会进行初始化,自定义类型会帮你自动调用他的构造函数;
  7. 如果自己编写了构造函数,那么编译器会根据函数名修饰调用属于他的构造函数;
  8. 无参的构造函数、全缺省构造参数、编译器自己生成的构造函数统称为默认构造函数;
  9. 通常情况下是需要构造函数的。

3. 析构函数

3.1 概念

  •         析构函数与构造函数相反,对象是通过构造函数来的,相反对象就是通过析构函数没的。
  •         但是对象的销毁不是析构本身完成的,这是编译器的任务,但是在销毁的同时会自动调用析构函数。

3.2 特性

  • 函数名是在类名之前加上~;
  • 无返回值无参数;
  • 若未显示定义,则系统会生成默认的析构函数,一个类只能由一个析构函数,不构成重载;
  • 对象生命周期结束,C++编译器会自动调用析构函数。
class Date
{
public:Date(int year,int month,int day){this->_day = day;this->_month = month;this->_year = year;}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}~Date(){cout << this << endl;cout << "~Date" << endl;}private:int _year = 1;int _month = 1;int _day = 1;
};void func()
{Date d1(2024,3,15);
}int main()
{func();return 0;
}

  •  默认生成的析构函数跟构造函数类似
  • 内置类型不做处理,自定义类型的成员去调用他的析构
struct Stack
{int* _a;int _top;int _capacity;Stack(){_a = nullptr;_capacity = 0;_top = 0;cout << "This is Stack struct" << endl;}void CheckCapacity(){if (_top == _capacity){int newcapacity = _capacity == 0 ? 4 : _capacity * 2;int* tmp = (int*)realloc(_a, sizeof(int) * newcapacity);if (tmp == nullptr){perror("realloc error!");exit(-1);}_a = tmp;_capacity = newcapacity;}}void Push(int x){CheckCapacity();_a[_top++] = x;}void Pop(){assert(_top > 0);_top--;}int Top(){return _a[_top - 1];}bool Empty(){return _top == 0;}void Print(){while (!Empty()){cout << _a[_top - 1] << endl;Pop();}}~Stack(){if (this->_a != nullptr){free(this->_a);this->_a = nullptr;}this->_capacity = this->_top = 0;cout << "this is Stack Destroy" << endl;}
};struct Queue
{Stack st1;Stack st2;
};int main()
{Queue q;return 0;
}

 

在构造的时候是先构造st1,在构造st2,析构的时候是先析构st2,在析构st1,注意顺寻,栈要符合 LIFO。

3.3 析构函数总结

  • 函数名是在类名之前加上~;
  • 无返回值无参数;
  • 若未显示定义,则系统会生成默认的析构函数,一个类只能由一个析构函数,不构成重载;
  • 对象生命周期结束,C++编译器会自动调用析构函数;
  •  默认生成的析构函数跟构造函数类似;
  • 内置类型不做处理,自定义类型的成员去调用他的析构。

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

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

相关文章

04- 基于SpringAMQP封装RabbitMQ,消息队列的Work模型和发布订阅模型

SpringAMQP 概述 使用RabbitMQ原生API在代码中设置连接MQ的参数比较繁琐,我们更希望把连接参数写在yml文件中来简化开发 SpringAMQP是基于AMQP协议定义的一套API规范,将RabbitMQ封装成一套模板用来发送和接收消息 AMQP(Advanced Message Queuing Portocol)是用于在应用程序…

R语言tidycmprsk包分析竞争风险模型

竞争风险模型就是指在临床事件中出现和它竞争的结局事件&#xff0c;这是事件会导致原有结局的改变&#xff0c;因此叫做竞争风险模型。比如我们想观察患者肿瘤的复发情况&#xff0c;但是患者在观察期突然车祸死亡&#xff0c;或者因其他疾病死亡&#xff0c;这样我们就观察不…

操作系统总结(第二周 第一堂)

前言&#xff1a; 第一周的重点就在于一张图表&#xff1a; 基于这张图&#xff0c;我们将陷入内核分为了两个大块Trap和Interrupt。同时我们知道一件事情任何一次I/O操作或者错误程序操作都将陷入内核&#xff0c;从而使得内核可以监控所有的外部设备以及维护整个电脑程序运行…

【python绘图】turle 绘图基本案例

文章目录 0. 基础知识1. 蟒蛇绘制2. 正方形绘制3. 六边形绘制4. 叠边形绘制5. 风轮绘制 0. 基础知识 资料来自中国mooc北京理工大学python课程 1. 蟒蛇绘制 import turtle turtle.setup(650, 350, 200, 200) turtle.penup() turtle.fd(-250) turtle.pendown() turtle.pen…

uniapp开发的跳转到小程序

uniapp开发的h5跳转到小程序 https://www.cnblogs.com/xiaojianwei/p/16352698.html官方&#xff1a;使用 URL Scheme 打开小程序 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/url-scheme.html 链接代码 <a href"weixin://dl/business/…

Windows系统搭建Cloudreve结合内网穿透打造可公网访问的私有云盘

目录 ⛳️推荐 1、前言 2、本地网站搭建 2.1 环境使用 2.2 支持组件选择 2.3 网页安装 2.4 测试和使用 2.5 问题解决 3、本地网页发布 3.1 cpolar云端设置 3.2 cpolar本地设置 4、公网访问测试 5、结语 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff…

网站首页添加JS弹屏公告窗口教程

很多小白站长会遇到想给自己的网站添加一个弹屏公告&#xff0c;用于做活动说明、演示站提示等作用与目的。 下面直接上代码&#xff1a;&#xff08;直接复制到网页头部、底部php、HTML文件中&#xff09; <script src"https://www.mohuda.com/site/js/sweetalert.m…

Css基础——精灵图(sprites)和字体图标

1、精灵图 1.1、精灵图的由来 一个网页中往往会应用很多小的背景图像作为修饰&#xff0c;当网页中的图像过多时&#xff0c;服务器就会频繁地接收和发送 请求图片&#xff0c;造成服务器请求压力过大&#xff0c;这将大大降低页面的加载速度。 因此&#xff0c;为了有效地减…

37. 解数独

代码实现&#xff1a; bool isValid(char **board, int row, int col, char c) {for (int i 0; i < 9; i) { // 行if (board[row][i] c) {return false;}if (board[i][col] c) { // 列return false;}}int startRow (row / 3) * 3;int startCol (col / 3) * 3;for (int …

【数据分析】数据分析介绍

专栏文章索引&#xff1a;【数据分析】专栏文章索引 目录 一、介绍 二、生活中的数据分析 1.无处不在的数据 2.为什么要进行数据分析&#xff1f; 三、数据挖掘案例 1.案例分析 一、介绍 数据采集&#xff1a;数据采集是指从不同来源收集原始数据的过程&#xff0c;包括…

Linux:kubernetes(k8s)Deployment的操作(13)

创建deployment 命令 kubectl create deploy nginx-deploy --imagenginx:1.7.9 再去使用以下命令分别查询 ubectl get deploy kubectl get replicaset kubectl get pod 他是一个层层嵌套的一个关系 首先是创建了一个 deploy 里面包含着replicaset replicaset里面含有…

计算机视觉——目标检测(R-CNN、Fast R-CNN、Faster R-CNN )

前言、相关知识 1.闭集和开集 开集&#xff1a;识别训练集不存在的样本类别。闭集&#xff1a;识别训练集已知的样本类别。 2.多模态信息融合 文本和图像&#xff0c;文本的语义信息映射成词向量&#xff0c;形成词典&#xff0c;嵌入到n维空间。 图片内容信息提取特征&…

C++四种类型转换

本章草稿代码Gitee仓库&#xff1a;type_cast 文章目录 0.前言1. static_cast2. reinterpret_cast3. const_cast4. dynamic_cast 0.前言 C语言的类型转换有2种&#xff1a; 隐式类型转换显式类型转换 这里的类型转换并不是很规范&#xff0c;有时候会有潜在风险&#xff0c;…

VMware安装Ubuntu 18.04.2

下载Ubuntu映像 下载地址&#xff1a;http://old-releases.ubuntu.com/releases/18.04/ 下载名称&#xff1a; ubuntu-18.04.2-desktop-amd64.iso 清华镜像站&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/ 阿里云镜像站&#xff1a;https://mirrors.ali…

2024年最新阿里云优惠券获得方法整理

随着云计算技术的日益普及&#xff0c;阿里云作为国内领先的云服务提供商&#xff0c;受到了越来越多企业和个人的青睐。为了吸引广大用户&#xff0c;阿里云经常推出各种优惠活动&#xff0c;其中就包括阿里云优惠券&#xff0c;可以帮助用户降低成本&#xff0c;享受更优惠的…

【计算机网络】1.5 分组交换网中的时延、丢包和吞吐量

A.分组交换网中的时延 当分组从一个节点沿着路径到后一节点时&#xff0c;该分组在沿途的各个节点经受了几种不同类型的时延。 时延的类型 处理时延 - d n o d a l d_{nodal} dnodal​ 处理时延包括以下部分—— a. 检查分组首部 b. 决定分组导向 排队时延 - d p r o c d_{…

【超万字超详细Linux常用命令大全】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;书生♡&#xff0c;今天主要和大家分享一下LIinux的基础命令&#xff0c;带有各种命令的作用&#xff0c;语法&#xff0c;参数和详细案例&#xff0c;希望对大家有所帮助。 &#x1f49e;&#x1f49e;前路漫漫…

【MySQL性能优化】- 一文了解MVCC机制

MySQL理解MVCC &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff…

C# ListView 控件使用

1.基本设置 listView1.Columns.Add("序号", 60); //向 listView1控件中添加1列 同时设置列名称和宽度listView1.Columns.Add("温度", 100); //下同listView1.Columns.Add("偏移", 100);listView1.Columns.Add("分割", 50);listView1…

QT----计算器

目录 1 搭建标准界面2、 逻辑编写2.1 初始化 github链接&#xff1a;基于qt的计算器 更多内容可以点击这里查看个人博客&#xff1a;个人博客 1 搭建标准界面 按照下图搭设界面 修改样式让这计算器看起来更像一点&#xff0c;同时对按钮分组进行样式编辑&#xff0c;添加字符…