C++学习笔记——类与对象(六个默认成员函数)

2023-09-21 13:05:28

1、构造函数

        在一个类中,编译器会自动生成默认的成员函数,当对象进行初始化时,会默认调用这个函数来初始化。

        构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证 每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。

它的特点是:

        没有返回值

        系统自动调用

        构造函数可以重载

        名字和类名一致

class Date(){

public:
    //全缺省构造函数
    Date(int x = 1){};

private:
    int year;

};

int main()
{
    
Date d(1);

return 0;
}

同时,这些默认成员函数,只要用户自己定义了,那么系统将不会进行自动生成了。

2、析构函数

当我们一个对象完成任务后,最后还要回收系统,也就是还需要释放空间,销毁对象。对于局部变量的销毁,一般是有编译器完成。但是对象的销毁却是由析构函数来完成的。

        同样,析构函数也是默认成员函数,当我们对象结束以后,系统会自动调用来销毁对象。

对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。

析构函数的特性:

        无参无返回值   

        对象生命周期结束时,系统自动调用

        名字为类名前面加~   格式为: ~类名(){}

        一个类只有一个析构函数,如果用户没有自己定义,则系统会自动生成。同时析构函数不能构成重载

class Date(){

public:
    //全缺省构造函数
    Date(int x = 1){};

    //析构函数自己定义
    ~Date(){
    year = 0;
}

private:
    int year;

};

int main()
{
    
Date d(1);

return 0;
}

3、拷贝构造函数

在对象的创建过程中,我们有时候会需要将一个对象在复制一份。这时,我们就需要用到拷贝构造函数。

拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存 在的类类型对象创建新对象时由编译器自动调用。

同样,函数也会自动生成拷贝构造函数,完成拷贝工作。

