[Học lập trình C++] Chương 1: 1.3a Làm quen với cout, cin, endl, std namespace, và sử dụng câu lệnh

1.3a Làm quen với cout, cin, endl, std namespace, và sử dụng câu lệnh
Std::cout
Như đã đề cập ở phần trước, std::cout (trong thư viện iostream) có thể được dùng để xuất chuỗi ra màn hình. Đây là chương trình Hello world:
#include <iostream>

int main()
{
    std::cout << "Hello world!";
    return 0;
}

Để in nhiều hơn một thứ trong cùng một dòng, toán tử xuất có thể được sử dụng nhiều lần. Ví dụ:
#include <iostream>

int main()
{
    int x = 4;
    std::cout << "x is equal to: " << x;
    return 0;
}
This program prints:
x is equal to: 4

Bạn mong đợi chương trình sẽ in ra cái gì?
1
2
3
4
5
6
7
8
#include <iostream>

int main()
{
    std::cout << "Hi!";
    std::cout << "My name is Alex.";
    return 0;
}
Bạn có thể ngạc nhiên với kết quả:
Hi!My name is Alex.

Std::endl
Nếu chúng ta muốn in nhiều hơn một dòng, chúng ta có thể sử dụng std::endl. Khi sử dụng std::cout, std::endl để chèn một kí tự dòng mới.
For example:
1
2
3
4
5
6
7
8
#include <iostream>

int main()
{
    std::cout << "Hi!" << std::endl;
    std::cout << "My name is Alex." << std::endl;
    return 0;
}
This prints:
Hi!
My name is Alex.

Std::cin
Std::cin thì trái ngược với std::cout – nơi mà std::cout in dữ liệu ra màn hình sử dụng toán tử xuất <<, std::cin đọc đầu vào từ người dùng tại màn hình sử dụng toán tử nhập >>. Bây giờ bạn có thể hiểu về biến, chúng ta có thể sử dụng std::cin để lấy ngõ vào từ người dùng và lưu nó vào biến.
1
2
3
4
5
6
7
8
9
10
11
//#include "stdafx.h" // Uncomment this line if using Visual Studio
#include <iostream>

int main()
{
    std::cout << "Enter a number: "; // ask user for a number
    int x = 0;
    std::cin >> x; // read number from console and store it in x
    std::cout << "You entered " << x << std::endl;
    return 0;
}

Thử biên dịch chương trình này và chạy. Khi bạn chạy chương trình, nó sẽ in “Enter a number: ” và sau đó đợi cho bạn nhập vào một số. Một khi bạn nhập một số (và nhấn enter), nó sẽ in ra “You entered” theo sau bởi số bạn đã nhập vào.
For example (I entered 4):
Enter a number: 4
You entered 4

Đó là cách dễ dàng để lấy đầu vào từ người dùng, và chúng ta sẽ sử dụng nó trong nhiều ví dụ tới.
Std::cin, std::cout, <<, >>
Người mới học lập trình thường nhầm lẫn std::cin, std::cout, << và >>. Đây là cách dễ nhớ chúng:
Std::cin và cout luôn nằm ở bên trái của câu lệnh.
Std::cout được dùng để xuất một giá trị
Std::cin được sử dụng để lấy một giá trị đầu vào.
<< được sử dụng với cout, và chỉ ra hướng của dữ liệu chuyển từ r-value ra màn hình console.
std::cout << 4 moves the value of 4 to the console
>> được sử dụng với cin, và chỉ ra hướng của dữ liệu được chuyển từ console vào biến
std::cin >> x moves the value from the console into x
std namespace
Tất cả mọi thứ trong thư viện chuẩn nằmbên trong một nơi chứa (được gọi là namespace)
Điều này có nghĩa là tên của std::cout không thực sự là “std::cout”. Nó thực ra chỉ là “cout”, và “std” là tên của namespace mà nó nằm trong.
Chúng ta sẽ nói nhiều về namespace trong bài học sau và cũng dạy bạn tự tạo một cái riêng. Bây giờ, chỉ có một thứ bạn cần phải biết về namespace là khi nào chúng ta sử dụng một cái gì đó (giống như cout) đó là một phần của thư viện chuẩn, chúng ta cần nói với trình biên dịch rằng nó nằm bên trong std namespace.
Namespace tường minh
Một cách để nói cho trình biên dịch biết rằng cout nằm trong std namespace là sử dụng “std::”.
std::cout << "Hello world!";
Đây là cách an toàn nhất khi sử dụng cout, bởi vì không có sự mơ hồ về nơi cout nằm.
Tuy nhiên, nếu bạn sử dụng thư viện chuẩn nhiều, gõ std:: trước mọi thứ bạn sử dụng từ thư viện chuẩn có thể làm cho nó bị lặp và khó có thể đọc. C++ cung cấp hai thứ đơn giản hơn.
Sử dụng khai báo
Một cách đơn giản đó là sử dụng câu lệnh khai báo using. Ví dụ
#include <iostream>

