2010-11-06 67 views
13

Bản sao có thể xảy ra:
What is the difference between the dot (.) operator and -> in C++?
What is the arrow operator (->) synonym for in C++?Điều gì -> có nghĩa là trong C++?

Tiêu đề nói lên tất cả.

-> có nghĩa là gì trong C++?

+0

Bạn quen thuộc với ngôn ngữ nào? – Vlad

+0

Không chắc chắn ý nghĩa của bạn về "->". Nó chỉ là một công cụ hội nghị để truy cập các biến và chức năng của thành viên. Hi vọng điêu nay co ich. –

Trả lời

24

Đó là để truy cập vào một hàm thành viên hoặc biến thành viên của một đối tượng thông qua một con trỏ , như trái ngược với một biến bình thường hoặc tài liệu tham khảo.

Ví dụ: với biến hoặc tham chiếu thông thường, bạn sử dụng toán tử . để truy cập các hàm thành viên hoặc biến thành viên.

std::string s = "abc"; 
std::cout << s.length() << std::endl; 

Nhưng nếu bạn đang làm việc với một con trỏ, bạn cần phải sử dụng -> điều hành:

std::string* s = new std::string("abc"); 
std::cout << s->length() << std::endl; 

Nó cũng có thể bị quá tải để thực hiện một chức năng cụ thể cho một loại đối tượng nhất định. Các con trỏ thông minh như shared_ptrunique_ptr, cũng như các trình vòng lặp container STL, quá tải toán tử này để bắt chước ngữ nghĩa của con trỏ nguyên gốc.

Ví dụ:

std::map<int, int>::iterator it = mymap.begin(), end = mymap.end(); 
for (; it != end; ++it) 
    std::cout << it->first << std::endl; 
23

a->b có nghĩa là (*a).b.

Nếu a là một con trỏ , a->b là thành viên b trong đó a điểm đến.

a cũng có thể là một con trỏ giống như đối tượng (như một bài viết của vector<bool>) ghi đè các toán tử.

(nếu bạn không biết những gì một con trỏ là, bạn có một câu hỏi khác)

+0

Trừ khi đó là một lớp có toán tử bị quá tải. –

+3

Đó là một sự xấu hổ này có rất nhiều phiếu bầu, vì quá tải các nhà điều hành là phổ biến và một phần quan trọng của câu trả lời. –

+3

Tôi không biết (* a) .b có nghĩa là gì. –

0

viên b của đối tượng được trỏ đến bởi một a-> b

0

Các -> điều hành, được áp dụng riêng cho con trỏ, là cần thiết để có được những lĩnh vực cụ thể hoặc phương thức của đối tượng được tham chiếu bởi con trỏ. (điều này cũng áp dụng cho structs chỉ dành cho các trường của họ)

Nếu bạn có biến số ptr được khai báo là con trỏ bạn có thể nghĩ là (*ptr).field.

Một nút phụ mà tôi thêm vào chỉ để làm cho người dân hài lòng hạnh phúc: NHƯNG MỌI NGƯỜI MỞ RỘNG, bạn có thể xác định ngữ nghĩa khác của toán tử bằng cách nạp chồng cho lớp của bạn.

+0

Nó không áp dụng riêng cho con trỏ vì nó có thể bị quá tải như một toán tử lớp. Thành phần con trỏ chia sẻ thực hiện điều này giống như các trình vòng lặp cho các thùng chứa trong thư viện chuẩn. –

+0

có, tất nhiên nó có thể bị quá tải (như mọi toán tử) nhưng tôi đoán OP cần biết ngữ nghĩa ban đầu của toán tử .. – Jack

5

x-> y có thể có nghĩa là 2 điều. Nếu x là một con trỏ, thì nó có nghĩa là thành viên y của đối tượng được trỏ đến bởi x. Nếu x là một đối tượng có toán tử ->() bị quá tải, thì nó có nghĩa là x.operator ->(). điều hành

+0

No. Nếu x là đối tượng có toán tử-> quá tải, nghĩa là x.operator- >(), và nếu giá trị trả về cũng hỗ trợ toán tử->, thì nó có nghĩa là x.operator ->(). operator ->(). Toán tử-> không có đối số. – Puppy

+0

số điện thoại xấu của tôi, hiện đã được chỉnh sửa –

10
  1. Tiếp cận áp dụng đối với (a) tất cả các loại con trỏ, (b) tất cả các loại mà explicitely quá tải toán tử này
  2. người giới thiệu cho các kiểu trả về của một biểu thức lambda địa phương:

    std::vector<MyType> seq; 
    // fill with instances... 
    std::sort(seq.begin(), seq.end(), 
          [] (const MyType& a, const MyType& b) -> bool { 
           return a.Content < b.Content; 
          }); 
    
  3. giới thiệu loại trả lại theo sau của một hàm kết hợp với số được phát minh lại auto:

    struct MyType { 
        // declares a member function returning std::string 
        auto foo(int) -> std::string; 
    }; 
    
+0

+1 cho các loại trả lại. – Puppy

+0

Đừng quên # 2 áp dụng cho tất cả các loại trả về (lambdas và non-lambdas). –

+0

Nhập vào liệt kê abve. Không biết tại sao các ví dụ mã không hiển thị chính xác, nếu có ai biết điều gì đang xảy ra, vui lòng sửa định dạng. –