C++ :类中的几个默认的函数及其特点

一、. 类中的几个默认的函数及其特点

默认的函数及其特点:不提供,系统提供;自己提供 ,系统不提供

1.构造函数

定义:是一个特殊的成员函数,名字与类名相同,创建类 类型对象时,由编译器自动调用,在对象的生命周期内有且只调用一次,以保证每个数据成员都有一个合适的初值。(它的功能由用户定义,在类对象进入作用域时间调用构造函数)。

(1)函数名与类名相同--不能任意命名,否则编译器就不知道它是构造函数

(2)没有返回值。

(3)有初始化列表(可以不用,按变量声明的顺序来初始化)--一般声明为public

(4)新对象被创建,由编译器自动调用,且在对象的生命期内仅调用一次。构造函数不依赖对象调动,且不能手动调动,否则因为第一个对象无法生成;

(5)构造函数可以重载,实参决定了调用那个构造函数。

(6)如果没有显式定义时,编译器会提供一个默认的构造函数。

(7)无参构造函数和带有缺省值得构造函数都认为是缺省构造函数,并且缺省构造函数只能有一个。

(8)构造函数不能用const来修饰,因为const修饰的是this指针,加上const之后就无法对对象的值进行赋值。

(9)构造函数不能用static修饰,因为静态函数没有this指针。

在构造函数体内可以使用this指针,在初始化列表中不能使用this指针。因为在初始化列表阶段还不知道对象的成员如何布局,因此无法访问。

类中包含以下成员时必须要在初始化列表中初始化:

(1)引用数据成员:因为引用必须在定义时初始化,且不可重新赋值。

(2)const数据成员:因为它必须初始化,不能赋值。

(3)类类型成员(该类没有缺省的构造函数,有构造函数):因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化。

2.析构函数

析构函数:与构造函数功能相反,在对象被销毁时,由编译器自动调用,完成类的一些资源清理和结尾工作。

特性:

a、析构函数在类名(即构造函数名)加上字符~,析构函数不能重载;有this指针;

b、析构函数无参数无返回值。

c、一个类有且只有一个析构函数。若未显示定义,系统会自动生成缺省的析构函数。

d、对象生命周期结束时,C++编译系统系统自动调用析构函数。也可以手动调用。

e、注意析构函数体内并不是删除对象,而是做一些清理工作。

3.拷贝构造函数

 

只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰:拷贝构造函数无限递归穷,导致栈溢出),这样的构造函数称为拷贝构造函数。拷贝构造函数是特殊的构造函数,创建对象时使用已存在的同类对象来进行初始化,由编译器自动调用。

以下情况都会调用拷贝构造函数:

1.一个对象以值传递的方式传入函数体或从函数返回

2.一个对象需要通过另外一个对象进行初始化

特征:

1、它是构造函数的重载。

2、它的参数必须使用同类型对象的引用传递。因为对象以值传递的方式进入函数体就会调用拷贝构造函数,这样就会形成无限递归。

3、如果没有显式定义,系统会自动合成一个默认的拷贝构造函数。默认的拷贝构造函数会依次拷贝类的数据成员完成初始化。

 

4.赋值运算符的重载函数

     https://blog.csdn.net/if9600/article/details/64472313

 重载操作符是具有特殊函数名的函数,关键字operator后面接需要定义的操作符符号。操作符重载也是一个函数,具有返回值和形参表。它的形参数目与操作符的操作数目相同,函数调用操作符可以接受任意数目的操作数。使用运算符重载可以提高代码的可读性。

返回类型  operate  操作符 (参数列表)

不可以被重载的操作符有:

成员选择符(.            成员对象选择符(.*

域解析操作符(::       条件操作符(?:

(除了赋值号=之外,基类中被重载的操作符都将被派生类继承)

1、不能通过连接其他符号来创建新的操作符:比如operator@;void operator @(){}

2、重载操作符必须有一个类 类型或者枚举类型的操作数

3、用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不能改变其含义

4、不再具备短求值 特性重载操作符不能保证操作符的求值顺序,在重载&&和||中,对每个操作数都要进行求值,而且对操作数的求职顺序不能做规定,因此:重载&&、||和逗号操作符不是好的做法--重载后不能改变运算符的操作对象的个数以及其原有的优先级

5、作为类成员的重载函数,其形参看起来比操作数数目少1是因为成员函数的操作符有一个默认的形参this,限定为第一个形参。

6、???一般将算术操作符定义为非成员函数,将赋值运算符定义成员函数

7、操作符定义为非类的成员函数时,一般将其定义为类的友元

8、== != 操作符一般要成对重载

9、下标操作符[]要重载两次:一个非const成员并返回引用,一个是const成员并返回引用

10、解引用操作符*和->操作符,不显示任何参数

11、自增自减操作符前置式++/--必须返回被增量或者减量的引用后缀式操作符必须返回旧值,并且应该是值返回而不是引用返回

12、输入操作符>>和输出操作符<<必须定义为类的友元函数(重载为类的成员函数不合理,调用时会与逻辑相反:a<<out;)

5.取地址操作符的重载函数

6.const修饰的取地址操作符的重载函数

关于const修饰类成员:

1、const修饰形参,一般和引用同时使用

2、const修饰返回值

3、const修饰类数据成员,必须在构造函数的初始化列表中初始化

4、const修饰类成员函数,实际修饰隐含的this,表示在类中不可以对类的任何成员进行修改

5、在const修饰的成员函数中要对类的某个数据成员进行修改,该数据成员定义声明是必须加mutable关键字

 const对象不可以调用非const成员函数。

非const对象可以调用非const成员函数和const成员函数 。

const成员函数内可以调用其它的const成员函数。

非const成员函数内可以调用其它的const成员函数非const成员函数。

void FunTest()与void FunTest()const在类中构成函数重载,因为const修饰的是this指针,因此这两个函数的参数列表不同。

6.this指针

一、this指针的特性:

1、this指针的类型 : 类类型* const

2、this指针并不是对象本身的一部分,不影响sizeof的结果。

3、this的作用域在类成员函数的内部。

4、this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递,类编写者不能显式传递。

5、只有在类的非静态成员函数中才可以使用this指针,其它任何函数都不可以。

6、如果参数个数确定,this指针通过寄存器ecx传递给被调用者,如果参数个数不确定,this指针在所有参数被压栈后压入堆栈

用法:

一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值