C++中类的默认成员函数

默认成员函数

  • 1.构造函数
  • 2.析构函数
  • 3.拷贝构造函数
  • 4.赋值运算符重载
    • 4.1运算符重载
    • 4.2赋值运算符重载

开始
初始化和清理
拷贝复制
取地址重载
构造函数
主要完成出初始化
析构函数
主要完成清理工作
拷贝构造函数
使用同类对象初始化创建对象
赋值运算符重载
把一个对象赋值给另一个对象

1.构造函数

构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象(我们常使⽤的局部对象是栈帧创建时,空间就开好了),⽽是对象实例化时初始化对象。

构造函数的特点:

  1. 函数名与类名相同。
  2. ⽆返回值。 (返回值啥都不需要给,也不需要写void)
  3. 如果类中没有显式定义构造函数,则C++编译器会⾃动⽣成⼀个⽆参的默认构造函数,⼀旦⽤⼾显式定义编译器将不再⽣成。
  4. 构造函数可以重载。
  5. ⽆参构造函数、全缺省构造函数、我们不写构造时编译器默认⽣成的构造函数,都叫做默认构造函数。但是这三个函数有且只有⼀个存在,不能同时存在。
  6. 我们不写,编译器默认⽣成的构造,对内置类型成员变量的初始化没有要求,也就是说是是否初始化是不确定的,看编译器。
    无参的构造函数
class Person//建一个关于人的类
{
public:Person(){_name = 'x';_height = 190;_weight = 80;}
private:char _name;//名字int  _height;//身高int  _weight;//体重
};
int main()
{Person h;;//这就是调用无参构造函数Person h1()//这是错误的return 0;
}

main函数中h1是错误的,不能这样调用,这样写与函数的声明区分。

有参的构造函数:

class Person//建一个关于人的类
{
public:Person(char name,int height,int weight)
{_name = name;_height = height;_weight = weight;
}
private:char _name;//名字int  _height;//身高int  _weight;//体重
};
int main()
{Person h2('x', 190, 90);return 0;
}

全缺参和半缺省的构造函数:

class Person//建一个关于人的类
{
public:Person(){_name = 'x';_height = 190;_weight = 80;}Person(char name='x', int height=190, int weight=150){_name = name;_height = height;_weight = weight;}Person(char name, int height=190, int weight=190){_name = name;_height = height;_weight = weight;}void Print()//打印函数{cout << _name << "/" << _height << "/" << _weight << endl;}
private:char _name;//名字int  _height;//身高int  _weight;//体重
};
int main()
{Person p;Person p1('x', 190, 90);Person p2('z');p.Print();return 0;
}

2.析构函数

析构函数与构造函数功能相反,析构函数不是完成对对象本⾝的销毁,⽐如局部对象是存在栈帧的,函数结束栈帧销毁,他就释放了,不需要我们管,C++规定对象在销毁时会⾃动调⽤析构函数,完成对象中资源的清理释放⼯作。析构函数的功能类⽐我们之前Stack实现的Destroy功能,⽽像Person没有Destroy,其实就是没有资源需要释放,所以严格说Person是不需要析构函数的。
析造函数的特点:

  1. 析构函数名是在类名前加上字符 ~。。
  2. ⽆返回值。 (返回值啥都不需要给,也不需要写void)
  3. ⼀个类只能有⼀个析构函数。若未显式定义,系统会⾃动⽣成默认的析构函数。
  4. ⼀个局部域的多个对象,C++规定后定义的先析构。
  5. 对象⽣命周期结束时,系统会⾃动调⽤析构函数。

3.拷贝构造函数

