2013-03-26 36 views
13

Tôi đang học C++ và tôi không bao giờ có thể biết khi nào tôi cần sử dụng ::. Tôi biết rằng tôi cần sử dụng std:: ở phía trước coutcin. Điều này có nghĩa là bên trong tệp iostream các nhà phát triển đã tạo ra không gian tên được gọi là std và đặt các hàm cincout vào không gian tên được gọi là std? Khi tôi tạo một lớp mới không có cùng tệp với main() vì một lý do nào đó, tôi phải thêm ::.Sử dụng :: trong C++

Ví dụ: nếu tôi tạo class được gọi là A, tại sao tôi cần đặt A:: trước một chức năng mà tôi thực hiện, mặc dù tôi không đặt nó vào một tên gọi? Ví dụ: void A::printStuff(){}. Nếu tôi tạo một hàm trong main, tại sao tôi không phải đặt main::printStuf{}?

Tôi biết rằng câu hỏi của tôi có thể gây nhầm lẫn, nhưng ai đó có thể giúp tôi?

+2

Một câu hỏi tốt, nhưng một chút quá rộng (IMO). Đó được gọi là toán tử phân giải phạm vi và cụm từ tìm kiếm của bạn để tìm hiểu thêm là * scope *. Tất cả các tên ('cout', các hàm thành viên của' A') đều được định nghĩa trong * phạm vi * và bạn phải giải quyết phạm vi (nghĩa là, nói cho trình biên dịch biết nơi tìm) bằng '::'. – GManNickG

+0

Tiền tố của '::' có thể là một vùng tên hoặc một lớp. Vì 'main' không phải là (nó là một hàm),' main :: printStuff' sẽ không chính xác. –

+0

:: đưa ra ý tưởng về quyền sở hữu, khi định nghĩa là một phần của một lớp hoặc không gian tên, bạn nên sử dụng :: để truy cập nó ... không chính xác điều đó, nhưng điều đó mang đến cho bạn cảm giác. –

Trả lời

16

Bạn có khá nhiều quyền về coutcin. Chúng là các đối tượng (không phải các hàm) được định nghĩa bên trong không gian tên std. Dưới đây là tuyên bố của họ theo quy định của chuẩn C++:

Tiêu đề <iostream> tóm tắt

#include <ios> 
#include <streambuf> 
#include <istream> 
#include <ostream> 

namespace std { 
    extern istream cin; 
    extern ostream cout; 
    extern ostream cerr; 
    extern ostream clog; 

    extern wistream wcin; 
    extern wostream wcout; 
    extern wostream wcerr; 
    extern wostream wclog; 
} 

:: được gọi là các nhà điều hành giải quyết phạm vi. Tên coutcin được định nghĩa trong std, vì vậy chúng ta phải hội đủ điều kiện tên của họ với std::.

Lớp cư xử một chút như không gian tên trong đó các tên khai báo trong lớp thuộc về lớp. Ví dụ:

class foo 
{ 
    public: 
    foo(); 
    void bar(); 
}; 

Các nhà xây dựng tên foo là một viên của lớp tên foo. Họ có cùng tên bởi vì người xây dựng của nó. Chức năng bar cũng là một thành viên của foo.

Vì họ là thành viên của foo, khi đề cập đến họ từ bên ngoài lớp học, chúng tôi phải hội đủ điều kiện tên của họ. Xét cho cùng, họ thuộc về lớp đó.Vì vậy, nếu bạn đang đi để xác định các nhà xây dựng và bar bên ngoài lớp học, bạn cần phải làm điều đó như vậy:

foo::foo() 
{ 
    // Implement the constructor 
} 

void foo::bar() 
{ 
    // Implement bar 
} 

này là bởi vì họ đang được xác định ngoài lớp. Nếu bạn chưa đặt tiêu chuẩn foo:: vào tên, bạn sẽ xác định một số chức năng mới trong phạm vi toàn cầu, chứ không phải là thành viên của foo. Ví dụ, điều này là hoàn toàn khác nhau bar:

void bar() 
{ 
    // Implement different bar 
} 

Nó được phép có tên tương tự như chức năng trong lớp foo vì nó trong một phạm vi khác nhau. Điều này bar là trong phạm vi toàn cầu, trong khi khác bar thuộc về lớp foo.

+0

Cảm ơn! Câu trả lời hay nhất! – foobar5512

6

Các :: được gọi là toán tử phân giải phạm vi. có thể được sử dụng như thế này:

::định danh
class-name::định danh
namespace::định danh

Bạn có thể đọc về nó ở đây
http://msdn.microsoft.com/en-us/library/b451xz31(v=vs.80).aspx

+0

Không có gì sai với chuỗi chúng: 'myNamespace :: myClass :: myMember' hoặc' :: std :: cout'. – chris

+2

+1 để truy cập downvote không giải thích được –

7

Các :: được sử dụng cho phạm vi quan tâm.

const int x = 5; 

namespace foo { 
    const int x = 0; 
} 

int bar() { 
    int x = 1; 
    return x; 
} 

struct Meh { 
    static const int x = 2; 
} 

int main() { 
    std::cout << x; // => 5 
    { 
    int x = 4; 
    std::cout << x; // => 4 
    std::cout << ::x; // => 5, this one looks for x outside the current scope 
    } 
    std::cout << Meh::x; // => 2, use the definition of x inside the scope of Meh 
    std::cout << foo::x; // => 0, use the definition of x inside foo 
    std::cout << bar(); // => 1, use the definition of x inside bar (returned by bar) 
} 

không liên quan: cout và cin không hoạt động, nhưng trường hợp đối tượng luồng.

EDIT cố định như Keine Lust gợi ý

+0

Câu trả lời này khá rõ ràng. +1 – frankliuao

+1

Không nên là 'static const int x = 2;' trong 'meh'? –