yo!这里是类的默认成员函数

news2024/12/23 22:14:15

目录

前言

默认成员函数

构造函数

1.介绍

2.注意点

析构函数

1.介绍

2.注意点

拷贝构造函数

1.介绍

2.注意点

赋值运算符重载

1.介绍

2.注意点

取地址及const取地址操作符重载

1.介绍

2.注意点

后记


前言

        在学习c++的过程中,我们知道,c++是面向对象的语言,有这样三个特性——封装、继承、多态,在类和对象阶段研究封装的特性,而类的默认成员函数正是实现封装特性的大框架,在认识默认成员函数之后,对于类的封装特性会有进一步的理解,这也属于c++后续知识的根基中的根基,务必对此要反复学习,下面就来详细介绍一下类的默认成员函数。

默认成员函数

        默认成员函数是用户没有显示实现,编译器自动生成的成员函数,在一个空类中,编译器会自动生成6个默认构造函数,分别为默认构造函数、默认析构函数、默认拷贝构造函数、赋值运算符重载、取地址及const取地址操作符重载,在这六个之中,前四个较为重要,最后两个较为不重要,因为很少需要用户实现,使用默认生成的即可。

        有同学会说,既然编译器可以自动生成,那我们为什么还要学习它们,直接使用编译器生成的不就行了?不可以,因为自动生成的默认成员函数无法满足所有类的实现,无法完美得当的实现一个类的初始化、销毁等操作,大部分的类还是会需要用户自己来实现,下面会针对每一个默认成员函数进行具体的讲解。

  • 构造函数

1.介绍

        构造函数是一个特殊的成员函数,作用并不是开辟空间,而是初始化对象,在对象整个生命周期内只调用一次。

特征:

        ①.构造函数名与类名相同;

        ②.函数无返回值;

        ③.无需用户调用,而是编译器自动调用;

        ④.可重载。

2.注意点

        ①.如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,当用户显式定义,编译器将不再生成;

        ②.默认构造函数包括 用户显示定义的无参的构造函数和全缺省的构造函数 以及 编译器自动生成的构造函数,并且默认构造函数只能有一个;

        ③.当用户显示定义了一个构造函数,既不是无参也不是全缺省,同时编译器也不会自动生成,那么就会报错,提示无默认构造函数可用;

        ④.(重要)大部分类都需要用户自己写构造函数,只有内置类型不需要初始化或者无内置类型,只有自定义类型的类不需要显示写,因为自定义类型会去调用自己的构造函数。(内置类型包括int、char......,自定义类型包括struct、class等自定义出来的类型)

eg:

class Date
{
public:
     Date(int year = 1900, int month = 1, int day = 1)  //全缺省的构造函数
     {
         _year = year;
         _month = month;
         _day = day;
     }
private:
     int _year;
     int _month;
     int _day;
};
  • 析构函数

1.介绍

        析构函数是一个特殊的成员函数,作用并不是销毁对象,而是销毁对象中的资源,在对象整个生命周期内只调用一次。

特征:

        ①.析构函数名是在类名前加上字符 ~;

        ②.函数无返回值;

        ③.无需用户调用,而是编译器自动调用,一个类只能有一个析构函数;

        ④.不可重载。

2.注意点

        ①.与构造函数类似,不处理内置类型,自定义类型会去调用自己的析构函数,因为内置类型会在函数结束后被系统将内存回收掉;

        ②.(重要)若类中没有申请资源,析构函数可以不写,直接使用编译器生成的默认析构函数,当有资源申请时,一定要写,否则会造成资源泄漏。

eg:

class Stack
{
public:
	Stack(int capacity = 0)
	{
        //...
	}

	~Stack()
	{
		delete[] _arr;
		_arr = nullptr;
		_top = _capacity = 0;
	}

private:
	T* _arr;
	size_t _top;
	size_t _capacity;
};
  • 拷贝构造函数

1.介绍

        拷贝构造函数是一个特殊的成员函数,作用是使用已有对象创建新对象。

特征:

        ①.是构造函数的一个重载形式;

        ②.只有一个形参,就是已存在对象的引用,常用const修饰,即拷贝此对象。

2.注意点

        ①.参数必须是引用,若是传值调用,会报错,因为传值调用本身就会调用拷贝构造函数,导致无穷调用;

        ②.若未显式定义,编译器会生成默认的拷贝构造函数,但是浅拷贝,需要深拷贝的地方一定要自己显示定义拷贝构造函数;

        ③.在编译器生成的默认拷贝构造函数中,内置类型是浅拷贝,而自定义类型则是调用自己的拷贝构造函数;

        ④.(重要)类中如果没有申请资源,拷贝构造函数是否写都可以;当涉及到资源申请时,则拷贝构造函数是一定要写的,否则就是浅拷贝。

