#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();
}
Trả lời
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.)
+1 cho phối cảnh 'const temp t'. – Chubsdad
Xin chào, tôi không biết bạn có blog. tốt đẹp :) –
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.
'reinterpret_cast' sẽ không hoạt động ở đây: nó không thể bỏ đi constness. – UncleBens
$ 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.
- 1. thay đổi giá trị const trong C
- 2. thay đổi trường nhập jquery ngay cả khi giá trị được thay đổi thông qua jquery
- 3. thay đổi giá trị của biến const trong C++
- 4. Tại sao toán tử ++ trả về giá trị không const?
- 5. Tại sao hàm tạo bản sao được gọi thay vì hàm tạo chuyển đổi?
- 6. Lambda: Tại sao giá trị được ghi lại bởi giá trị const, nhưng giá trị theo từng tham chiếu không?
- 7. Giá trị trả về Const trong Java
- 8. Tại sao hàm Perl này trả về một giá trị?
- 9. Thay đổi giá trị boolean trong hàm lớp trong java
- 10. Tại sao có một hàm tạo giá trị ngoài hàm tạo kiểu trong Haskell?
- 11. Tại sao in một biến thay đổi giá trị của nó?
- 12. Trong c + +, tại sao trình biên dịch chọn hàm không const khi const cũng làm việc?
- 13. Tại sao thay đổi biến trả lại trong một khối cuối cùng không thay đổi giá trị trả về?
- 14. Tại sao hàm tạo được sử dụng thay cho hàm?
- 15. Thay đổi một giá trị trong SQLite3
- 16. Tại sao thay đổi SelectedItem trong một Combo thay đổi tất cả các Combos khác?
- 17. Tại sao có thể thay đổi giá trị của một trường chỉ đọc chứ không phải của một const sử dụng sự phản chiếu?
- 18. Thay đổi giá trị bên trong vòng lặp foreach không thay đổi giá trị trong mảng được lặp qua
- 19. Tại sao giá trị của phao này thay đổi từ những gì nó được thiết lập?
- 20. thay đổi giá trị của các phần tử mảng từ bên trong một hàm
- 21. Tại sao một C-Array có giá trị sizeof() sai khi nó được truyền cho một hàm?
- 22. Giá trị cháy JListChỉ thay đổi hai lần khi giá trị được thay đổi qua chuột
- 23. Áp dụng một hàm tất cả các giá trị trong một mảng
- 24. Tại sao thay đổi giá trị của SO_RCVBUF không hoạt động?
- 25. Tại sao hàm tạo bản sao này được gọi thay vì hàm tạo di chuyển?
- 26. Tại sao tôi không thể chuyển đổi 'char **' thành 'const char * const *' trong C?
- 27. Thay đổi giá trị của một giá trị ENUM MySQL, trong suốt một bảng
- 28. Tại sao một khai báo enum được đánh dấu const?
- 29. Tại sao Microsoft khuyên các trường chỉ đọc với các giá trị có thể thay đổi?
- 30. Tại sao thuộc tính giá trị của thay đổi đầu vào?
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 –
@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. –
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. –