Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Con trỏ this

  1. #1
    Ngày gia nhập
    11 2007
    Bài viết
    22

    Mặc định Con trỏ this

    Cho mình hỏi con trỏ this có tác dụng gì và cách dùng nó như thế nào ?

  2. #2
    Ngày gia nhập
    03 2008
    Bài viết
    57

    Bên trong thân của một phương thức, this là một con trỏ đối tượng thuộc về lớp mà phương thức đó thuộc về.
    Nói cách khác this chính là bản thân của đối tượng mà bạn đang thao tác. Nó cũng giống như là "Me" trong VB vậy
    Ví dụ: ta có lớp CHocSinh như sau

    C++ Code:
    1. class CHocSinh
    2. {
    3.     private:
    4.         char hoten[31];
    5.         float toan;
    6.         float van;
    7.         float dtb; // diem trung binh
    8.     public:
    9.         CHocSinh operator = (CHocSinh &);
    10.  
    11. };
    12.  
    13. CHocSinh CHocSinh::operator = (CHocSinh &x )
    14. {
    15.     strcpy(hoten,x.hoten);
    16.     toan = x.toan;
    17.     van = x.van;
    18.     dtb = x.dtb;
    19.     return *this;
    20. }
    Trong ví dụ trên ta nói : bên trong thân phương thức " operator = "của lớp CHocSinh , this là con trỏ đối tượng thuộc về lớp CHocSinh.

  3. #3
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Nếu bạn hiểu rõ struct thì this pointer là 1 đặc ưu riêng trong C++, ví dụ trong C:
    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3.  
    4. typedef struct {
    5.   int salary;
    6.     std::string name;
    7. } _thisPointer;
    8.  
    9. void createSomeValue(_thisPointer* iTer, int s, std::string n){
    10.   iTer->salary = s;
    11.   iTer->name = n;
    12. }
    13.  
    14. int main(){
    15.   _thisPointer myData;
    16.   _thisPointer* iter = &myData;
    17.   std::string _name = "r2";
    18.   createSomeValue(iter, 5, _name);
    19.   std::cout << myData.name;
    20.   std::cout << myData.salary;
    21. }
    Con trỏ this ở đây chính là thằng iTer, trong C++ nó đã giúp cho người dùng thoải mái hơn thay vì phải :
    - Khai báo 1 con trỏ đến 1 instance của 1 struct ( class in C++).
    - và phải pass thêm con trỏ này vào hàm iTer->salary, iTer-> name...
    Trong C++ thì nó được thay thế bằng con trỏ this :
    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3.  
    4. class Person {
    5.   int salary;
    6.   std::string name;
    7. public :
    8.   void createSomeValue(int , std::string );
    9. };
    10.  
    11. void Person::createSomeValue(int s, std::string n){
    12.   this->salary = s;
    13.   this->name = n;
    14. }
    15.  
    16. int main(){
    17.   Person ob;
    18.   std::string _name = "r2";
    19.   ob.createSomeValue(5, _name);
    20. }

  4. #4
    Ngày gia nhập
    12 2007
    Bài viết
    48

    Nhưng em thấy đổi như bên dưới thì chương trình vẫn chạy và không sai cú pháp. How is it?
    Code:
    void Person::createSomeValue(int s, std::string n)
    {
       salary = s;
       name = n;
    }
    "what you don't use you don't pay for" (Bjarne Stroustrup).

  5. #5
    Ngày gia nhập
    10 2007
    Nơi ở
    Gameloft studio
    Bài viết
    175

    Tất nhiên vẫn đúng, nhưng thủ thuật dùng con trỏ this rất quan trọng khi bạn sử dụng với nhiều đối tượng hơn, chứ không thuần túy chỉ dùng trong một hàm thành viên của lớp. Bạn thử tìm hiểu kỹ hơn ha.
    Không biết ghi gì luôn ...

  6. #6
    Ngày gia nhập
    12 2007
    Bài viết
    48

    Mặc định Con trỏ this

    Thanks. Chung chung thật ^ ^! (lỡ vi phạm lỗi "thanks" rồi, ko biết làm sao xóa hết >.<)
    Đã được chỉnh sửa lần cuối bởi Emerald214 : 20-03-2008 lúc 08:27 PM.
    "what you don't use you don't pay for" (Bjarne Stroustrup).

  7. #7
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    How about this example ? Clear enough ?
    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3.  
    4. class Person {
    5.   int salary;
    6.   std::string name;
    7. public :
    8.   void createSomeValue(int , std::string );
    9.   void do_sthingelse();
    10. };
    11.  
    12. void Person::createSomeValue(int s, std::string n){
    13.   this->salary = s;
    14.   this->name = n;
    15. }
    16.  
    17. void Person::do_sthingelse(){
    18.     this->createSomeValue(5, static_cast<std::string>("r2"));
    19.     std::cout << this->name << '\n';
    20.     std::cout << this->salary << '\n';
    21. }
    22.  
    23. int main(){
    24.   Person ob;
    25.   ob.do_sthingelse();
    26. }

  8. #8
    Ngày gia nhập
    12 2007
    Bài viết
    48

    Code:
    void Person::createSomeValue(int s, std::string n){
      salary = s;
      name = n;
    }
    
    void Person::do_sthingelse(){
        createSomeValue(5, static_cast<std::string>("r2"));
        std::cout << name << '\n';
        std::cout << salary << '\n';
    }
    bỏ this nó vẫn chạy ^ ^ Anh Rook có cái vd nào mà "không dùng this thì không được" không?
    Đã được chỉnh sửa lần cuối bởi Emerald214 : 21-03-2008 lúc 01:12 PM.
    "what you don't use you don't pay for" (Bjarne Stroustrup).

  9. #9
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    WTH ! haha ! Cậu đùa với tui à :-o ! Tui đưa ví dụ cho cậu hiểu mà cậu cứ chạy với không chạy.
    Chạy nữa hết
    C++ Code:
    1. #include <iostream>
    2.  
    3. class X {
    4. private:
    5.     int a;
    6. public:
    7.     void Set_a(int a) {
    8.         this->a = a;
    9.     }
    10.     void Print_a() {
    11.         std::cout << "a = " << a << '\n';
    12.     }
    13. };
    14.  
    15. int main() {
    16.     X obj;
    17.     int a = 5;
    18.     obj.Set_a(a);
    19.     obj.Print_a();
    20. }

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn