2017-06-06 19 views
27

Ví dụ,Khi toán tử dereference (*) bị quá tải, việc sử dụng * điều này có bị ảnh hưởng không?

class Person{ 
     string name; 
    public: 
     T& operator*(){ 
      return name; 
     } 
     bool operator==(const Person &rhs){ 
      return this->name == rhs.name; 
     } 
     bool operator!=(const Person &rhs){ 
      return !(*this == rhs); // Will *this be the string name or the Person? 
     } 
} 

Nếu *this kết thúc lên dereferencing this đến một string thay vì một Person, là có một cách giải quyết duy trì việc sử dụng * như một toán tử tham chiếu bên ngoài lớp học?

Sẽ là một trở ngại nếu tôi không thể quá tải * mà không từ bỏ việc sử dụng *this.

+23

Quá tải áp dụng cho đối tượng Person. Nhưng 'this' là con trỏ * người *. – Galik

+1

@Galik nhận xét này phải là câu trả lời (được chấp nhận). – YSC

Trả lời

41

Nếu *this kết thúc lên dereferencing this thành một chuỗi thay vì một Person, là có một cách giải quyết duy trì việc sử dụng * như một toán tử tham chiếu bên ngoài lớp học?

No. *this sẽ là Person& hoặc Person const& tùy thuộc vào chức năng. Quá tải áp dụng cho các đối tượng Person, không được trỏ đến các đối tượng Person. this là con trỏ đến đối tượng Person.

Nếu bạn sử dụng:

Person p; 
auto v = *p; 

Sau đó, sự quá tải operator* được gọi.

Để gọi số operator* quá tải bằng cách sử dụng this, bạn sẽ phải sử dụng this->operator*() hoặc **this.

+3

Đề xuất bạn kết hợp giải thích của @ Galik trong câu trả lời của bạn. – einpoklum

+0

@einpoklum, gợi ý tuyệt vời. –

12

Bạn cần một đối tượng của lớp thay vì con trỏ đến đối tượng lớp để gọi toán tử quá tải *.

Person *ptr = new Person; 
Person p1 = *ptr; // does not invoke * operator but returns the object pointed by ptr 
string str = *p1 // invokes the overloaded operator as it is called on an object. 

Trường hợp tương tự với con trỏ this. Để gọi * operator với con trỏ this, bạn sẽ phải dereference hai lần:

std::string str = *(*this); 
Các vấn đề liên quan