2012-06-11 56 views
20

Trong các phần tử cơ thể sau của một vectơ con trỏ. Điểm là một cấu trúc của x, y, z tọa độ và một điểm_id. Tôi tin rằng khi cơ thể được truyền qua tham chiếu const, bước sau sẽ tạo ra lỗi. BUt chương trình đang chạy mà không có bất kỳ vấn đề. Bạn có thể vui lòng giải thích cho tôi lý do tại sao điều này.C++ truyền qua tham chiếu const

void readOutFile(const Body& body, int n){ 

    .... 

    body.bp[0]->points.push_back(Point_id(p,i)); 
} 
+2

'nội dung' được chuyển thành' const' nhưng không có cách nào để trình biên dịch biết rằng 'body.bp [0] -> điểm' phải là' const'. – wroniasty

+0

Nó sẽ chạy ok và const lỗi sẽ là một lỗi thời gian biên dịch, không phải là một lỗi thời gian chạy. –

+3

Trong C++, const là nông, không sâu. Vì vậy, nó ảnh hưởng đến đối tượng nhưng không ảnh hưởng đến các đối tượng của nó. Nó có nghĩa là bạn chỉ có thể gọi các phương thức const. Nhưng các phương thức const có thể thay đổi các đối tượng khác, luôn sử dụng các phương thức trong giao diện và sử dụng một công cụ lint tốt để kiểm tra độ sâu. –

Trả lời

6

Chỉ body là hằng số.

body.bp[0]->points là không có cách nào bị ảnh hưởng bởi constantness của body

38

Dưới đây là vấn đề:

body.bp[0]->points.push_back(Point_id(p,i)); 
      ^^ 

Indirecting qua một con trỏ loại bỏ bất kỳ constness; thay vào đó, độ chói của kết quả phụ thuộc vào loại con trỏ.

T *t;    // pointer to T: can modify t and (*t) 
const T *t;  // pointer to const-T: can modify t but not (*t) 
T *const t;  // const-pointer to T: can modify (*t) but not t 
const T *const t; // const-pointer to const-T: can't modify either t or (*t) 
+3

Tôi chưa bao giờ nhận ra điều này nhưng nó có ý nghĩa. Constness truyền đến con trỏ thành viên nhưng không phải là nội dung của nó. –

6

Có, body là không đổi. Điều đó có nghĩa là không có hàm thành viên không phải là const có thể được gọi và không có biến thành viên nào được sửa đổi.

Hiện chưa hoàn tất. Các thành viên duy nhất của body sử dụng là body.bp[0], mà không được thay đổi một trong hai, nhưng chỉ sử dụng để có được ít points, mà có thể hoặc không có thể là liên tục ...

Corrolary: Đừng làm cho các thành viên dữ liệu công cộng.

16

Đây là một trong những ví dụ tốt nhất cho thấy lý do tại sao data members should not be public.

tại đây, body là hằng số vì vậy các thành viên dữ liệu của nó không được thay đổi, nhưng tại body.bp[0]->points điểm đang được thay đổi mà không phải là thành viên của Body.Không có vi phạm const.

+5

Với tôi, đây là một ví dụ về lý do tại sao ** các con trỏ thành viên ** không được công khai. Không có gì sai với các thành viên dữ liệu "giá trị" công khai. – ulidtko

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