C++类中的六个默认函数(一)

       对于一个类的实例来说,你可以看到它的成员函数、成员变量,然而实例本身呢?this是一个指针,它时时刻刻指向这个实例。

一、this指针的特性:

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

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

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

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

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

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


二、类的6个默认函数


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

(它的功能由用户定义,在类对象进入作用域时间调用构造函数)

class CDate
{
public:
   CDate()
   { }
   CDate( const int year, const int month, const int day)
   {
      _iYear = year;
      _iMonth = month;
      _iDay = day;
   }
private:
int _iYear;
int _iMonth;
int _iDay;
};

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

(2)没有返回值。

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

(4)新对象被创建,由编译器自动调用,且在对象的生命期内仅调用一次。

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

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

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

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

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

关于初始化列表:


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

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

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

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

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

【默认构造函数】

类如果没有显式定义构造函数时,编译器会合成一个默认的构造函数,该构造函数中什么工作都不做。只要显式定了,即使该构造函数什么也不做,编译器也不会为该类合成默认的构造函数。编译器生成的默认构造函数使用与变量初始化相同的规则来初始化成员,具有类类型的成员通过运行各自的默认构造函数来进行初始化。内置和复合类型的成员如指针、数组,只对定义在全局作用域中的对象初始化,当对象定义在局部作用域时,内置和符合类型的成员不进行初始化。在某些情况下,默认构造函数是由编译器隐式使用的。

构造函数作用:构建对象;初始化对象;类型转换(构造函数只能为单参)

explcit】(显而易见的,显式的)

explicit修饰构造函数,抑制由构造函数定义的隐式转换,explicit关键字类内部的构建声明上,在类的定义体外部的定义上不再重复。

2、拷贝构造函数:

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


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

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

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

【特征】

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

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

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


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

【特性】

a、析构函数在类名(即构造函数名)加上字符~。

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

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

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

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

class CArray
{
public:
  CArray(size_t capacity) : _capacity(capacity)
{
    _pData = ( int*)malloc(capacity*sizeof (int));
    _size = 0;
}
~CArray()
{
    if (NULL != _pData)
   {
    free(_pData);
    _pData = NULL;
    }
_size = 0;
_capacity = 0;
}
private:
int* _pData;
size_t _size;
size_t _capacity;
};





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值