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

C++的类与对象中(主讲默认成员函数)

目录

1.类的默认成员函数

2.构造函数

1.全缺省构造函数

2.第7点中的对自定义类型的成员变量构造(调用编译器自动生成的默认构造函数)

3.析构函数

4.拷贝构造函数

5.运算符重载

1.概念

2.赋值运算符重载

6.const成员函数


1.类的默认成员函数

默认成员函数就是用户没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类,我们不写的情况下编译器会默认⽣成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最后两个取地址重载不重要,我们稍微了解⼀下即可。

2.构造函数

构造函数是特殊的成员函数,它的作用是初始化对象。构造函数的本质是要替代我们以前Date类中写的Init函数的功能,构造函数自动调用的特点就完美的替代了Init。

1.全缺省构造函数

由于全缺省的构造函数适用面更广,所以我们写个全缺省的构造函数。

class Date
{public:Date(int year=2024,int month=9,int day=15){_year = year;_month = month;_day = day;}void Print(){cout << _year << '/' << _month << '/' << _day << endl;}private:int _year;int _month;int _day;
};
Date d1;
d1.Print();

结果:

通过结果我们可以看出d1这个对象在定义时就已经初始化完成了,而它的初始化就是由我们所写的构造函数来完成的。

2.第7点中的对自定义类型的成员变量构造(调用编译器自动生成的默认构造函数)

typedef int STDataType;
class Stack
{
public:Stack(int n = 4){_a = (STDataType*)malloc(sizeof(STDataType) * n);_capacity = n;_top = 0;}
private:STDataType* _a;int _capacity;int _top;
};// 两个Stack实现队列 
class MyQueue
{
public://编译器默认⽣成MyQueue的构造函数调⽤了Stack的构造,完成了两个成员的初始化 
private:Stack pushst;Stack popst;
};

从上图中,我们可以看出在我们用队列这个类创建对象之后,它是调用了栈那个类中的默认构造函数,因为我在队列的类中并没有写构造函数,调用的是编译器的默认构造函数,而编译器在队列中的默认构造函数就是调用了栈这个类的默认构造函数(如果栈中没有默认构造函数,编译器会报错,下面举个例子)。

例如:假设我把上面的代码中的默认构造函数改成普通的构造函数的话,此时栈这个类中是没有默认构造函数的,故队列在创建对象时会报错。

3.析构函数

typedef int STDataType;
class Stack
{
public:Stack(int n = 4){_a = (STDataType*)malloc(sizeof(STDataType) * n);_capacity = n;_top = 0;}~Stack(){cout << "~Stack()" << endl;free(_a);_a = nullptr;_top = _capacity = 0;}
private:STDataType* _a;int _capacity;int _top;
};// 两个Stack实现队列 
class MyQueue
{
public://编译器默认⽣成MyQueue的构造函数调⽤了Stack的构造,完成了两个成员的初始化 
private:Stack pushst;Stack popst;
};void test1() 
{MyQueue q1;}

从test1函数的运行结果可以得知为了实现队列中的两个栈已经被析构函数释放了。而队列的析构函数调用的是编译器的默认析构函数,而这个默认析构函数则就是栈的析构函数。

注意:可以认为析构函数就是为了释放动态申请的空间,而销毁的时间则是在对象销毁时动态申请的空间自动调用析构函数进行销毁。

4.拷贝构造函数

下图是对拷贝构造函数为什么不能传值而是要传引用的原因(传值传参和传值返回都要调用拷贝构造函数):

//拷贝构造函数
Stack(const Stack& st)
{// 需要对_a指向资源创建同样⼤的资源再拷⻉值 _a = (STDataType*)malloc(sizeof(STDataType) * st._capacity);memcpy(_a, st._a, sizeof(STDataType) * st._top);_top = st._top;_capacity = st._capacity;
}
//运用拷贝构造
Stack st2 = st1;
//or Stack st2(st1);
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef int STDataType;
class Stack
{
public:Stack(int n = 4){_a = (STDataType*)malloc(sizeof(STDataType) * n);_capacity = n;_top = 0;}//拷贝构造函数Stack(const Stack& st){// 需要对_a指向资源创建同样⼤的资源再拷⻉值 _a = (STDataType*)malloc(sizeof(STDataType) * st._capacity);memcpy(_a, st._a, sizeof(STDataType) * st._top);_top = st._top;_capacity = st._capacity;}void Push(STDataType x){if (_top == _capacity){int newcapacity = _capacity * 2;STDataType* tmp = (STDataType*)realloc(_a, newcapacity *sizeof(STDataType));_a = tmp;_capacity = newcapacity;}_a[_top++] = x;}~Stack(){cout << "~Stack()" << endl;free(_a);_a = nullptr;_top = _capacity = 0;}
private:STDataType* _a;int _capacity;int _top;
};
// 两个Stack实现队列 
class MyQueue
{
public:
private:Stack pushst;Stack popst;
};
int main()
{Stack st1;st1.Push(1);st1.Push(2);// Stack不显⽰实现拷⻉构造,⽤⾃动⽣成的拷⻉构造完成浅拷⻉ // 会导致st1和st2⾥⾯的_a指针指向同⼀块资源,析构时会析构两次,程序崩溃 Stack st2 = st1;MyQueue mq1;// MyQueue⾃动⽣成的拷⻉构造,会⾃动调⽤Stack拷⻉构造完成pushst/popst // 的拷⻉,只要Stack拷⻉构造⾃⼰实现了深拷⻉,他就没问题 MyQueue mq2 = mq1;return 0;
}

