C++ this指针和构造函数(-)

来源:互联网 发布:mac 退出dashboard 编辑:程序博客网 时间:2024/05/18 02:03
 
/一.this 指针:

特点:
        this指针的类型是: 类类型*const
        this指针并不是对象本身的一部分,不影响sizeof的结果
        只能在成员函数中用(后面还有补充)
         this指针式类成员函数的第一个默认隐含参数,编译器自动维护传递~
classDate
{
public:
     voidSetDate(intyear,intmonth,intday)
     {
          _year = year;
          _month = month;
          _day = day;
     }
     voidPrintDate()
     {
          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
intmain()
{
     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;
     return0;
}
//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;//}



0 0
原创粉丝点击