2012-03-19 53 views
16

Tôi đang xem xét một số mã và tôi chạy trên một số mã tôi không quen thuộc với. Sau khi tìm kiếm một số tôi không thể đưa ra bất kỳ ví dụ về lý do tại sao điều này được thực hiện hoặc lợi ích của tuyên bố này.C + + Const khai báo con trỏ

myClass const * const myPtr = myClass->getPointer(); 

Đây có phải là tuyên bố của con trỏ const hay gì đó hoàn toàn khác không?

Trả lời

24

Điều đó có nghĩa là "myPtr là con trỏ const tới số constmyClass". Nó có nghĩa là bạn không thể sửa đổi những gì con trỏ trỏ đến thông qua con trỏ này hoặc bạn có thể làm cho điểm con trỏ ở một nơi khác sau khi nó được khởi tạo (bởi giá trị trả về là myClass->getPointer()). Vì vậy, có, bạn về cơ bản đúng, với việc bổ sung mà nó cũng trỏ đến một đối tượng const (theo như bạn biết, nó thực sự có thể là không const bên dưới).

Hãy nhớ rằng const áp dụng cho mục ở bên trái (hoặc nếu không có mục nào ở bên trái, mục ở bên phải). const đầu tiên làm cho myClassconst (nơi bạn không thể sửa đổi những gì con trỏ trỏ vào) và thứ hai const làm cho các * const (nơi bạn không thể sửa đổi con trỏ chính nó).

+6

"Hãy nhớ rằng const áp dụng cho mục ở bên trái (hoặc nếu không có mục nào bên trái, mục bên phải của nó). "- đây là quy tắc đơn giản nhất, đơn giản nhất, dễ nhất mà tôi đã thấy trong việc phân loại const. – linbianxiaocao

1

này khai báo một con trỏ hằng đến một giá trị không đổi, trở lại bằng cách gọi hàm thành viên của một con trỏ dereference myClass

2

Seth là về tiền bạc. Có một số nền khác mà bạn có thể thấy hữu ích trên Duramecho.

3

Quy tắc là từ khóa const áp dụng cho "từ" ở bên trái của từ khóa, trừ khi đó là từ đầu tiên trên dòng, trong trường hợp này nó áp dụng cho "từ" ở bên phải của từ đó. Vì vậy: myClass const * const: myClass < - const, con trỏ < - const, const pointer để const myClass.

Vì một số lý do, trong hầu hết mã (ít nhất là mã tôi đã xem), điều này sẽ được khai báo là const myClass * const. Tại sao tôi không có đầu mối, bởi vì bây giờ bạn phải có ngoại lệ cho "const áp dụng cho từ bên trái, trừ khi đó là từ đầu tiên trên dòng" vào tài khoản. I.e: viết dòng họ được thực hiện trong mã bạn đang xem xét là rõ ràng hơn rất nhiều.

17

Trong một số trường hợp, bạn có thể thấy nó được viết như thế này:

const myClass * const myPtr = myClass->getPointer(); 

Hai là tương đương, cụ thể là một con trỏ hằng cho một đối tượng liên tục. Tôi thích cú pháp như bạn đã thể hiện vì nó dễ hiểu hơn đối với người mới khi đọc từ phải sang trái:

Object * const obj;  // read right-to-left: const pointer to Object 
Object const * obj;  // read right-to-left: pointer to const Object 
Object const * const obj; // read right-to-left: const pointer to const Object 
Các vấn đề liên quan