浅谈类的六个默认成员函数和隐含的this指针

       今天简单的浅谈一下关于类和对象的一些基础认识!

     类的六个默认成员函数:构造函数、拷贝构造、析构函数、赋值运算符重载、取地址操作符重载和const修饰的取地址操作符重载。

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

class Date
{
public:
	//构造函数
	//无参的构造函数
	/*Date()
	{
	}*/
	//带有缺省值的
	Date(int year = 1990, int month = 10, int day = 10)
	{
		_year = year;
		_month = month;
		_day = day;
	}
Date(int year = 1990, int month = 10, int day = 10)//参数初始化列表
		:_year(year)
		, _month(month)
		, _day(day)
	{
	

private:

	int _year;
	int _month;
	int _day;
};


初始化顺序
1、每个成员在初始化列表中只能出现一次。(为什么?)
2、初始化列表仅用于初始化数据成员,并不指定这些数据
成员的初始化顺序,
数据成员在类中定义顺序就是在参数列表中的初始化
顺序。
3、尽量避免使用成员初始化成员,成员的初始化顺序最好
和成员的定义顺序保持一致。

类中包含以下成员必须要放在初始化列表中初始化:
1、引用数据成员
2、const数据成员
3、类类型成员(该类没有缺省的构造函数)

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

构造函数作用:
1、构建对象
2、初始化对象
3、类型转换

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

class Date
{
public:

	Date(int year = 1990, int month = 10, int day = 10)
		:_year(year)
		, _month(month)
		, _day(day)
	{
	
	}
	//拷贝构造函数
	Date(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}

private:

	int _year;
	int _month;
	int _day;
};

特别注意:拷贝构造的参数一定是传引用,否则会造成无限递归。


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

使用场景
1、对象实例化对象
Date d1(1990, 1, 1);
Date d2(d1);
2、传值方式作为函数的参数
void FunTest(const Date date)
{}
3、传值方式作为函数返回值
Date FunTest()
{
Date date;
return date;
}

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

class Date
{
public:

	Date(int year = 1990, int month = 10, int day = 10)
		:_year(year)
		, _month(month)
		, _day(day)
	{
	
	}
	//拷贝构造函数
	Date(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
	//析构函数  这里简单的为大家看一下它的原理,如果有指针,则将它置空,开辟空间则将其释放
	~Date()
	{
		_year = 0;
		_month = 0;
		_year = 0;
	}
private:

	int _year;
	int _month;
	int _day;
};


特性
 a、析构函数在类名(即构造函数名)加上字符~。
 b、析构函数无参数无返回值。
 c、一个类有且只有一个析构函数。若未显示定义,系统会自动生成缺省的析构函数。
 d、对象生命周期结束时,C++编译系统系统自动调用析构函数。
 e、注意析构函数体内并不是删除对象,而是做一些清理工作。

    赋值运算符重载:

Date& operator=(const Date& d)
	{
		if (this != &d)//这里是为了防止自己给自己赋值以及可以进行连续赋值
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}
		return *this;
	}

    隐含的this指针:

    注意:
     this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递,类编写者不能显式传递。
     this指针指向的是对象本身,所以在全局函数以及静态函数中都不能使用this指针。 
      this指针只有在成员函数中才有定义。因此,获得一个对象后,也不能通过对象使用this指针。所以,我们无法知道一个对象的this指针的位置。但是,在成员函数中,我们是可以知道this指针的位置的。(&this)

我们拿类的拷贝构造函数为例:
拷贝构造函数
	Date(const Date& d)//编译器会将它转化为  Date(Date *const this,const Date& d)
	{
		_year = d._year;//this->_year=d._year
		_month = d._month;//this->_month = d._month;
		_day = d._day;//this->_day = d._day;
	}
	{
		_year = d._year;//this->_year=d._year
		_month = d._month;//this->_month = d._month;
		_day = d._day;//this->_day = d._day;
	}

__thiscall调用约定:
a、__thiscall只能够用在类的成员函数上。
a、参数从右向左压栈。
b、如果参数个数确定,this指针通过ecx传递给被调用者;如果参数不确定,this指针在所有参数被压栈后压入堆栈。
c、对参数个数不定的,调用者清理堆栈,否则函数自己清理堆栈。






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值