Lập trình

Lập trình

Thứ Sáu, 13 tháng 6, 2014

Con trỏ this , cách thức hoạt động ,...

// Những chú ý của con trỏ this trong class :
- Ta thấy với mọi phương thức thì đối đầu tiên truyền vào cho nó chinh là con trỏ this , con trỏ
 this này không tường minh .
- Con trỏ this chứa địa chỉ của một đối tượng thuộc kiểu class nào đó .
   Vd : Ten_lop doituong;
    Lúc này this == &doituong;


 Ta xét một ví dụ :

  #include<iostream>
//#include<graphics.h>
#include<math.h>

using namespace std;
/*struct Diem1{
float x;
float y;
float dodai(Diem1 d2);
float chuvitamgiac(Diem1 d2,Diem1 d3);
void nhap(){
cout << "Nhap toa do cua diem ";
cin >> x >> y;
}
};*/

class Diem{
private :
float x;
float y;
public :
float dodai(Diem d2);
float chuvitamgiac(Diem d2,Diem d3);
void nhap(){
cout << "Nhap toa do cua diem ";
cin >> x >> y;
}
};

float Diem1 ::dodai(Diem d2){
return (sqrt(pow(this->x-d2.x,2)+pow(this->y-d2.y,2)));
}
float Diem1 :: chuvitamgiac(Diem d2 , Diem d3){
return ((*this).dodai(d2)+ this->dodai(d3) + d2.dodai(d3));
}

 int main(){
Diem d1,d2,d3;
d1.nhap();
d2.nhap();
d3.nhap();
cout << "Do dai tu d1 den d2 la : " << d1.dodai(d2) << "   " << d2.dodai(d1) << endl;
cout << "Chu vi tam giac d1,d2,d3 = " << d1.chuvitamgiac(d2,d3);
return 0;
 }

Xét phương thức dodai trong class Diem :
 trong phương thức này nhân 2 đối truyền vào là
  - một đối tượng thuộc kiểu Diem (do this quản lý)
  - biến thứ hai là đối tượng thuộc kiểu Diem d2 .
  Trong trường hợp này vai trò của this không cao lắm , ta có thể bỏ this đi vẫn được
 
Sang phương thức thứ 2 :
 trong phương thức chuvitamgiac có 3 đối được truyền vào
 - Đối tượng thuộc Diem do this quản lý
 - 2 đối tượng thuộc kiểu điểm : d2,d3.

 Ta thấy là trong trường hợp này vai trò của this rất quan trọng .

 So sánh 2 cách thức sau :
 + dùng this
 float Diem1 :: chuvitamgiac(Diem d2 , Diem d3){
return ((*this).dodai(d2)+ this->dodai(d3) + d2.dodai(d3));
}
 + không dùng this
 float Diem1 :: chuvitamgiac(Diem d2 , Diem d3){
        Diem d1;
d1.x = x;
d1.y = y;
return (d1.dodai(d2)+ d1.dodai(d3) + d2.dodai(d3));
}
Nếu với những class có nhiều thuộc tính thì không thể làm theo cách này
 2 câu lệnh d1.x = x ; d1.y = y ;
 x,y chính là (*this).x (hay this->x) (*this).y(hay this->y).

 Tóm lại việc dùng con trỏ this trở nên hữu ích khi  ta sử dụng phương thức thuộc con trỏ this
 (hay sử dụng phương thức cho đối tượng sẽ được khai báo)

Ta đã có vùng nhớ cấp phát cho lớp khi ta khai báo một đối tượng thuộc lớp , vậy khi ta khai
báo một đối tượng thuộc lớp thì máy mới cấp bộ nhớ cho con trỏ this có kiểu là class vừa được
khai báo . Tức là khi cài đặt ta viết return ((*this).dodai(d2)+ this->dodai(d3) + d2.dodai(d3));
,... thì this trong trường hợp này trong trạng thái "chờ" , chờ được đến khi khai báo đối tượng
hay được trỏ đến đối tượng . Tức là khi khai báo (*this) mới có giá trị .

Để hiểu rõ hơn ta hãy tưởng tượng :
con trỏ this như một cái xe chở hàng đứng đợi khi ta khai báo class -
khi khai báo đối tượng thuộc class xong chiếc xe chở hàng sẽ chở "đối tượng " đến phương thức
lắp vào chỗ this,chỗ được cài đặt sẵn từ trước để làm việc .

Dễ thấy con trỏ this chỉ có tác dụng trong các phương thức của class , còn ngoài ra
nó không có mấy tác dụng

còn một chú ý nữa cho các bạn chưa học lập trình hướng đối tượng (OOP) trường hợp trên dùng
được cả cho struct . (kể cả con trỏ this) 

Không có nhận xét nào:

Đăng nhận xét