5.运算符重载

1.概念

//类里定义的两个函数
Date& operator++()
{cout << "前置++" << endl;//...return *this;
}
Date operator++(int)
{Date tmp;cout << "后置++" << endl;//...return tmp;
}

2.赋值运算符重载

Stack& operator=(Stack& st)
{_a = (STDataType*)malloc(sizeof(STDataType) * st._capacity);memcpy(_a, st._a, sizeof(STDataType) * st._top);_top = st._top;_capacity = st._capacity;return (*this);
}
//赋值运算符重载
d1=d3;//拷贝构造
Date d1=d2;
Date d1(d2);

6.const成员函数

void Print() const{cout << _year << "/" << _month << "/" << _day << endl;}

相关文章:

C++的类与对象中(主讲默认成员函数)

目录 1.类的默认成员函数 2.构造函数 1.全缺省构造函数 2.第7点中的对自定义类型的成员变量构造&#xff08;调用编译器自动生成的默认构造函数&#xff09; 3.析构函数 4.拷贝构造函数 5.运算符重载 1.概念 2.赋值运算符重载 6.const成员函数 1.类的默认成员函数 默…...

C#学习系列之Gmap地图界面上的实时绘制问题

C#学习系列之Gmap地图界面上的实时绘制问题 前言总结 前言 在地图控件上增加绘制不规则图形&#xff0c;在之前的经验来看&#xff0c; System.InvalidOperationException:“无法使用 DependencyObject&#xff0c;它属于其父 Freezable 之外的其他线程。” 其实就是ui线程中…...

Spring Boot中实现定时任务的主要方式

文章目录 在Spring Boot中实现定时任务&#xff0c;主要有以下几种方式&#xff1a;1. 使用Scheduled注解2. 使用Quartz调度器使用Quartz调度器(更好的做法)3. 使用TaskExecutor和ScheduledExecutorService4.总结 在Spring Boot中实现定时任务&#xff0c;主要有以下几种方式&a…...

C#使用HttpWebRequest下载文件

