1
Ý nghĩa của con trỏ this trong C/C++ là gì?
4
Chí Nam100 đã đăng:

Cho mình hỏi mục đích của con trỏ this trong C/C++ là gì? Có sự khác biệt nào khi khai báo this -> name = namename = name trong hàm khởi tạo của class hay không?

thêm bình luận...
1
Minh Tâm50 đã đăng:

Ý nghĩa của con trỏ this trong C/C++ là gì?

Giả sử bạn có lớp Car,

class Car{
    private:
        int Size;
    public:
        void tocDoChay(){cout <<"Toc do chay cua doi tuong: " << this << endl;}
};

Khi sử dụng, có thể bạn khai báo 2 hoặc nhiều đối tượng từ lớp Car này,

Car honda;
Car suzuki;

Thì chuyện gì sẽ xảy ra?

  • Đối tượng hondasuzuki sẽ cùng sử dụng chung 1 phương thức tocDoChay() của lớp Car.
  • Đối tượng hondasuzuki sẽ có bản copy thuộc tính Size cho riêng mình.

Và câu hỏi đặt ra ở đây, nếu nhiều đối tượng cùng sử dụng chung 1 phương thức tocDoChay() của lớp, vậy làm thế nào để phương thức tocDoChay() đó lấy đúng thuộc tính Size của từng đối tượng mà tính toán, con trỏ this được tạo ra để làm việc này, con trỏ this có thể hiểu ngầm là 1 tham số ẩn được truyền vào phương thức tocDoChay(this) với mục đích lưu trữ địa chỉ của đối tượng.

Do đó, nếu bạn gọi phương thức tocDoChay() của đối tượng hondasuzuki và xuất ra con trỏ this, bạn sẽ thấy nó giữ hai địa chỉ khác nhau tùy vào đối tượng honda hay suzuki.

honda.tocDoChay(); // Toc do chay cua doi tuong: 004DFD20
suzuki.tocDoChay(); // Toc do chay cua doi tuong: 004DFD14

Có sự khác biệt nào khi khai báo this -> name = namename = name trong hàm khởi tạo của class hay không?

Có.

this -> name = name: Đúng, vì name của đối tượng cụ thể được gán bằng name của tham số truyền vào hàm khởi tạo.

name = name: Sai, vì name ở đây không biết là name của đối tượng cụ thể nào.

đã bổ sung 5.8 năm trước bởi
Avatar: Minh Tâm Minh Tâm50

Cảm ơn câu trả lời chi tiết của bạn, bạn có thể ví dụ thêm về trường hợp câu hỏi thứ 2 tại sao đúng, tại sao sai được không ạ, rất cảm ơn bạn vì điều đó.

Chí Nam 21.06.2018
1

Trường hợp sai name = name,

#include <iostream>
using namespace std;

class Car{
    private:
        int Size;
        int name;
    public:
        Car(int name){
            name = name; // Không biết name ở bên vế trái là của đối tượng nào.
        };
        void tocDoChay(){cout <<"Ten cua doi tuong: " << this -> name << endl;}
};

int main(){
    Car honda(22);
    Car suzuki(25);

    honda.tocDoChay(); // Ten cua doi tuong: -858993460
    suzuki.tocDoChay(); // Ten cua doi tuong: -858993460
}

Trường hợp đúng this -> name = name,

#include <iostream>
using namespace std;

class Car{
    private:
        int Size;
        int name;
    public:
        Car(int name){
            this -> name = name; // Chính xác
        };
        void tocDoChay(){cout <<"Ten cua doi tuong: " << this -> name << endl;}
};

int main(){
    Car honda(22);
    Car suzuki(25);

    honda.tocDoChay(); // Ten cua doi tuong: 22
    suzuki.tocDoChay(); // Ten cua doi tuong: 25
}

Hy vọng sẽ rõ ràng hơn.

Minh Tâm 21.06.2018
thêm bình luận...
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)