2010-08-26 29 views
5
#include<iostream> 
using namespace std; 

class temp 
    { 
     int value1; 
     public : 
     void fun() const 
     { 
     ((temp*)this)->value1 = 10; 
     } 
     void print() 
     { 
      cout<<value1<<endl; 
     } 
    }; 
int main() 
{ 
    temp t; 
    t.fun(); 
    t.print(); 
} 
+1

ngẫu nhiên một cách tốt hơn để làm điều này là làm cho giá trị1 có thể thay đổi –

+1

@jk: Nhược điểm lớn của 'mutable' là nó làm cho biến có thể thay đổi cho * tất cả * phương pháp, không chỉ một. Dàn diễn viên ít xâm lấn hơn và do đó IMHO xấu xa hơn. –

+1

Lời khuyên: Chỉ sử dụng phôi kiểu C++ ("* _cast") để hiển thị ý định của bạn. Không sử dụng phôi kiểu C "(loại)", vì đây là tất cả các phôi có thể cuộn thành một. –

Trả lời

14

Bởi vì bạn đang đúc đi const ...

Khi bạn cast một cái gì đó, trách nhiệm là của bạn để đảm bảo rằng nó không làm điều gì đó ngu ngốc.


Lưu ý rằng nếu temp t; được thay đổi để const temp t;, bạn sẽ có được hành vi không xác định, sửa đổi một giá trị const.

Thật trùng hợp tôi thực sự chỉ chạm vào điều này trong my blog. (Hầu như cùng một chức năng.)

+2

+1 cho phối cảnh 'const temp t'. – Chubsdad

+0

Xin chào, tôi không biết bạn có blog. tốt đẹp :) –

3

C++ cố gắng ngăn chặn các lỗi ngẫu nhiên, nhưng nó không đi ra khỏi con đường của nó để chống lại một lập trình viên đã quyết định có mọi thứ theo cách riêng của họ. Nếu bạn sử dụng các toán tử cast, bạn sẽ nói "tin tôi đi, tôi biết cái gì ở đó", yêu cầu nó bỏ qua đó là kiến ​​thức riêng của chương trình. Chính vì nhà điều hành đúc kiểu C mà bạn đã sử dụng là nguy hiểm và có thể dễ dàng bị lạm dụng khi C++ giới thiệu static_cast, const_cast và reinterpret_cast, giao tiếp ý định của lập trình viên theo cách mà trình biên dịch vẫn có thể nói "hey, giữ ở đó , điều đó đòi hỏi nhiều hơn chỉ là loại khoan dung mà bạn đang yêu cầu ". reinterpret_cast là cha lớn mặc dù ... không tranh luận với điều đó ... cũng tàn bạo như diễn viên C và hiếm khi cần thiết trong một ứng dụng cấp cao. Chính vì nó hiếm khi cần thiết, tiết và dễ thấy, nó thu hút sự giám sát. Mã rải rác với phôi kiểu C có thể dễ dàng ẩn các lỗi.

+0

'reinterpret_cast' sẽ không hoạt động ở đây: nó không thể bỏ đi constness. – UncleBens

5

$ 5,4/5 là về explicit type conversion (đó là những gì đang được sử dụng ở đây)

Quá trình chuyển đổi được thực hiện bởi

- một const_cast (5.2.11),

- một static_cast (5.2.9),

- một static_cast theo sau là một const_cast,

- lại interpret_cast (5.2.10), hoặc

- một reinterpret_cast tiếp theo là một const_cast,

thể được thực hiện bằng cách sử dụng ký hiệu diễn viên của chuyển đổi loại rõ ràng. các hạn chế và hành vi ngữ nghĩa tương tự áp dụng. Nếu chuyển đổi có thể là diễn giải ở nhiều hơn một trong số các cách được liệt kê ở trên, thì cách diễn giải xuất hiện đầu tiên trong danh sách là được sử dụng, ngay cả khi diễn giải là . Nếu chuyển đổi có thể được diễn giải trong nhiều hơn một cách dưới dạng static_cast theo sau là một const_cast, chuyển đổi bị lỗi.

Trong trường hợp này, ((temp*)this) được coi là (const_cast<temp *>(this)) và được thiết lập tốt. Điều này loại bỏ constness, do đó cho phép thay đổi giá trị thành viên của lớp.

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