Bạn có khá nhiều quyền về cout
và cin
. 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 cout
và cin
đượ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
.
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
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. –
:: đư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. –