Hỏi về con trỏ This trong OOP (C++)

Cho Em hỏi là theo Em được biết thì con trỏ this là trỏ đến địa chỉ của một đối tượng vậy thì nó có quyền truy cập đến các thuộc tính và phương thức như là một đối tượng ạ. Nhưng một đối tượng thì lại không truy cập được vào các thuộc tính private của một lớp. Vậy tại sao con trỏ this lại trỏ được ạ. Thanks mọi người

vì con trỏ this nằm trong phạm vi của lớp đó nên nó truy cập được các thuộc tính private thuộc lớp đó :V

ví dụ viết

class A {
public:
  void print() const;
private:
  int x;
};

void A::print() const { // chú ý có A:: nghĩa là hàm void này thuộc phạm vi lớp A
  std::cout << this->x; // this trong thân hàm A::print() này thuộc phạm vi lớp A nên truy cập được các thuộc tính private
}
4 Likes

Không phải, nó ntn:

this là chính đối tượng trong ngữ cảnh là lớp. Vì vậy this không thể truy cập private của superclass.

5 Likes

câu hỏi thế này chứ :V tại sao this (là con trỏ tới đối tượng) truy cập tới thuộc tính private của đối tượng đó được mà bản thân đối tượng tạo ra ko truy cập được ấy :V

ví dụ:

A a;
std::cout << a.x; // ko được
a.print(); // lại xuất a.x thông qua this là "&a" được :V 

// nhưng 
void A::print() const {
  std::cout << this->x; // lại được
}

đâu có hỏi kế thừa gì đâu


this truy cập thuộc tính ẩn được mà a ko truy cập được để viết code ko thuộc về A sẽ ko cần biết tới những thuộc tính ẩn đó. Giống như ví dụ cái remote TV, công ty chế ra cái remote biết bên trong nó có bo mạch (thuộc tính) gì (coi cái remote là con trỏ this), còn người dùng chỉ cần biết các nút bấm kênh, volume gì là đủ rồi (coi cái remote là cái remote :V)

4 Likes

Vợ của “tau” thì là private.
“Tau” không cho thằng khác sờ vào nhưng “tau” thì được chứ vì của “tau” mà :slight_smile:

6 Likes

Thế thì lúc khai báo lớp. Con trỏ this nó đã tồn tại r ạ. Hay là lúc tạo đối tượng thì n mới tồn tại ạ. Mà tại sao n k trỏ luôn vào địa chỉ của class mà phải trỏ vào đối tượng ạ. Mong bác giúp đỡ.

private là bên ngoài class không gọi được rồi :smiley: Câu hỏi này thường chỉ đặt ra khi học đến kế thừa thôi.

4 Likes

khi chương trình C++ chạy class ko tồn tại, chỉ có object của class tồn tại :V Class X là bản vẽ của object x có kiểu X. Lúc tạo đối tượng thì n mới tồn tại.

this em hiểu như là 1 tham số truyền vào từng hàm trong class thôi :V Ví dụ viết code giả lập OOP trong C:

typedef struct A { int n; } a_t; // _t ở đây là viết tắt cho type, a_t hiểu là kiểu dữ liệu a

void a_t_print(a_t* this) {
  printf("%d", this->n);
}

int main(void) {
  a_t a{11}; // tạo a thì a.n mới tồn tại
  a_t_print(&a); // truyền this vào hàm print() 
}

thì ông C++ ổng “ẩn” bước truyền &a vào hàm print kia thôi :V

a.print(); // hiểu là a_t_print(&a);

cũng ko hẳn là ẩn lắm vì có viết a., đúng hơn gọi là chuyển từ postfix thành infix :V thay vì viết cộng(a, b) thì viết là a.cộng(b) giống a + b :V

C++ có thể viết lại như C :V :V thông qua std::mem_fn

auto a_print = std::mem_fn(&A::print);
A a;
a_print(a); // vì C++ có truyền tham chiếu nên truyền tham chiếu a chứ ko truyền con trỏ &a

#include <iostream>
#include <functional> // std::mem_fn

class A {
public:
    A() = default;
    A(int n) : n{n} {}
    void print() const;
private:
    int n = 0;
};

int main() {
    A a{123};
    a.print();
    
    auto a_print = std::mem_fn(&A::print); // có thể xem a_print như 1 "free" function
    a_print(a); // truyền "this" vào a_print
}

void A::print() const { // A:: là phạm vi lớp A
    std::cout << this->n << "\n"; // this truy cập thuộc tính n của A được vì nó thuộc phạm vi lớp A
}
5 Likes

E hiểu r ạ. :slight_smile: thanks A nhìu nha

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?