eg:

class Date
{
public:
     Date(int year, int minute, int day)
     {
         //...
     }
     Date(const Date& d)   //拷贝构造函数
     {
         //...
     }
private:
     int _year;
     int _month;
     int _day;
};
  • 赋值运算符重载

1.介绍

        赋值运算符重载,实现赋值运算符(=)可适用于自定义类型,语法格式:T& operator=(const T& t){} 。

特征:

        ①.const T&,传递引用可以提高传参效率;

        ②.T&,返回引用是为了支持连续赋值;

        ③.返回*this ,要符合连续赋值的含义。

2.注意点

        ①.赋值运算符只能重载成类的成员函数,不能重载成全局函数,因为赋值运算符如果不显式实现,编译器会生成默认,此时用户在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载发生冲突;

        ②.用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以浅拷贝形式进行拷贝;

        ③.无需用户调用,而是编译器自动调用,一个类只能有一个析构函数;

        ④.如果类中未涉及到资源管理,赋值运算符是否实现都可以,当涉及到资源管理则必 须要显示实现。

eg:

class Time
{
public:
     Time()
     {
         //...
     }
     Time& operator=(const Time& t)   //赋值运算符重载
     {
         if (this != &t)
         {
             _hour = t._hour;
             _minute = t._minute;
             _second = t._second;
         }
         return *this;
     }
private:
     int _hour;
     int _minute;
     int _second;
};
  • 取地址及const取地址操作符重载

1.介绍

        取地址操作符重载,与赋值运算符重载类似,实现取地址操作符(&)可适用于自定义类型。

2.注意点

        一般不需要用户自己定义,直接使用编译器生成的默认取地址重载即可,特殊情况才需要自己写。

 eg:

class Date
{ 
public :
     Date* operator&()   //取地址操作符重载
     {
         return this ;
     }
     const Date* operator&() const   //const取地址操作符重载
     {
         return this ;
     }
private :
     int _year ; // 年
     int _month ; // 月
     int _day ; // 日
};

后记

        在学习类的默认成员函数时,会存在很多细节没能够琢磨明白,或者说很难理解明白,一定要反复吸收,反复理解,才能够摸清一点门道,作为c++的根基中的根基,希望大家能够重视对类和对象的学习,如果有什么问题,欢迎在评论区讨论或者私我哦,拜拜。


 

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

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

相关文章

Windows下PyTorch深度学习环境配置(GPU)

一:下载Anaconda (路径最好全英文) (下载好后,可以创建其他虚拟环境,因为是自己学习,所以先不放步骤,有需要者可以参考B站up我是土堆的视频) 二:利用 conda…

Stream实现List和Map互转总结

本文来说下Stream实现List和Map互转总结 文章目录 实体类Map转List代码List转Map 实体类 本篇介绍Stream流List和Map互转,同时在转换过程中遇到的问题分析。 package cn.wideth.collect;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArg…

【Linux】udp服务器实现大型网络聊天室

udp终结篇~ 文章目录 前言一、udp服务器实现大型网络聊天室总结 前言 根据上一篇文章中对于英汉互译和远程操作的两个小功能大家应该已经学会了,我们的目的是让大家可以深刻的理解udp服务器所需要的接口已经实现的简单步骤,下面我们开始实现网络聊天室。…

Spring 6【DI的两种方式、自动注入】(四)-全面详解(学习总结---从入门到深化)

目录 八、DI的两种方式 九、自动注入 八、DI的两种方式 IoC是由IoC容器帮助实例化Bean,并且在IoC容器内部注入关联属性(对象)的过程。 在上面演示的都是如何实例化Bean,下面演示的是如果给Bean注入属性。也就是说在讲解IoC/DI的另 一半功能。 在前面…

实训笔记7.18

实训笔记7.18 7.18一、座右铭二、Hadoop大数据技术 大数据软件一般都要求7*24小时不宕机三、Hadoop的组成3.1 HDFS3.2 MapReduce3.3 YARN3.4 Hadoop Common 四、Hadoop生态圈五、Hadoop的安装问题5.1 Hadoop的本地安装模式-基本不用5.2 Hadoop的伪分布安装模式5.3 Hadoop的完全…

webpack插件compression-webpack-plugin

Vue配置compression-webpack-plugin实现Gzip压缩 1、为什么要压缩? 打包的时候开启gzip可以很大程度减少包的大小,页面大小可以变为原来的30%甚至更小,非常适合于上线部署。更小的体积对于用户体验来说就意味着更快的加载速度以及更好的用户…

SOPC之NiosⅡ系统(五)

