构造函数
一提到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关键字类内部的构建声明上,在类的定义体外部的定义上不再重复。
说的已经差不多了 ,以后要是有什么没有想到的再来补充吧 ,或者要是写的有什么问题,大家可以提出来;;;