public static bool HttpDownloadFile(string downloadUrl, string localPath, log4net.ILog log) { bool bFlagDownloadFile false; //log.Debug("HttpDownloadFile--准备以HTTP的方式下载文件&#xff0c;url:[" downloadUrl &…...

Linux: virtual: qemu-kvm: top cpu usage的组成是否包含guest的使用?

文章目录 问题试验mpstat问题 最近看一个问题,看到一个虚拟机分配的cpu是:3-4,27-28 Cpus_allowed: 0000,18000018 Cpus_allowed_list: 3-4,27-28 使用top看qemu-kvm进程的cpu usage是:13.3%: [root@qrms6-host01 14278]# top -p 14278 top - 01:19:35 up 4 days...

【03】深度学习——神经网络原理 | 多层感知机 | 前向传播和反向传播 | 多层感知机代码实现 | 回归问题、分类问题 | 多分类问题代码实现

深度学习 1.神经网络原理1.1神经元模型1.2神经网络结构1.3隐藏层1.3.1激活函数层1.4输出层1.4.1softmax层1.5损失函数1.6反向传播2.多层感知机2.1线性网络的局限性2.2引入非线性2.3多层感知机(Multi-Layer Perceptron,MLP)2.4激活函数(Activation Function)2.4.1Sigmoid函…...

MySQL行锁的实践

在MySQL中&#xff0c;根据加锁的粒度&#xff0c;可以将数据库的锁细分为表锁、行锁、页锁。其中&#xff0c;表锁(Table Lock)是一种粗粒度的锁&#xff0c;它锁定整个表&#xff0c;阻止其他事务访问表中的任何行&#xff1b;行锁(Row Lock)是一种细粒度的锁&#xff0c;它锁…...

iOS 18 將在 9 月 16 日正式上線

現在有了正式的上線日期了。一如往常的&#xff0c;它會在 iPhone 16 系列正式推出前的 9 月 16 日先行上線。 iOS 18 最受矚目的無疑是它的 Apple Intelligence 功能&#xff0c;不過並非所有的 iPhone 機種都能享用&#xff0c;而是只有去年的 iPhone 15 Pro 和 Pro Max 才能…...

css选择器有几种?选择器的优先级是怎样的?

CSS选择器的主要分类 元素选择器&#xff08;Type Selectors&#xff09;&#xff1a;选择HTML文档中的特定类型的元素。 示例&#xff1a;p { color: red; } 类选择器&#xff08;Class Selectors&#xff09;&#xff1a;选择具有指定类名的元素。 示例&#xff1a;.myClass …...

果蔬识别系统性能优化之路(四)

目录 前情提要剩下问题 问题排查解决方案下一步 前情提要 果蔬识别系统性能优化之路&#xff08;三&#xff09; 剩下问题 同步数据库数据并初始化ivf依然要8,9秒 问题排查 通过断点加时间打印&#xff0c;发生其实初始化ivf的时间很快&#xff0c;慢的是数据在网络间的传…...

kafka之protobuf

Protobuf 的 .proto 文件是一种描述消息结构的定义文件&#xff0c;使用这种文件可以定义数据结构&#xff08;消息&#xff09;&#xff0c;然后生成对应语言的类或代码用于序列化和反序列化数据。生成 .proto 文件涉及到编写 .proto 文件定义&#xff0c;然后通过 protoc 编译…...

BARTBERT

BART和BERT都是基于Transformer架构的预训练语言模型。 模型架构&#xff1a; BERT (Bidirectional Encoder Representations from Transformers) 主要是一个编码器&#xff08;Encoder&#xff09;模型&#xff0c;它使用了Transformer的编码器部分来处理输入的文本&#xff0…...

C++ 11新特性(1)

文章目录 C11新特性之auto和decltype知识点autoauto推导规则什么时候使用auto&#xff1f; decltypedecltype推导规则 auto和decltype的配合使用 C11新特性之左值引用、右值引用、移动语义、完美转发左值、右值纯右值、将亡值纯右值将亡值左值引用、右值引用 移动语义深拷贝、浅…...

彻底理解浅拷贝和深拷贝

目录 浅拷贝实现 深拷贝实现自己手写 浅拷贝 浅拷贝是指创建一个新对象&#xff0c;这个对象具有原对象属性的精确副本 基本数据类型&#xff08;如字符串、数字等&#xff09;&#xff0c;在浅拷贝过程中它们是通过值传递的&#xff0c;而不是引用传递&#xff0c;修改值并不…...

Spring4-IoC2-基于注解管理bean

目录 开启组件扫描 使用注解定义bean Autowired注入 场景一&#xff1a;属性注入 场景二&#xff1a;set注入 场景三&#xff1a;构造方法注入 场景四&#xff1a;形参注入 场景五&#xff1a;只有一个构造函数&#xff0c;无注解 场景六&#xff1a;Autowired和Quali…...

AI基础 L22 Uncertainty over Time I 时间的不确定性

Time and Uncertainty 1 Time and Uncertainty States and Observations • discrete-time models: we view the world as a series of snapshots or time slices • the time interval ∆ between slices, we assume to be the same for every interval • Xt: denotes the se…...

中小型企业网络构建

1 什么是 VLAN&#xff1f; VLAN&#xff0c;指的是虚拟局域网&#xff0c;是一种 2 层技术。可以在交换机上实现广播域的隔离。从而可以减小 数据广播风暴对交换网络的影响&#xff0c;降低了网络管理难度&#xff0c;同时可以实现网络规模的灵活扩展。 2 Trunk 链路与 Acces…...

PXE服务

一.PXE服务的功能介绍 1.无盘启动&#xff1a;PXE允许计算机在没有本地存储设备的情况下启动操作系统。这对于构建无盘工作站非常有用&#xff0c;因为计算机可以直接从网络加载操作系统和其他应用程序1。 2.远程安装操作系统&#xff1a;PXE技术可以用于远程安装操作系统&…...

Docker技术深度解析与实践应用

Docker技术深度解析与实践应用 引言 在现代软件开发与部署的浪潮中&#xff0c;Docker作为一种轻量级的容器化技术&#xff0c;凭借其高效、一致和灵活的特性&#xff0c;逐渐成为云原生应用开发和部署的基石。本文将深入探讨Docker的核心概念、技术原理、实践应用&#xff0…...

链动321模式小程序开发源码

链动31模式概述 链动31模式是一种基于技术的新型商业模式&#xff0c;它通过激励用户分享和推广&#xff0c;实现用户、企业和平台的共赢。该模式通常涉及商品展示、积分系统、分享推广和排行榜等功能&#xff0c;旨在通过用户之间的社交裂变来扩大销售和品牌影响力。如何开发这…...

java开发中间件学习记录(持续更新中~)

1 Redis 2JVM 3 java基础底层 4Mysql 5 spring 6 微服务 7.......(持续更新) One:Redis篇 1:Redis 1.穿透 1.1缓存穿透 1.1.1布隆过滤器 1.2缓存击穿 2&#xff1a;击穿 1.3&#xff1a;缓存雪崩 1.4:双写一致 1.5.持久化&#xff08;RDB,AOF&#xff09; 1.6…...

(批处理)无限弹窗cmd

代码部分 echo off echo 好了&#xff0c;可以退出了 pause>nul echo 再点就要无限弹窗了&#xff01; pause >nul echo 你还点&#xff1f; pause >nul echo 再给你最后一次机会&#xff0c;别点了&#xff0c;再点准备重启 pause >nul echo 点击任意键变身奥特曼…...

解决ubuntu 24.04 ibus出现卡死、高延迟问题

问题描述 ubuntu中使用ibus经常会出现卡死、高延迟的问题&#xff0c;网上找了一些解决方法就手动输入命令是重启。但是键盘卡死了没法输入&#xff0c;不能很有效的解决问题。 解决思路 通过一个bash脚本监测ibus进程&#xff0c;当出现进程卡死的时候自动重启。 bash代码…...

减少脏页标记技术中处理时间的方法

减少脏页标记技术中处理时间的方法 一、引言 在数据库系统中,脏页标记技术对于确保数据的一致性和持久性至关重要。然而,脏页标记过程可能会消耗一定的处理时间,影响数据库的性能。因此,寻找有效的方法来减少脏页标记技术中的处理时间具有重要意义。 二、优化数据结构 …...

828华为云征文 | 华为云Flexusx与Docker技术融合,打造个性化WizNote服务

前言 华为云Flexus X实例携手Docker技术&#xff0c;创新融合打造高效个性化WizNote服务。华为云Flexus X实例的柔性算力与Docker的容器化优势相结合&#xff0c;实现资源灵活配置与性能优化&#xff0c;助力企业轻松构建稳定、高效的云端笔记平台。828华为云企业上云节特惠来袭…...

JavaScript事件处理和常用对象

文章目录 前言一、事件处理程序 1.JavaScript 常用事件2.事件处理程序的调用二、常用对象 1.Window 对象2.String 对象3.Date 对象总结 前言 JavaScript 语言是事件驱动型的。这意味着&#xff0c;该门语言可以通过事件触发来调用某一函数或者一段代码。该文还简单介绍了Window…...

Qt基础类05-尺寸类QSize

Qt基础类05-尺寸类QSize 摘要基本信息写在前面重要成员函数举例7个QSize QSize::boundedTo(const QSize &otherSize) constQSize QSize::expandedTo(const QSize &otherSize) constbool QSize::isEmpty() constbool QSize::isNull() constbool QSize::isValid() constQ…...

Vue 2中的this指向详解

在JavaScript中&#xff0c;this的指向是许多开发者经常遇到的问题&#xff0c;尤其是在使用Vue这样的框架时。在Vue 2中&#xff0c;理解this的指向对于正确地访问组件的数据和方法至关重要。 1. this在Vue组件中的指向 在Vue组件的选项中&#xff0c;this通常指向当前组件实…...

长业务事务的离线并发问题

事务指代一组操作同时成功或同时失败&#xff0c;事务可分为两类&#xff1a; 系统事务&#xff1a;即关系数据库事务&#xff0c;一次数据库连接中由start transaction或begin开启&#xff0c;commit表示提交&#xff0c;rollback表示回滚&#xff1b;业务事务&#xff1a;完…...

黑马程序员Java笔记整理(day01)

1.windowsR进入运行&#xff0c;输入cmd 2.环境变量 3.编写java第一步 4.使用idea 5.注释 6.字面量 7.变量 8.二进制 9.数据类型 10.关键词与标识符...