对6个默认成员函数的总结

news2025/2/20 21:36:01

前言:本篇文章是对六大默认成员函数的自我总结,不适合刚入门的新人学习。适合想进一步深入了解六大默认成员函数的人学习。

1.构造函数:给对象初始化的函数,相当于之前写的Init函数。

构造函数的特性:

对内置类型不做处理(也可处理,取决于编译器),对自定义类型:去调用它的默认构造函数(下面会提到默认构造函数包括哪几类)。

不写返回值

函数的名字就是类名

可以函数重载(不同的初始化方式)

对对象初始化

string Date
{
public:
    Date(int year=1;int month=1;int day=1)
    {
        int _year=year;
        int _month=month;
        int _day=day;
    }
private:
    int _year;
    int _month;
    int _day;
}

这一段代码写了构造函数:没有返回值,函数名就是Date,全缺省,赋初值。


string Date
{
public:
    Date(int year=2024;int month=4;int day=26)
    {
        int _year=year;
        int _month=month;
        int _day=day;
    }
private:
    int _year=1;
    int _month=1;
    int _day=1;
}

这一段代码,多了一个缺省值,注意,int _year=1;int _month=1;int _day=1这里是声明,不是定义。

这一段代码,会先走int _year=1;int _month=1;int _day=1这一段,然后再进入构造函数体内部。

整体的进行过程,先把年月日用缺省值的1,然后进入函数体内部,在对年月日赋初值。

(注意:如果有初始化列表,就不会走缺省值)

//构造函数
Date(int year = 1, int month = 1,int day=1)
	:_year(year)
	,_month(month)
	,_day(day)
{}

有初始化列表,就不会走缺省值那一条路。


默认构造函数:

1.无参的

2.全缺省的

3.编译器自动生成的

(为什么要有默认构造函数这个概念?-->对于自定义类型,会去调用它的默认构造函数)


注意点:

没有写构造函数,写了拷贝构造-->编译器就不会自动生成构造函数(对内置类型:不做处理。对自定义类型:调用对应的构造函数)

写了构造,没写拷贝构造-->编译器会自动生成拷贝构造(对内置类型:浅拷贝,值拷贝。对自定义类型:调用类对象的拷贝构造)


2.析构函数:

特点:

     1.函数名前面加~

     2.函数名就是类名

     3.不需要传参

     4.一个类里面只能写一个析构函数

     5.析构函数是资源的清理,而不是销毁数据


3.拷贝构造:

特点:

1.需要传引用传参(否则会发生无穷递归:传自定义类型需要调用对应的拷贝构造)

2.没有返回值

3.拷贝的对象和被拷贝的对象的类型一致

4.对于内置类型:浅拷贝

5.对于自定义类型:调用类的拷贝构造(所以如果不是传引用传参,会发生无穷递归)

6.拷贝构造也可以写初始化列表,也会去走缺省值的地方 

Date(Date& d)
{
    _year=d._year;
    _month=d._month;
    _day=d._day;
}

拷贝构造的使用:

Date d1(2024,4,26);

Date d2(d1);//拷贝构造

Date d2=d1;//拷贝构造(注意注意,这里是拷贝构造)


区分:

拷贝构造和赋值重载

Date d1=d2;//拷贝构造

d1=d2;//赋值重载

拷贝构造是一个特殊的构造函数,构造-->初始化对象,拿d2的值去初始化d1

赋值重载,是两个已经存在的对象,拿d2的值去赋给d1。把d1原来的值覆盖掉。


运算符重载:

1.这一类的函数的返回值和参数是和运算符的类型有关的。

1.    bool operator<(const Date& d1,const Date& d2);

2.    Date operator+=(int day);                  //里面可以是内置类型

3.    int operator--(const Date& d1,const Date& d2); 

2.运算符重载中必须要有一个自定义类型。

 3.如果写成成员函数,参数要少一个。

4.下面5中运算符不能重载    .*(点星)    ::(域限定符)    sizeof    ?:(三目运算符)    .(对象点)

5.如果成员函数和全局的同时存在,会先去调用成员函数的。那时候全局的就没有意义了。

如果类里面没有,就会去全局中找。找不到就报错。

6.前置++    Date& operator++()

  后置++     Date& operator++(int)       规定后置++多一个int参数,这个参数只是为了识别前置后置

                              (不能double,char,只是为了让编译器区分) 

//前置++
Date& operator++()
{
	*this += 1;
	return *this;
}