如果⼀个构造函数的第⼀个参数是⾃⾝类类型的引⽤,且任何额外的参数都有默认值,则此构造函数也叫做拷⻉构造函数,也就是说拷⻉构造是⼀个特殊的构造函数。
拷贝构造函数的特点:

  1. 拷⻉构造函数是构造函数的⼀个重载。
  2. 拷⻉构造函数的参数只有⼀个且必须是类类型对象的引⽤,使⽤传值⽅式编译器直接报错,因为语法逻辑上会引发⽆穷递归调⽤
  3. C++规定⾃定义类型对象进⾏拷⻉⾏为必须调⽤拷⻉构造,所以这⾥⾃定义类型传值传参和传值返回都会调⽤拷⻉构造完成。
  4. 像日期类这样的类成员变量全是内置类型且没有指向什么资源,编译器⾃动⽣成的拷⻉构造就可以完成需要的拷⻉,所以不需要我们显⽰实现拷⻉构造。如果⼀个类显示实现了析构并释放资源,那么他就需要显示写拷贝构造,否则就不需要。
class Person//建一个关于人的类
{
public:Person(){_name = 'x';_height = 190;_weight = 80;}Person(const Person& p){_name = p._name;_weight = p._weight;_height = p._height;}Person(const Person* p){_name = p->_name;_weight = p->_weight;_height = p->_height;}void Print(){cout << _name << "/" << _height << "/" << _weight << endl;}
private:char _name;//名字int  _height;//身高int  _weight;//体重
};
int main()
{Person p;Person p1('x', 190, 90);Person p2(&p1);// 这⾥可以完成拷⻉,但是不是拷⻉构造,只是⼀个普通的构造Person p3(p1);//这样写才是拷⻉构造,通过同类型的对象初始化构造,⽽不是指针Person p4 = p1; // 也可以这样写,这⾥也是拷⻉构造return 0;
}

4.赋值运算符重载

4.1运算符重载

  1. 当运算符被⽤于类类型的对象时,C++语⾔允许我们通过运算符重载的形式指定新的含义。C++规定类类型对象使⽤运算符时,必须转换成调⽤对应运算符重载,若没有对应的运算符重载,则会编译报错。

  2. 运算符重载是具有特名字的函数,他的名字是由operator和后⾯要定义的运算符共同构成。和其他函数⼀样,它也具有其返回类型和参数列表以及函数体
    3.重载运算符函数的参数个数和该运算符作⽤的运算对象数量⼀样多。⼀元运算符有⼀个参数,⼆元运算符有两个参数,⼆元运算符的左侧运算对象传给第⼀个参数,右侧运算对象传给第⼆个参数。

  3. 注意这5个运算符不能重载在这里插入图片描述

  4. 重载++运算符时,有前置++和后置++,运算符重载函数名都是operator++,⽆法很好的区分。C++规定,后置++重载时,增加⼀个int形参,跟前置++构成函数重载,⽅便区分。

4.2赋值运算符重载

赋值运算符重载是⼀个默认成员函数,⽤于完成两个已经存在的对象直接的拷⻉赋值,这⾥要注意跟拷⻉构造区分,拷⻉构造⽤于⼀个对象拷⻉初始化给另⼀个要创建的对象。
赋值运算符重载的特点:

  1. 赋值运算符重载是⼀个运算符重载,规定必须重载为成员函数。赋值运算重载的参数建议写成const 当前类类型引⽤,否则会传值传参会有拷贝
  2. 有返回值,且建议写成当前类类型引⽤,引⽤返回可以提⾼效率,有返回值⽬的是为了⽀持连续赋值场景。

拷贝构造函数和赋值运算符重载的区别

  • 拷贝构造函数是一种特殊的构造函数,用于创建一个新对象,这个新对象是另一个同类对象的副本。在以下情况会被调用:用一个已存在的对象初始化一个新对象,如 ClassA newObj(oldObj); 。
  • 复制运算符重载是对赋值运算符( = )的重新定义。用于将一个对象的值复制到另一个已存在的对象中,像 obj1 = obj2; 这种情况会调用复制运算符重载。

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

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

相关文章

从0开始学习机器学习--Day20--优化算法的思路

确定执行的优先级(Prioritizing what to work on : Spam classification example) 在建立学习系统前&#xff0c;我们不仅要梳理框架&#xff0c;更重要的是我们要弄清楚有哪些事情是要优先做的&#xff0c;这可以帮我们节约大量的时间。 以垃圾邮件为例&#xff0c;按照之前…