拷贝构造函数的特性:

        拷贝构造是构造函数重载的一个形式

        拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错, 因为会引发无穷递归调用。

        如果没有显示定义,系统会自动默认生成,自动调用(默认的拷贝构造函数对象按内存存储按 字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。对于开辟空间的数组的拷贝,就只会拷贝数组的地址过去,导致两个变量指向同一片空间,可能会影响后续的操作

拷贝构造函数典型调用场景:

        使用已存在对象创建新对象

        函数参数类型为类类型对象

        函数返回值类型为类类型对象

4、赋值运算符重载

一、运算符重载

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其 返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。

函数名字为:关键字operator后面接需要重载的运算符符号。

函数原型:返回值类型+ operator+操作符+(参数列表)

需要注意的点:

        不能使用operator来创建新的运算符,比如operator@就是错误的

        重载操作符必须有一个类类型参数

        用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义

        作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐 藏的this

        .*   ::   sizeof   ?:   .   注意以上5个运算符不能重载。这个经常在笔试选择题中出现。

bool operator==(const Date& d1, const Date& d2)
{
    return d1._year == d2._year
   && d1._month == d2._month
        && d1._day == d2._day;
}
 // bool operator==(Date* this, const Date& d2)
    // 这里需要注意的是,左操作数是this,指向调用函数的对象
    bool operator==(const Date& d2)
 {
        return _year == d2._year;
            && _month == d2._month
            && _day == d2._day;
 }

二、赋值运算符重载

        赋值运算符重载格式

        参数类型:const T&,传递引用可以提高传参效率

        返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值

        检测是否自己给自己赋值

        返回*this :要复合连续赋值的含义

2.赋值运算符只能重载成类的成员函数不能重载成全局函数

3.用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。注 意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类的赋值运算符 重载完成赋值。

4.前置++和后置++重载

前置++是先返回++之后的值,因为+1后,值不会改变,能传引用返回,效率更高。

后置++,因为是先返回本身,再+1,因此在实现过程中,需要先创建一个临时对象存储。

// 前置++:返回+1之后的结果
 // 注意:this指向的对象函数结束后不会销毁,故以引用方式返回提高效率
 Date& operator++()
 {
 _day += 1;
 return *this;
 }
 // 后置++:
 // 前置++和后置++都是一元运算符,为了让前置++与后置++形成能正确重载
 // C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器
自动传递
 // 注意:后置++是先使用后+1,因此需要返回+1之前的旧值,故需在实现时需要先将this保存
一份,然后给this+1
 //       而temp是临时对象,因此只能以值的方式返回,不能返回引用
 Date operator++(int)
 {
 Date temp(*this);
 _day += 1;
 return temp;
 }

更多推荐

【计算机毕业设计】基于SpringBoot+Vue网络云端日记本系统的设计与实现

博主主页:一季春秋博主简介:专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容:毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题库、技术咨询。🍅文末获取联系🍅精彩专栏推荐订阅👇🏻👇🏻不然下次找不到哟Sp

C#回调函数学习1

回调函数(CallbackFunction)是一种函数指针,它指向的是由用户自己定义的回调函数。我们将这个回调函数的指针作为参数传递给另外一个函数,在这个函数工作完成后,它将通过这个回调函数的指针来回调通知调用者处理结果。此定义来自网上;看一个例子;这是用委托实现的回调函数;usingSystem;usingSyste

懒人福音!数据显示:剧烈运动5分钟即可预防癌症,风险降低30%

剧烈的间歇性生活方式体育活动,简称VILPA,是由悉尼大学查尔斯·珀金斯中心的研究人员创造的,用来描述我们每天津津有味地进行的非常短暂的活动爆发,每次大约一分钟。这包括剧烈的家务、在杂货店周围大量购物、爆发力量行走或与孩子们玩高能量游戏等活动。早在,2022年12月8日,澳大利亚悉尼大学、英国伦敦大学的研究人员在Nat

ipv6笔记及总结

1、路由器请求消息RouterSolicitation和路由器通告RouterAdvertisement消息主要用于无状态地址的情况下,有状态的情况使用的是dhcpv6server分配(例如:IPv6地址以及其他信息(DNS、域名等))。2、关于IPv6自动配置及M、O比特的小结那么对于自动配置来说,主机在什么情况下,

25 WEB漏洞-XSS跨站之原理分类及攻击手法

目录XSS跨站漏洞产生原理,危害,特点?本质产生层面函数类漏洞操作对应层,危害影响浏览器内核版本等XSS跨站漏洞分类:反射,存储,DOMXSS常规攻击手法:平台,工具,结合其他等演示案例:XSS平台及工具简要演示测试XSS跨站漏洞产生原理,危害,特点?本质跨站跟我们语言上面是没有什么关系,大部分都是前端的一个漏洞在变量

ChatGPT企业版来了,速度翻倍,无使用限制

美国时间8月28日,OpenAI宣布了自ChatGPT推出以来最重大的新闻:将推出ChatGPT企业版,企业版ChatGPT将直接对接GPT-4,提供无限制访问、高级数据分析功能、定制服务等服务,并支持处理更长文本输入的长上下文窗口。OpenAI首席运营官BradLightcap告诉媒体,这个工具已经在“不到一年”的时

logback日志是怎么保证多线程输出日志线程安全的

logback中的单例模式logback日志框架使用了单例设计模式来进行日志输出。在logback中,Logger类是一个关键的组件,它负责记录和输出日志消息。Logger类使用了单例设计模式,确保在一个应用程序中只存在一个Logger实例。这样做的好处是可以确保所有的日志消息都被集中到同一个日志输出器中,避免了多个日

无人机“长坡”上,谁是滚出“厚雪球”的长期主义者?

“股神”巴菲特,曾提出过“长坡厚雪”的理论:人生就像滚雪球,重要的是发现很湿的雪和很长的坡。运用到企业经营上,“长坡”指的是企业所布局的领域发展潜力足、空间大;而“湿雪”,指的是企业竞争力强、有长期主义精神。将湿雪沿着长坡不断滚成厚雪球,就能收获长期主义的复利。就当下来看,在众多领域当中,无人机属于典型的“长坡”。全球

《时代》百大AI人物榜单公布,李彦宏、Sam Altman、黄仁勋等评为全球AI领袖

9月7日晚,《时代》周刊发布了首届全球百大AI人物。这100个人组成的群体在很多方面都是推动人工智能发展的关系和权力中心的地图。他们是竞争对手和监管者、科学家和艺术家、倡导者和高管——既竞争又合作的人类,他们的洞察力、欲望和缺陷将塑造这个影响力日益增强的技术的方向。”“人工智能的独特之处也是最令人恐惧和值得庆祝的地方,

生产消费者模型的介绍以及其的模拟实现

目录生产者消费者模型的概念生产者消费者模型的特点基于阻塞队列BlockingQueue的生产者消费者模型对基于阻塞队列BlockingQueue的生产者消费者模型的模拟实现ConProd.c文件的整体代码BlockQueue.h文件的整体代码对【基于阻塞队列BlockingQueue的生产者消费者模型的模拟实现】的测试

openGauss学习笔记-70 openGauss 数据库管理-创建和管理普通表-查看表数据

文章目录openGauss学习笔记-70openGauss数据库管理-创建和管理普通表-查看表数据70.1查询数据库所有表的信息70.2查询表的属性70.3查询表的数据量70.4查询表的所有数据70.5查询字段的数据70.6过滤字段的重复数据70.7查询字段为某某的所有数据70.8按照字段进行排序openGauss学习

热文推荐