//后置++
Date operator++(int)
{
	Date tmp(*this);
	*this += 1;
	return tmp;
}

对于自定义类型,后置++的消耗更大,拷贝构造tmp变量 ,然后又传值返回


 4.赋值重载:

把=这个运算符进行重载,让它可以运用在自定义对象里面。 

赋值重载的函数的返回值可以是void,但是我们通常这样子写。

Date& operator=(const Date& d1)
{
    _year=d1._year;
    _month=d1._month;
    _day=d1._day;
    return *this;
}

1.代码的意思?

            把d1的值赋给this指针指向的变量,然后再返回*this,让*this作为下一个赋值的右操作数。

        就形成了练习赋值。

2.为什么要写成Date&

             因为要支持连续赋值。

3.为啥要传引用返回?

            不用创建临时变量(临时变量需要调用拷贝构造),传引用返回-->别名

       临时变量具有常性。

4.注意点:规定赋值重载不能写成全局的。其他重载可以。


拷贝构造和赋值重载:

对于内置类型:按字节拷贝(赋值)

对自定义类型:会去调用它的拷贝构造(赋值重载)


5.取地址重载:

对取地址符号进行重载,让它可以对自定义类型的对象进行取地址。

默认生成就够用了,一般情况下不需要我们自己重新写。

class Date
{
public:
     Date* operator&()   //就只有一个参数this
     {
        return this;
     }
private:
    int _year;
    int _month;
    int _day;
}

Date d1;

cout<<&d1;


6.const取地址重载:

   对于const修饰的自定义类型,也重载了并且编译器自动生成。

 返回类型要加const,对this也加const

class Date
{
public:
     const Date* operator&() const  //就只有一个参数this
     {
        return this;     //返回的this是不可以修改的,所以返回类型加了const
     }
private:
    int _year;
    int _month;
    int _day;
}

 const Date d1;

cout<<&d1;


对于取地址重载和const修饰的取地址重载,平时我们不需要管它,只需要我们可以用来对自定义类型的对象进行取它的地址就可以了。 我们不需要显示的写。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度解析:人工智能作画算法的原理与技术

引言 在数字艺术的探索中&#xff0c;人工智能&#xff08;AI&#xff09;作画算法以其独特的创造性和艺术性引起了广泛的兴趣。这些算法不仅仅是简单的图像处理工具&#xff0c;它们背后蕴藏着复杂的神经网络和深度学习模型。本文将深入探讨AI作画算法的原理与技术&#xff0…

day15 学一下Tailwindcss(java转ts全栈/3r教室)

目前距离全栈差得最多的是前端&#xff0c;而对于前端主要是CSS一直不熟悉&#xff0c;觉得很复杂写起来总是不上道&#xff0c;所以特别关注下Tailwindcss吧&#xff0c;其他前端框架可以先放放&#xff0c;多说无益直接用tailwindcss做个页面试试 看下文档&#xff1a;Tailwi…

【LeetCode刷题记录】104. 二叉树的最大深度

104 二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff…

HarmonyOS开发案例:【排行榜页面】

介绍 本课程使用声明式语法和组件化基础知识&#xff0c;搭建一个可刷新的排行榜页面。在排行榜页面中&#xff0c;使用循环渲染控制语法来实现列表数据渲染&#xff0c;使用Builder创建排行列表布局内容&#xff0c;使用装饰器State、Prop、Link来管理组件状态。最后我们点击…

基于python+django网易新闻+评论的舆情热点分析平台

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

回溯Backtracking Algorithm

目录 1) 入门例子 2) 全排列-Leetcode 46 3) 全排列II-Leetcode 47 4) 组合-Leetcode 77 5) 组合总和-Leetcode 39 6) 组合总和 II-Leetcode 40 7) 组合总和 III-Leetcode 216 8) N 皇后 Leetcode 51 9) 解数独-Leetcode37 10) 黄金矿工-Leetcode1219 其它题目 1) 入…

LeetCode45:跳跃游戏Ⅱ

题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n …

SAP PP学习笔记08 - 作业区(工作中心Work Center),作业区Customize

上一章讲了作业手顺&#xff08;工艺路线Routing&#xff09;。 SAP PP学习笔记07 - 作业手顺&#xff08;工艺路线Routing&#xff09;-CSDN博客 这一章来讲讲作业区&#xff08;工作中心 Work Center&#xff09;。 1&#xff0c;作业区&#xff08;工作中心&#xff09;中…

Linux挂载硬盘

