c++::让你足够了解构造函数和this指针

来源:互联网 发布:前端软件外包交易平台 编辑:程序博客网 时间:2024/06/06 04:38

一、  this指针

【特性】
1、this指针的类型 类类型*const(类名*const,为右值
2、this指针并不是对象本身的一部分,不影响sizeof的结
果。
3、this的作用域在类成员函数的内部。
4、this指针是类成员函数的第一个默认隐含参数,编译
器自动维护传递,类编写者不能显式传递。
5、只有在类的非静态成员函数中才可以使用this指针,
其它任何函数都不可以

6. this指针本身不占用大小,它并不是对象的一部分,因此不会影响sizeof的结果。

 

【_thiscall约定】

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

【补充小结】

1)this指针时刻指向对象

2)是类成员函数第一个默认的隐含参数

3)引用和this:

因为引用的类型也是类名*const 所以其实引用也可以做到

4)this指向空时,是不会指向对象的

二、 构造函数

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

2、【构造函数特性】
1、函数名与类名相同。
2、没有返回值。
3、有初始化列表(可以不用)。
4、新对象被创建,由编译器自动调用,且在对象的生命期
内仅调用一次。
5、构造函数可以重载,实参决定了调用那个构造函数。
6、如果没有显式定义时,编译器会提供一个默认的构造函
数。
7、无参构造函数和带有缺省值得构造函数都认为是缺省构
造函数,并且缺省构造函数只能有一个。

3、【初始化列表】
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个数据成员后面跟一个放在园括号中的初始化式

 

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

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

4、构造函数为什么不能用const来修饰?

答:构造函数没有返回值,你定义const变成指向类本身,那么你对成员的赋值操作都是非法的,成员无法操作这个类无用

5、【默认构造函数】

类如果没有显式定义构造函数时,编译器会合成一个默认的构造函数,该构造函数中什么工作都不做。只要显式定义了,即使该构造函数什么也不做,编译器也不会为该类合成默认的构造函数。

编译器生成的默认构造函数使用与变量初始化相同的规则来初始化成员,具有类类型的成员通过运行各自的默认构造函数来进行初始化。

内置和复合类型的成员如指针、数组,只对定义在全局作用域中的对象初始化,当对象定义在局部作用域时,内置和符合类型的成员不进行初始化。在某些情况下,默认构造函数是由编译器隐式使用的。

6、【构造函数作用】:
1、构建对象
2、初始化对象
3、类型转换
【explicit】
用explicit修饰构造函数,抑制由构造函数定义的隐式转换,explicit关键字类内部的构建声明上,在类的定义体外部的定义上不再重复

7、编译器会在需要的时候合成构造函数

1)A类包含B类,A类无,B类有缺省,则编译器会为A类合成一个构造函数

2)待续。。。

 

 

 

0 0