/一.this 指针:
特点:
this指针的类型是: 类类型*const
this指针并不是对象本身的一部分,不影响sizeof的结果
只能在成员函数中用(后面还有补充)
this指针式类成员函数的第一个默认隐含参数,编译器自动维护传递~
class
Date
{
public
:
void
SetDate(
int
year,
int
month,
int
day)
{
_year = year;
_month = month;
_day = day;
}
void
PrintDate()
{
cout<<_year<<
"-"
<<_month<<
"-"
<<_day<<endl;
}
private
:
int
_year;
int
_month;
int
_day;
};
转到反汇编:
_year = year;
00D91613 mov eax,dword ptr [this] //将this放入eax寄存器
00D91616 mov ecx,dword ptr [year]
00D91619 mov dword ptr [eax],ecx
_month = month;
00D9161B mov eax,dword ptr [this]
00D9161E mov ecx,dword ptr [month]
00D91621 mov dword ptr [eax+4],ecx
_day = day;
00D91624 mov eax,dword ptr [this]
00D91627 mov ecx,dword ptr [day]
00D9162A mov dword ptr [eax+8],ecx
int
main()
{
Date d1, d2, d3;
d1.SetDate(2016, 9, 25);
d2.SetDate(2016, 9, 26);
d3.SetDate(2016, 9, 24);
d1.PrintDate();
d2.PrintDate();
d3.PrintDate();
cout<<
sizeof
(Date)<<endl;
return
0;
}
//class Date
//{
//public:
// void SetDate( Date* const this,int year, int month, int day)//this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递, 类编写者不能显式传递。
//
//
// {
// this->_year = year;
// this->_month = month;
// this->_day = day;
// }
//private:
// int _year;
// int _month;
// int _day;
//}
_thiscall调用约定:
参数从右向左压栈
只能在类的成员函数上*/
//二
构造函数:
//定义:是一个特殊的成员函数,名字与类名相同,创建类类型对象时,由编译器自动调用,在对象的周期内只调用一次。
//特点:可以重载。
// 无返回值,
// 名字与类名相同
// 有初始化列表(可以不用,但是类里面的const和引用必须在初始化列表里面初始化!还有A类包含B类的对象,若B的对象不是缺省的构造参数,则也必须在初始化
// 列表里面初始化);
//构造函数可以重载
//class Data
//{
//public:
// Data()
// {
// }
// Data(int year,int month,int day)//构造函数可以重载
// {
// _year = year;
// _month = month;
// _day = day;
// }
// Data(int year,int month)//构造函数可以重载
// {
// _year = year;
// _month = month;
// }
//private:
// int _year;
// int _month;
// int _day;
//};
//void Fun()
//{
//
//}
//int main()
//{
//
// Data t1(2016,13,25);
// Data t2(2016,15);
// Data t3();
//
// return 0;
//}
//三
//初始化列表:
// 以一个冒号开始,接着是一个以逗号分隔的数 据成员列表,每个数据成员后面跟一个放在园括号中的初始化式。
//
//【初始化顺序】
// 1、每个成员在初始化列表中只能出现一次。
// 2、初始化列表仅用于初始化数据成员,并不指定这些数据
//成员的初始化顺序,
// 数据成员在类中定义顺序就是在参数列表中的初始化
//顺序。
// 3、尽量避免使用成员初始化成员,成员的初始化顺序最好
//和成员的定义顺序保持一致。//避免出错!
//初始化参数列表
//class Data
//{
//public:
// // Data ()
// // :_year(1),_month(2),_day(1)
// //
// //{
// // }
// Data (int year)
// :_year(1),_month(2),_day(1),ra(year)
//
// {
// }
//
// void PrintDate()
// {
// cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
// }
//private:
// int _year;
// int _month;
// //int _day;
// const int _day;//必须在构造函数基/成员初始值设定项列表中初始化
// int &ra;//必须在构造函数基/成员初始值设定项列表中初始化
//};
//void Fun()
//{
// Data t;
// t.PrintDate();
//
//}
//int main()
//{
// Fun();
// getchar();
// return 0;
//}