[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):
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
Đăng nhận xét