NIOS Ⅱ系统实例 目录 2.创建BSP工程 2.1 创建BSP工程 2.2 BSP Editor 2.3 创建C代码文件 3.Nios Ⅱ实例 3.1 Hello NIOS Ⅱ 3.2 System ID与Timestamp 3.3 蜂鸣器定时鸣叫 3.4 拨码开关输入GIO控制 4.FPGA器件的代码固化 4.1 嵌入式软件HEX文件生成 4.2 程序存储…

RocketMQ环境搭建

环境搭建 环境准备 下载地址: https://downloads.apache.org/rocketmq/4.9.5/安装 上传至服务器 mkdir /usr/soft #上传至此目录/usr/softmkdir /usr/soft 解压 cd /usr/soft unzip rocketmq-all-4.9.5-bin-release.zip移动 mkdir /usr/local/rocketmq cd /usr/soft mv r…

Mysql 修改group_concat_max_len的默认值

1.前言 最近在进行递归查询组织及其下属组织时,发现数据查询不全,子组织数据查询不出来的问题。经排查发现是group_concat_max_len的长度不足引起的,默认情况下group_concat_max_len1024,所以我们需要修改这个默认参数。 2.SQL语…

.net core控制台应用程序在linux运行

1)创建.net 6.0控制台应用程序 2)在应用根目录执行cmd命令发布应用:dotnet publish -o .\deploy 3)将发布文件上传到服务器 4)运行控制台应用程序(dotnet /home/app/ConsoleApp/ConsoleApp5.dll&#xff09…

卡尔曼与扩展卡尔曼的区别与推导

1.卡尔曼的推导: 1)先看系统随机系统状态空间模型:(线性) 所谓线性是指递推或者状态转移方程是线性的 至于参数解释自己去看书,本文旨在捋顺推导思路。 2)k-1时刻值减去k-1的状态最优估计k-1时…

Vscode设置忽略文件,忽略node-modules、dist

####看图 files.exclude 设置排除和显示的文件夹 search.exclude 设置搜索时忽略的文件夹

WEB:Cat

背景知识 命令执行漏洞 Django框架 题目 先ping一下,输入127.0.0.1 这个输入可能存在命令执行的操作,但是经过尝试之后并不能正常执行 127.0.0.1&&dir、127.0.0.1&&ls、127.0.0.1|ls均被屏蔽,但经过尝试可知,网…

matplotlib笔记:qbstyle设置matplotlib 主题

0 原始matplotlib import numpy as np import matplotlib.pyplot as pltxnp.linspace(0,100) ynp.sin(100*x)plt.plot(x,y); 1 light from qbstyles import mpl_style mpl_style(darkFalse) #开启light主题 plt.plot(x,y); 2 dark from qbstyles import mpl_style mpl_styl…

实现大文件传输的几种方法,并实现不同电脑间大文件传输

随着网络技术的快速发展,大文件的传输需求越来越多,如何在不同的电脑之间实现大文件的快速传输,是一个挑战,下面介绍几种常用的方法可以解决这个问题。 1、利用局域网传输:把两台电脑接入同一个网络环境,通…

关于硬件加速器FPGA的异构加速流程龙蜥CI框架及实践介绍 | 第 87-88 期

本周「龙蜥大讲堂」预告来啦!我们邀请了浪潮信息异构加速软件工程师刘科分享《基于 FPGA 的数据库硬件加速研究》、 CICD SIG Maintainer 李晔做《龙蜥社区 CI 框架及实践》主题演讲,精彩多多,快入群,预定前排小板凳观看直播&…

项目名称:无源在线词典项目

一,概述 基于C语言的网络电子词典项目,使用到了tcp协议的并发服务器设计、网络编程、文件I/O、数据库等多方面的知识。可以满足多用户同时登陆,用户登陆后可以查询单词及历史记录,具有查找快速,保密性好等优点。 开…

19.删除链表的倒数第N个节点

19.删除链表的倒数第N个节点 这道题是链表问题中双指针的一个经典应用 如果要删除倒数第n个节点,那么我们让fast快指针移动n步,然后让fast和慢指针slow同时开始移动,当fast指针指向链表末尾的时候,删掉slow指针指向的节点即可。 …

ai绘画工具哪个好用?这几款好用的ai绘画生成器安利给你

嘿,小伙伴们!你是否曾经想过创作一幅酷炫的人物插画,但由于缺乏绘画技巧而放弃这个想法?别担心,现在有了ai绘画工具,让你轻松成为艺术家的潜力无限!今天我就来给大家介绍几个用ai绘画工具生成好…

【iOS】ARC实现

ARC由以下工具来实现: clang(LLVM编译器)3.0以上objc4 Objective-C运行时库493.9以上 下面我们,我们将围绕clang汇编输出和objc4库的源代码探究ARC实现 1. __strong修饰符 1.1 赋值给附有__strong修饰符的变量 看下面代码 {…