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

 
/一.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;
//}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值