利用JS实现图片轮播(示例)

我们平时在逛购物网站的时候会看到页面内的商品图片自动轮播&#xff0c;二要想实现着中效果应该如何做呢&#xff1f;下面详细讲解代码的运用&#xff0c;实现下面视频的效果。大家也可以自己试试看&#xff0c;或者复制最后的完整代码运行一下&#xff01; 图片自动轮播效果 …

关于99.9% 达成读码率方案

1.标签样式 2.尺寸大小 长30mm*宽30mm 至 长40mm*宽40mm ; 3.位置 标签位置在箱体中间,可以误差5mm; 4.质量要求 ①无遮挡,标签不允许任何介质在上面,尤其是塑料片 ②平整,必须和箱子壁贴平,不允许翻边,飘荡。 ③码不能有模糊,手机摄像头扫码可以…

w~视觉~合集20~SAM

我自己的原文哦~ https://blog.51cto.com/whaosoft/12500982 #SAM 今天&#xff0c;Meta发布史上首个图像分割基础模型SAM&#xff0c;将NLP领域的prompt范式引进CV&#xff0c;让模型可以通过prompt一键抠图。网友直呼&#xff1a;CV不存在了! 就在刚刚&#xff0c;Meta AI…

三、直流有刷电机H桥驱动原理

1、H桥简介 H桥驱动电路&#xff1a;是一种用于控制直流电机正反转及速度的电路&#xff0c;其名称来源于其电路结构类似于字母“H”。H桥驱动电路由四个开关元件&#xff08;如晶体管、MOSFET等&#xff09;组成&#xff0c;这些开关元件被配置成可以控制电机两端电流的方向&…

Leetcode刷题

题目如下&#xff1a; 这道题呢&#xff0c;这里我写出了两种解决办法&#xff0c;一种遍历链表来得出中间结点&#xff0c;一种通过快慢指针来得出中间结点 第一种&#xff1a; 遍历&#xff1a; 首先我们设置一个计数器count&#xff0c;来记录链表的长度&#xff0c;写一…

游戏开发--C#面试题

游戏开发--C#面试题 C#1. 值类型和引用类型的区别2. 重载和重写的区别3. ArrayList和List的区别4. List底层是什么实现的&#xff1f;5. 抽象类和接口的区别6. 静态成员和⾮静态成员的区别7. 装箱和拆箱是指什么&#xff1f;8. 值和引用类型在变量赋值时的区别是什么&#xff1…

# 设置ubuntu为中文后,如何保留用户家目录等文件夹名为英文

设置ubuntu为中文后&#xff0c;如何保留用户家目录等文件夹名为英文 一、问题描述&#xff1a; 当我们安装完ubuntu系统后&#xff0c;通过【系统设置】&#xff0c;在【语言支持】里&#xff0c;设置为【汉语&#xff08;中国&#xff09;】&#xff0c;这时在终端中显示文…

STM32—独立看门狗(IWDG)和窗口看门狗(WWDG)

概述&#xff1a; WDG(Watchdog) 看门狗&#xff0c;看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能计时复位程序&#xff0c;避免程序陷入长时间的罢工状态&#xff0c;保证系…

Chrome与火狐哪个浏览器的性能表现更好

在数字时代&#xff0c;浏览器是我们日常生活中不可或缺的工具。无论是工作、学习还是娱乐&#xff0c;一个好的浏览器都能显著提高我们的效率和体验。市场上有许多优秀的浏览器&#xff0c;其中Google Chrome和Mozilla Firefox无疑是最受欢迎的两款。本文将比较这两款浏览器的…

现在国内优秀的广告联盟有哪些?

广告联盟是网络广告效果营销的主流方式之一&#xff0c;广告联盟的变现方式多种多样&#xff0c;主要有以下四种 CPA&#xff1a;按照下载或者注册进行付费&#xff08;软件平台或游戏试玩平台&#xff09;CPS&#xff1a;按照成交进行付费&#xff08;淘宝客&#xff09;CPM&…

