2011-01-17 77 views
10

thể trùng lặp:
What is this weird colon-member syntax in the constructor?Điều gì: :: có nghĩa là trong C++?

Tôi nghĩ tôi biết tất cả mọi thứ nhưng một cái gì đó luôn luôn dường như bật lên. Có lẽ tôi đang quên thứ gì đó. Ý nghĩa của : ::name là gì? Tôi nghi ngờ ::google có nghĩa là sử dụng không gian tên toàn cầu google, protobuf, message. Nhưng những gì hiện : làm trước khi nó? Không có văn bản ở bên trái vì vậy nó không thể là một nhãn (hoặc có thể nó ?!). Vậy đo la cai gi?

Namespace::Namespace() 
    : ::google::protobuf::Message() { 
    SharedCtor(); 
} 

-edit- Tôi cảm thấy ngớ ngẩn, sự nuông chiều có được tôi. Tôi nghĩ tôi đang nhìn vào bên trong cơ thể chức năng. Tôi đã rất hy vọng nó sẽ là một cái gì đó mới.

+0

Là 'Không gian tên' là một lớp học? – Naveen

+4

Dường như vậy, và nó có vẻ được bắt nguồn từ :: google :: protobuf :: Message. – EboMike

+6

Nếu bạn không biết về tính năng ngôn ngữ cơ bản quan trọng như * danh sách khởi tạo constructor *, thì bạn vẫn còn rất xa "biết mọi thứ". – AnT

Trả lời

12

Dấu hai chấm đầu tiên : thực sự là có dấu hiệu cho thấy những gì sau đây là danh sách khởi tạo. Điều này có thể xuất hiện trong một hàm tạo của lớp như một cách để cung cấp cho các thành viên dữ liệu của lớp đó một số giá trị ban đầu (do đó tên) trước khi phần thân của hàm tạo thực sự thực hiện.

Một ví dụ nhỏ, định dạng khác nhau:

class Foo { 
public: 
    Foo() : 
     x(3),  // int initialized to 3 
     str("Oi!"), // std::string initialized to be the string, "Oi!" 
     list(10) // std::vector<float> initialized with 10 values 
    { /* constructor body */ } 

private: 
    int x; 
    std::string str; 
    std::vector<float> list; 
}; 

EDIT

Là một lưu ý bổ sung, nếu bạn có một lớp mà lớp con khác, cách bạn gọi constructor lớp cha của bạn là chính xác như thế này , bên trong danh sách khởi tạo. Tuy nhiên, thay vì chỉ định tên của một thành viên, bạn chỉ định tên của lớp cha.

7

:: đề cập đến phạm vi toàn cầu. Ví dụ:

void f() { ... } // (1) 

namespace ns 
{ 
    void f() { ... } // (2) 

    void g() 
    { 
     f(); // calls (2) 
     ::f(); // calls (1) 
    } 
} 
+0

-1 tôi đã là: là toàn cầu. và nó không trả lời tôi là gì, ':' là gì. –

+0

@ acidzombie24 Chờ đã, bạn bỏ phiếu cho tôi không phải vì những gì tôi nói là sai (mà nó không phải là), nhưng bởi vì tôi đã nói với bạn một cái gì đó bạn đã biết? –

+1

không, tôi đã bỏ phiếu vì bạn không trả lời câu hỏi của tôi. > "Tên: :: name có nghĩa là gì?" Và "Nhưng cái gì làm: làm trước nó?" –

19

Trong một hàm tạo, sử dụng dấu hai chấm được sử dụng để khởi tạo biến và/hoặc gọi hàm tạo gốc. Ví dụ:

struct foo { 
    foo(); 
    foo(int var); 
}; 

struct bar : public foo { 
    bar(); 
    int x; 
}; 

Bây giờ bạn có thể làm nhà xây dựng thanh như thế này:

bar::bar() 
: x(5) 
{ 
} 

Điều đó đặt x đến 5. Hoặc:

bar::bar() 
: foo(8) 
, x(3) 
{ 
} 

Đó sử dụng constructor thứ hai foo với 8 như một đối số, sau đó đặt x thành 3.

Nó trông có vẻ hài hước trong mã của bạn vì bạn có sự kết hợp của : để khởi tạo và :: để truy cập không gian tên chung.

+0

Tôi cảm thấy ngớ ngẩn, tôi nghĩ tôi đang nhìn vào bên trong cơ thể chức năng. +1 và được chấp nhận. –

+2

Không có lý do gì để cảm thấy ngớ ngẩn. Tôi đã nhìn thấy rất nhiều thứ khiến tôi thực hiện một cú đúp ở lần đầu tiên. Một số ngôn ngữ lập trình có thể thực sự gây rối với tâm trí của bạn :) – EboMike

+0

cảm ơn rất nhiều EboMike để nhận xét đầy đủ và rõ ràng. – Chavoosh

3

Dường như đang làm việc với thừa kế, mở rộng từ không gian tên chung.

class baseClass{ 
    public: 
    int someVal; 
}; 

class childClass : baseClass 
{ 
    public: 
    int AnotherVal; 
} 

Các câu trả lời khác được cung cấp sau này mạnh mẽ hơn nhiều.