1、查看硬盘数量 fdisk -l # 可以看到三个磁盘 # /dev/vda 50G # /dev/vdb 100G 新增 # /dev/vdc 100G 新增2、查看当前挂载情况 df -h # 可以看到50G的已经挂载3、格式化待挂载盘 # 对新的数据盘进行挂载前要进行格式化&#xff0c;只有格式化后才可以挂载 mkfs.ext4 /dev/…

2024年这样做抖音小店,操作简单,起店稳定!

大家好&#xff0c;我是电商糖果 不少朋友说跟糖果抱怨过&#xff0c;说抖音小店越来越难做了。 平台的规则越来越多&#xff0c;商家运营店铺的时候&#xff0c;很容易出现违规预警。 糖果是2020年开始做的抖音小店&#xff0c;现在已经经营了多家小店。 实话实说确实比之…

一站式AI创作平台:融合GPT会话、GPTs应用、Midjourney视觉艺术与Suno AI音乐合成模块

一、系统简介 星河易创AI系统基于ChatGPT的核心技术打造&#xff0c;集成了自然语言问答和艺术创作功能。该系统兼容Midjourney绘画技术&#xff0c;并支持官方GPT模型。它提供了多样化的应用&#xff0c;包括GPTs的多场景应用、实时GPT语音对话能力、GPT-4模型的先进特性&…

扩展大型视觉-语言模型的视觉词汇:Vary 方法

在人工智能领域&#xff0c;大型视觉-语言模型&#xff08;LVLMs&#xff09;正变得越来越重要&#xff0c;它们能够处理多种视觉和语言任务&#xff0c;如视觉问答&#xff08;VQA&#xff09;、图像字幕生成和光学字符识别&#xff08;OCR&#xff09;。然而&#xff0c;现有…

springboot 集成 flowable

随着企业对于业务流程管理需求的增加&#xff0c;流程引擎在企业信息化建设中的作用越来越重要。Flowable是一个开源的轻量级业务流程管理&#xff08;BPM&#xff09;和工作流引擎&#xff0c;它支持BPMN 2.0标准。 Flowable的一些特点&#xff1a; 安装集成&#xff1a;Flow…

基于Springboot 的 Excel表格的导入导出

首先 &#xff0c;引入相关依赖EasyPOI <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.4.0</version></dependency> 编写实体类&#xff1a; Data AllArgs…

Golang错误处理机制

文章目录 Golang错误处理机制panic异常recover捕获异常自定义错误 Golang错误处理机制 panic异常 panic异常 Go的类型系统会在编译时捕获很多错误&#xff0c;但有些错误只能在运行时检查&#xff0c;比如除零错误、数组访问越界、空指针引用等&#xff0c;这些运行时错误会引…

mongodb卸载(win)

关闭服务 &#xff08;或者cmd卸载服务&#xff1a;&#xff09; net stop 服务名称卸载应用 至此&#xff0c;卸载完成&#xff01;

手拉手CentOS 安装 mysql-5.7

MySQL是一种关系型数据库管理系统&#xff0c;关系数据库将数据保存在不同的表中&#xff0c;而不是将所有数据放在一个大仓库内&#xff0c;这样就增加了速度并提高了灵活性。 tar.gz包安装 #如没有安装wget则无法使用&#xff0c;以装&#xff0c;则直接省略该步~&#xff…

DBeaver连接神通数据库

一、在dbeaver中新建一个驱动 1、打开dbeaver&#xff0c;点击数据库-驱动管理器 2、点击右侧的新建 在【设置】中填写以下信息 类名&#xff1a;com.oscar.Driver URL模板&#xff1a;jdbc:oscar://{host}:{port} 默认端口&#xff1a;2003 在【库】中点击添加文件&#…

C语言学习/复习37--进阶总结与题目练习

一、题目练习 1. 循环与无符号char的取值范围 注意事项&#xff1a;0~255 -128~127 char类的取值范围看做循环图 2.ASCLL值与循环 3.按位操作与bit位 4 .结构体的大小 注意事项&#xff1a;结构体嵌套结构体的大小计算 5.循环条件 6.数据类型与原反补码 7.指针访问字符串数…

Python实现智能客服问答系统

随着人工智能技术的不断发展&#xff0c;机器人客服与聊天系统成为了热门话题。Python作为一种简单易学、功能强大的编程语言&#xff0c;在机器人客服与聊天系统的开发中具有广泛应用。 本文将介绍如何使用Python实现机器人客服与聊天系统&#xff0c;包括实现方式、代码示例和…