2012-02-03 38 views
5

giả sử tôi có một chức năng mà chấp nhận const qua lập luận tài liệu tham khảo,C++ chức năng: pass luận const không đến tham số tham chiếu const

int func(const int &i) 
{ 
    /* */ 
} 

int main() 
{ 
    int j = 1; 
    func(j); // pass non const argument to const reference 
    j=2; // reassign j 
} 

mã này trình fine.according C++ mồi, những gì lập luận này thông qua chức năng này là như sau,

int j=1; 
const int &i = j; 

trong đó i là một từ đồng nghĩa (bí danh) của j,

câu hỏi của tôi là: nếu tôi là một từ đồng nghĩa của j, và tôi được định nghĩa là const, i s mã:

const int & i = j

redelcare một biến const không để const biến? tại sao biểu thức này là hợp pháp trong c + +?

Trả lời

12

Tham chiếu là const chứ không phải đối tượng. Nó không thay đổi thực tế là đối tượng là có thể thay đổi, nhưng bạn có một tên cho đối tượng (j) thông qua đó bạn có thể sửa đổi nó, và một tên khác (i) thông qua đó bạn không thể.

Trong trường hợp của tham số tham chiếu const, điều này có nghĩa rằng main có thể thay đổi đối tượng (vì nó sử dụng tên gọi của nó cho nó, j), trong khi func không thể sửa đổi các đối tượng quá lâu vì nó chỉ sử dụng tên gọi của nó cho nó, i. funccó thể về nguyên tắc sửa đổi đối tượng bằng cách tạo một tham chiếu hoặc con trỏ khác với đối tượng đó bằng const_cast, nhưng không.

+0

bạn có nghĩa là tham chiếu không phải là đối tượng. sau đó làm thế nào để hiểu tôi là một từ đồng nghĩa của j? nó có nghĩa là i và j là cùng một đối tượng, bởi vì cả i và j đều có cùng một địa chỉ vật lý? – fuyi

+0

i là một tham chiếu thay thế cho đối tượng j. Vì vậy, một từ đồng nghĩa. Tuy nhiên, bạn đã nói rằng bạn không thể sử dụng 'i' để thay đổi đối tượng mà nó đang đề cập đến. Không có gì nói rằng bạn không thể sử dụng một số phương pháp khác để sửa đổi đối tượng mà tôi đề cập đến. Bạn đang hạn chế khả năng của tôi với tuyên bố đó, không cố gắng mở rộng chúng, và đó là tốt. –

+1

@xiaopang: ''i'' và '' j'' là tên. Cả hai đều đề cập đến cùng một đối tượng. Thường thì chúng ta nói rằng cái gì đó "là" tên của nó, hoặc tên "là" đối tượng. Ví dụ tôi có thể nói "Tôi là Steve". Nhưng đây là thuật ngữ không chính xác, cả hai đều không giống nhau. Tôi cũng có thể nói, "'Steve' bắt đầu bằng chữ 'S'". Điều đó không ngụ ý rằng * I * bắt đầu bằng vốn 'S'. Các dấu ngoặc kép xung quanh 'Steve' ở đó để chỉ ra rằng tôi đang nói về cái tên, không phải là đối tượng mà nó đề cập đến. 'i' và' j' là các từ đồng nghĩa vì chúng là cả hai tên cho cùng một đối tượng, nhưng các thuộc tính của chúng như các tên khác nhau. –

3
const int &i = j; 

Điều này tuyên bố tham chiếu đến số nguyên không đổi. Sử dụng tham chiếu này, bạn sẽ không thể thay đổi giá trị của số nguyên mà nó tham chiếu.

Bạn vẫn có thể thay đổi giá trị bằng cách sử dụng tên biến ban đầu j, không sử dụng tham chiếu hằng số i.

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