int main()
{
   using std::cout; // this using declaration tells the compiler that cout should resolve to std::cout
   cout << "Hello world!"; // so no std:: prefix is needed here!
   return 0;
}

Khai báo using “using std::cout;” nói cho trình biên dịch biết rằng chúng ta sẽ sử đụng đối tượng cout từ std namespace. Vì vậy bất cứ khi nào nhìn thấy “cout”, nó nên hiểu rằng chúng ta đang đề cập đến “std::cout”. Do đó, trong dòng 6, chúng ta có thể gõ “cout” thay vì “std::cout”.
Điều này không tiết kiệm được nhiều công sức trong ví dụ này, nhưng nếu bạn sử dụng cout (hoặc cin, hoặc endl) nhiều trong hàm, một khai báo using có thể làm cho code dễ đọc hơn.
Mặc dù phương pháp này không tường minh bằng việc sử dụng tiền tố “std::”, nó vẫn được coi là an toàn và chấp nhận được.
Chỉ thị using
Một cách khác đơn giản đó là câu lệnh chỉ thị using.  Ví dụ:
#include <iostream>

int main()
{
   using namespace std; // this using directive tells the compiler that we're using everything in the std namespace!
   cout << "Hello world!"; // so no std:: prefix is needed here!
   return 0;
}

Chỉ thị using “using namespace std;” nói với trình biên dịch rằng chúng ta muốn sử dụng mọi thứ trong thư viện std namespace, vì vậy nếu trình biên dịch tìm thấy một tên nào đó mà không nhận dạng được, nó sẽ kiểm tra trong std namespace. Do đó, khi trình biên dịch gặp “cout”. Nó sẽ tìm kiếm trong std namespace và tìm nó ở đó.
Có một cân nhắc mở về việc giải pháp này là tốt hay không. Bởi vì sử dụng chỉ thị kéo theo tất cả các tên trong một namespace, xác suất xảy ra việc trùng lặp tên tăng lên đáng kể.
Khai báo using và chỉ thị using bên trong hoặc bên ngoài của hàm
Nếu một khai báo using hoặc một chỉ thị using được dùng trong một hàm, tên nằm trong namspace chỉ trực tiếp được truy cập trong hàm đó. Điều này giới hạn xác suất trùng lặp tên xảy ra bên trong hàm. Tuy nhiên nếu khai báo using hoặc chỉ thị được sử dụng bên ngoài một hàm, tên của namspace được trực tiếp truy nhập bất kì đâu trong toàn file! Điều này có tăng nguy cơ trùng lặp tên
Ví dụ về xung đột tên
Cho mục đích minh họa, hãy quan sát một ví dụ sử dụng câu lệnh mà bị xung đột tên:
#include <iostream>

int cout() // declares our own "cout" function
{
    return 5;
}

int main()
{
    using namespace std; // makes std::cout accessible as "cout"
    cout << "Hello, world!"; // uh oh!  Which cout do we want here?

    return 0;
}

Trong ví dụ trên, trình biên dịch không thể xác định chúng ta muốn sử dụng std::cout hay là hàm cout mà chúng ta đã định nghĩa. Trong trường hợp này, sẽ không thể biên dịch với một lỗi “ambiguous symbol” . Mặc dù ví dụ này không đáng kể, nếu chúng ta có một tiền tốt std::cout giống như sau:
std::cout << "Hello, world!";

Hoặc dùng khai báo using thay thế chỉ thị using:
 using std::cout;
    cout << "Hello, world!";

sau đó chương trình của chúng ta sẽ không gặp vấn đề gì nữa.
Nhiều người tránh chỉ thị using hoàn toàn vì lý do này. Những người khác cho rằng chỉ chấp nhận sử dụng chúng trong một hàm riêng rẽ (giới hạn nơi mà trùng lắp tên có thể xảy ra)
Chú ý trong câu lệnh using.

Trong các ví dụ trên, chúng ta thông thường dùng phương pháp tường minh, dù trong trường hợp cụ thể, chúngta sẽ sử dụng chỉ thị using nằm trong hàm khi nó cải thiện tính dễ đọc. nó tùy thuộc vào bạn.
Nguồn: learncpp.com

Nhận xét

Bài đăng phổ biến