2009-10-22 34 views
6

câu hỏi rất đơn giản ... có sự khác biệt nào trong việc sử dụng này-> yourvariable hoặc yourvariable trực tiếp vì một lý do nào đó không?con trỏ "này" bên trong một lớp

Tôi không tìm thấy bất kỳ vấn đề nào với điều đó, nhưng tôi đang sử dụng điều này-> rất nhiều và muốn biết nếu có bất kỳ sự khác biệt nào trước khi tiếp tục.

Tôi đã thấy nhận xét về bài đăng ở đây và tôi không nhớ chủ đề nào, nhưng người đó đã nói điều gì đó về việc sử dụng từ khóa "này".

Cá nhân, tôi thấy nó dễ sử dụng hơn biến trực tiếp. Nó làm cho mã dễ dàng hơn và đẹp hơn.

Joe

+2

xem: http://stackoverflow.com/questions/993352/when-should-i-make-explicit-use-of-the-this-pointer –

+0

Hầu hết các nguyên tắc mã hóa tôi đã đọc cau mày khi làm điều đó mà không có lý do chính đáng . Đó là tiếng ồn mã không thêm ý nghĩa. Bất cứ ai đọc mã của bạn sẽ có thể suy ra từ ngữ cảnh mà bạn đang sử dụng một thành viên trong lớp. – dss539

+0

Sử dụng 'điều này' một cách rõ ràng làm cho chương trình dễ đọc hơn – Xinus

Trả lời

12

Không, không có sự khác biệt thực sự, nó chỉ đơn giản là phạm vi vòng loại. Tuy nhiên, giả sử một phương thức

void SetFoo(Foo foo) 
{ 
    this->foo = foo; 
} 

nơi này-> foo là thành viên riêng tư. Ở đây nó cho phép bạn lấy một tham số có cùng tên với biến class/instance.

0

Đây là loại được hỏi và trả lời về C# here và tôi nghĩ rằng câu trả lời (ít nhất là của tôi) là như nhau. Đó là sở thích.

1

Tôi thấy rằng việc sử dụng this làm cho mã của tôi dễ đọc hơn, nhưng không có lý do gì bạn phải làm. Nếu bạn nhìn vào mã trình biên dịch mà trình biên dịch của bạn tạo ra, nó phải có chức năng (và thường là theo nghĩa đen) giống hệt nhau.

Về cơ bản, khi hàm được gọi, nó được chuyển một đối số ẩn this, sau đó được sử dụng để tìm ra biến nào là ở đâu. Nếu bạn sử dụng các biến trực tiếp, không có this->, bạn sẽ không làm bất cứ điều gì ngoại trừ việc sử dụng một số đường cú pháp.

16

Trong hầu hết các trường hợp, không có sự khác biệt. Nhưng cũng có những tình huống mà nó làm cho một sự khác biệt:

class foo 
{ 
    int i; 
    void bar() { 
     int i = 3; 
     i; // refers to local i 
     this->i; // refers to the member i 
    } 
}; 

Ngoài ra, với các mẫu bạn có thể cần phải hội đủ điều kiện thành viên với this-> để tra cứu tên bị trì hoãn:

template<typename T> 
struct A 
{ 
    int i; 
    T* p; 
}; 

template<typename T> 
struct B : A<T> 
{ 
    void foo() { 
     int k = this->i; // here this-> is required 
    } 
}; 

Một trình biên dịch mà không đúng "hai giai đoạn tra cứu" sẽ khiếu nại trong trường hợp bạn loại bỏ "this->" rằng nó không biết những gì tôi có nghĩa vụ phải được. "this->" nói với nó rằng đó là một thành viên từ một lớp cơ sở. Vì lớp cơ sở phụ thuộc vào tham số mẫu, tra cứu bị trì hoãn cho đến khi mẫu lớp được khởi tạo.

+0

+1 để báo hiệu vấn đề mẫu. gcc thường nói điều gì đó dọc theo dòng ' không phụ thuộc vào tham số mẫu để định nghĩa phải có sẵn'. –

Các vấn đề liên quan