细说 class类中的this指针与 构造函数

构造函数

一提到C++就会不自觉的提到  class类  ,但是提到类时  就不得不说一下this指针 与 构造函数了 ,这是C++类中的两个很重要的知识点。如果不搞懂的话 ,那你的C++  class 就有一半都废了。所以说是重中之重也不为过。
下面就让我们来好好理理 这两个问题!!!

先说说this指针吧!

this指针

为什么  C++中要引入this指针这个概念呢 !!!
那就要考虑一个问题了  :
比如定义一个日期类Date
<span style="font-size:18px;">class Date 
{
public:
	Date(int year,int month,int day)
	{
		_year =year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
}</span>
如果要是对这个类定义实例化  ,(定义三个对象)
<span style="font-size:18px;">	Date d1(2016,9,26);
	Date d2(2016,9,26);
	Date d3(2016,9,26);</span>
要对d1 ,d2  ,d3 这三个日期类进行赋值时,该怎么来判断要放在那个地址呢!!!
说到这块  ,就要引出我们所说的this指针了 。。。

编译器在识别类时  要经历三个过程 :
1、识别类名 ;
2、识别类中的成员变量; 
3、识别函数 并对函数进行改写 (默认的为函数加上指针this参数)

在类中调用函数是就要通过this指针来保存这个类的地址 ,然后根据this指针提供的地址来对类成员变量进行操作。
this指针在C++类中的特性是:

1、this指针的类型   是   类类型 *const this;
2、this指针为 类成员函数的第一个默认隐式参数,编写者不能明确的传递;
3、this指针并不是类成员变量  ,所以不影响类的大小;
4、this指针的作用域仅限于类的内部;

在C++中类中调用函数 :
调用约定
如果使用的是__thiscall    ,则在内存中this指针的传递         使用的寄存器ecx传递的
要是使用的是_cdecl         ,则在内存中this指针的传递         使用的存储器传递


关于this指针的最后一个问题就是:
大家都知道在C++中有一个引用操作符,,,为什么在这块  不是this引用呢

这就是要说到C++的发展史了!!!!
C++在刚开始  ,又被叫做是带类的C   ,此时的C++中还没有引用这个概念   ,所以会使用的是this指针而不是引用。

另外 , 如果要是this指针为空是不能调用  类内的 成员变量   。。。

this指针说的差不多了
再来说说构造函数了吧

构造函数

 在C++类中有六个默认成员函数

他们分别是:
1、构造函数;
2、拷贝构造函数;
3、析构函数;
4、赋值操作符的重载;
5、取地址操作符的重载;
6、const修饰的取地址操作符的重载;

我们主要说说构造函数

构造函数特点:

1、名字必须与类名要相同;
2、没有返回值;
3、创建类对象时由编译器自动调用;
4、在类的对象周期内,构造函数只能调用一次;
5、可以重载的,根据参数的不同选择调用不同的构造函数;
6、如果没有显式的构造函数,系统会默认提供一个构造函数;
7、无参的构造函数与带缺省值的构造函数  都认为是带缺省值的构造函数,并且只能有一个。

构造函数的作用:

1、构建对象;
2、初始化对象;
3、类型转换(        形式  为Data    d = 2016  ;)(但是构造函数必须为单参);

构造函数可以有两种形式:

1、初始化列表
以一个冒号开始 ,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在园括号中的初始化式;
特点是:
(1)、每个成员在初始化列表中只能出现一次;
(2)、初始化列表仅用于初始化数据成员,并不指定这些数据成员的初始化顺序,
其实数据成员在类中定义顺序就是在参数列表中的初始化顺序。
(3)、尽量避免使用成员初始化成员,成员的初始化顺序最好和成员的定义顺序保持一致。

必须放在初始化列表中初始化的有:
1、成员变量为const类型;
2、引用变量;
3、子对象(子类无缺省构造函数);
举个例子吧!!!看着更舒服点
class Date 
{
public:
	Date(int year,int month,int day)
		:_year (year)
		,_month(month)
		,_day(day)
		,a (13)
		,ra(_year)
	{	}
private:
	int _year;
	int _month;
	int _day;
	int const  a;
	int &ra ;
};

2、对成员变量进行赋值

这种方法对有的特殊变量是不能赋值的只能通过初始化列表来;(就是必须放在初始化列表里的那些变量)
class Date 
{
public:
	Date(int year,int month,int day)
	{	_year =year;
		_month=month;
		_day =day;
	}
private:
	int _year;
	int _month;
	int _day;
};

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


说的已经差不多了  ,以后要是有什么没有想到的再来补充吧 ,或者要是写的有什么问题,大家可以提出来;;;























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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值