类和对象 中

目录

类的6个默认成员函数

​编辑

构造函数

特征

析构函数

特性

拷贝构造函数

特征

赋值运算符重载

运算符重载

赋值运算符重载

前置++和后置++重载

const成员

分析

思考

取地址符&重载

输入输出流<<  >>重载

日期类实现


类的6个默认成员函数

默认成员函数:用户没有显示显现,编译器会自己生产的成员函数为默认成员函数

构造函数

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

构造函数时初始化对象而不是开辟空间

特征

1.函数名与类名相同

2.无返回值

3.对象实例化时编译器自动调用对应的构造函数

4.构造函数可以重载

注意:为区别调用构造函数还是函数,调用无参函数对象后面不用带括号

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

6.默认生成构造函数,内置类型成员不做处理,自定义类型会去调用它的构造函数

7.内置类型成员变量在类中声明时可以给默认值

8.可以不传参调用的构造函数都可以叫默认构造

析构函数

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

特性

1.析构函数名是在类名前加上~

2.无参无返回值

3.一个类只能有一个析构函数,若未显式定义,系统会自动生成默认的析构函数,析构函数不能重载

4.在对象生命周期结束时,编译器会自动调用析构函数

5.对自定义成员调用析构函数,内置成员不调用析构函数,直接由系统回收即可

6.如果类中没有申请资源,析构函数可以不写,直接使用编译器默认生成的析构函数

拷贝构造函数

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

特征

1.拷贝构造时构造函数的一种重载形式

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

3.若未显式定义,编译器会生成默认的拷贝构造函数,按内存储存按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝

内置类型完成值拷贝

自定义类型成员会调用这个成员的拷贝构造

4.类中如果没有涉及到资源申请,拷贝函数是否写都可以;一旦涉及到资源申请时,一定要写拷贝构造函数,否则就是浅拷贝,例入栈,如果不写拷贝构造,拷贝出来的栈还在用之前的空间

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

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

2.函数参数类型时类类型对象

3.函数返回值类型时类类型对象

赋值运算符重载

运算符重载

函数名:关键字operator+操作符

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

注意:

1.不能通过连接其他符号来创建新的操作符:operator@

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

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

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

5.  .*    ::    sizeof       ?:      . 注意以上5个运算符不能重载。

赋值运算符重载

格式:

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

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

检测是否自己给自己赋值

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

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

赋值运算符重载成全局函数,注意全局函数没有this指针,要给两个参数

用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。注
意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类的赋值运算符
重载完成赋值
如果类中未涉及到资源管理,赋值运算符是否实现都可以;一旦涉及到资源管理则必
须要实现。

前置++和后置++重载

后置++需要在参数中添加一个int

前置++:返回+1之后的结果
 注意:this指向的对象函数结束后不会销毁,故以引用方式返回提高效率

注意:后置++是先使用后+1,因此需要返回+1之前的旧值,故需在实现时需要先将this保存
一份,然后给this+1
而temp是临时对象,因此只能以值的方式返回,不能返回引用

const成员

将const修饰的成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针表明再该成员函数中不能对类的任何成员进行修改

分析

下面我们看两个函数

const修饰的对象会调用const修饰的成员函数

如果我们屏蔽掉const修饰的函数就会报错

但如果我们屏蔽掉不加const修饰的函数

程序正常执行

这里说明对象调用函数会优先调用最佳匹配的成员函数,权限可以缩小,但是不可以放大

思考

1. const对象可以调用非const成员函数吗? 不可以,权限放大了
2. 非const对象可以调用const成员函数吗? 可以,权限缩小
3. const成员函数内可以调用其它的非const成员函数吗? 不可以
4. 非const成员函数内可以调用其它的const成员函数吗? 可以

取地址符&重载

这两个运算符一般不需要重载,使用编译器默认生成的即可,除非想让别人获得指定的内容

输入输出流<<  >>重载

流本质是为了解决自定义类型的输入和输出问题

friend友元,friend修饰的成员函数可以访问类的私有变量

日期类实现

http://t.csdnimg.cn/Y7fUb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值