Friend { something } trong C++

namespace giống như thêm họ vô cho tên biến vậy đó. cin là biến thuộc họ std, cout cũng là biến thuộc họ là std, v.v… Khi xài cin/cout thì phải gọi đầy đủ cả tên lẫn họ: std::cin, std::cout.

using namespace std; là để chỉ cần gọi tên khỏi cần gọi họ.

đương nhiên là làm vậy thì có thể bị trùng tên: vd trong lớp có 2 bạn tên Nam, 1 bạn là Nguyễn::Nam, 1 bạn Trần::Nam thì nếu bạn using namespace Nguyễnusing namespace Trần thì khi bạn gọi Nam thì ko rõ là đang gọi bạn nào.

namespace nguyen { int nam; }
namespace tran { int nam; }

using namespace nguyen;
using namespace tran;

int main()
{
    nam = 0; //error: reference to ‘nam’ is ambiguous ("ambiguous" nghĩa là ko rõ ràng)
    nguyen::nam = 0; //ok
    tran::nam = 0; //ok
}

std là họ “chuẩn” (standard) của C++. Thư viện chuẩn của C++ thì nhiều vô kể, bỏ cái họ này đi thì 1 nùi tên riêng bị mất họ, khiến bạn đặt tên biến dễ bị trùng hơn, nên hạn chế using namespace. Cứ gọi cả tên lẫn họ cho quen.