机器学习,生成式AI ,LLM大模型,人工智能,他们之间的关系是什么?有什么不同?

这些概念都是现代计算机科学和人工智能领域的重要组成部分&#xff0c;它们之间既有联系&#xff0c;也有区别。以下是它们的关系和不同之处&#xff1a; 人工智能 (AI) 两个回答 人工智能是一个广义的概念&#xff0c;指的是计算机系统能够执行通常需要人类智能才能完成的任务…

[全网最细数据结构完整版]第七篇:3分钟带你吃透队列

目录 1->队列的概念及结构 2->队列的实现 2.1定义队列基本结构 struct QueueNode 和 struct Queue 2.2队列初始化函数 QueueInit 函数 2.3队列销毁函数 QueueDestroy 函数 2.4队列插入数据函数 QueuePush 函数 2.5判断队列是否为空,空返回true,非空返回false 2.6队列删…

点阵数显驱动IC数显LED驱动芯片VK1651

产品品牌&#xff1a;永嘉微电/VINKA 产品型号&#xff1a;VK1651 封装形式&#xff1a;SOP16 产品年份&#xff1a;新年份 产品简介&#xff1a;VK1651是一种带键盘扫描电路接口的 LED 驱动控制专用芯片&#xff0c;内部集成有数据锁存器、LED 驱动、键盘扫描等电路。SEG脚…

【进阶】java基础之集合(2)数据结构<树>

文章目录 二叉树的内部结构二叉查找树平衡二叉树平衡二叉树的旋转机制 二叉树的内部结构 二叉查找树 二叉查找树&#xff0c;又称二叉排序树或者二叉搜索树 特点: 每一个节点上最多有两个子节点任意节点左子树上的值都小于当前节点任意节点右子树上的值都大于当前节点 二叉…

积分接口被刷爆,全体一个月降薪20%,这个项目我们遗漏了什么?

有一些往事总是会在酒后提起 我问朋友&#xff0c;在工作上有什么事情是到现在还记忆尤新的&#xff1f; 我朋友一个激灵坐起来&#xff0c;点上一支烟&#xff0c;只见烟头亮了4、5下&#xff0c;才见他吐出一口烟来&#xff0c;说道&#xff1a;“那还真有” 起因 刚参加…

AWTK-LINUX-FB实现多点触摸

两周前的一个地图&#xff0c;需要做手势缩放的功能&#xff0c;比较忙就没有发出来&#xff0c;这次抽时间记录一下实现的过程。 AWTK官方有对实现多点触摸做过描述&#xff0c;可惜只有STM32的实现例子&#xff0c;跟Linux的差别还是比较大的&#xff0c;好在tslib有多点触摸…

NRF52832学习笔记(41)——添加串口库libuarte

一、背景 由于板子上不支持硬件流控&#xff0c;在使用 app_uart_fifo 库接收串口大数据时&#xff0c;频繁报 APP_UART_COMMUNICATION_ERROR 错误&#xff0c;多次重新初始化后&#xff0c;串口也不再产生中断了。查看官方论坛后决定使用串口异步库 libuarte。 二、简介 Li…

ORU 的 Open RAN 管理平面 (M 平面)

[TOC](ORU 的 Open RAN 管理平面 (M 平面)) ORU 的 Open RAN 管理平面 (M 平面) https://www.techplayon.com/open-ran-management-plane-m-plane-for-open-radio-unit/ ORU M 平面 在 ORAN 中&#xff0c;设置参数的 O-RU 管理功能是通过 M-Plane 完成的。管理功能包括 O-…

MQ的基础知识

一.什么是MQ 其实就是不同的程序之间的一种的通信方式,通过将消息发送到中间件里面然后中间件就会将这个消息发送给相应的服务进行一个消息的消费,这个时候就会进行一些的业务逻辑的处理,这个方式提高了整个系统的可靠性,拓展性以及灵活性.常见的类型为Aapache Kafaka&#xf…