17
REVIEW C++ AND IMPROVE YOUR SKILL Escape Sequence Type Casting: Ép kiểu Nếu m = 2 thì static_cast<double>(m) = 2.0 4 loại ép kiểu:

REVIEW C++

Embed Size (px)

DESCRIPTION

C==

Citation preview

Page 1: REVIEW C++

REVIEW C++ AND IMPROVE YOUR SKILL

Escape Sequence

Type Casting: Ép kiểu

Nếu m = 2 thì static_cast<double>(m) = 2.0

4 loại ép kiểu:

Page 2: REVIEW C++

Toán tử:

throw : đưa vào loại trừ.

Kiểu liệt kê: enum

Comma operator – toán tử ,

Tính một danh sách các phép toán và giá trị trả về biểu thức ở cuối cùng.

result= ( first=2 , second=first+1 );

result = 3.

Một số hàm trong thư viện cmath

Page 3: REVIEW C++

Hàm exit

Định nghĩa trong thư viện cstdlib,

exit (một¿) ;

Khi hàm exit gọi chương trình kết thúc chương trình ngay lập tức. số nguyên là bất kì, thông thường 1 là để gọi exit gây ra 1 lỗi, và 0 là các trường hợp còn lại.

Mảng đa chiều

Vector

Page 4: REVIEW C++

Sử dụng như một mảng và có thể tăng độ dài của nó trong khi chương trình đang chạy,

Khai báo một vector kiểu int:

vector<∫ ¿v ;

Chú ý: vector<kiểu>tênbiến ; là một template class.

Chỉ số phần tử bắt đầu từ 0 giống như mảng.

[ ]ngoặc vuông được sử dụng để đọc những phần tử này. v [i ]=42

Một hạn chế sử dụng với vector là có thể sử dụng v[i] để thay đổi giá trị của phần tử thứ i. Tuy nhiên không thể khởi tạo phần tử thứ i mà sử dụng v[i]. CHỈ CÓ THỂ THAY ĐỔI ĐƯỢC PHẦN TỬ ĐÃ CÓ GIÁ TRỊ RỒI.

Để thêm một phần tử cho một vector sử dụng: pushback

Ví dụ trên gán giá trị ban đầu cho các phần tử 0,1,2

Size : số phần tử trong vector. sample .¿¿ ;

- Khởi tạo với số phần tử định trước:vector<∫ ¿v (10 );

Tạo ra một vector với 10 phần tử đầu tiên = 0 và v.size() = 10;Ví dụ:

Page 5: REVIEW C++

In ra màn hình:

Page 6: REVIEW C++

Khi đặt khai báo vector với 10 phần tử. Để thêm phần tử lớn hơn 10 sử dụng push_pack

Capacity ≠ size

Capacity là số các phần tử hiện tại với bộ nhớ được cấp phát.

Hàm thành viên: capacity();

Không nhầm lẫn capacity và size.

OVERLOADING BASICS

Overloading unary operators

Unary operators là toán tử chỉ chứa một đối, ví dụ như phép lấy âm “ – “, “++”, “- -“

Page 7: REVIEW C++

Với unary operators, do toán hạng đầu tiên gọi đến một đối tượng, trong hầu hết trường hợp nên thêm const vào cuối của khai báo toán tử. Khi toán tử được gọi nó sẽ không thay đổi đối tượng.

SEPARATE COMPILATION

Header file

¿ include”data.h”;

Tổ hợp các file header được gọi là một project. Sử dụng các header để insert các interference thư viện vào chương trình main. (trong UNIX sử dụng makefile)

Using #ifndef

Giả sử có một file chứa vài classes, và mỗi class có thể sử dụng trong những file riêng biệt và CÓ NHIỀU HƠN một lần một số file được include .

Ví dụ: #include “dtime.h” được include ở một số file

Để tránh vấn đề này , sử dụng define

#define DTIME_H

Compile chỉ ra rằng DTIME_H đã được thấy rồi,

Tiếp theo:

#ifndef DTIME_H

#define DTIME_H

<the statements>

#endif

Giải thích:

Nếu DTIME_H chưa được định nghĩa thì compile sẽ định nghĩa DTIME_H rồi biên dịch các statement bên trong. Đến khi được gọi tiếp thì DTIME_H đã được định nghĩa và nó sẽ không phải biên dịch lại lần nữa.

NAMESPACES

Page 8: REVIEW C++

Khi một chương trình sử dụng các lớp khác nhau và các hàm khác nhau bởi các chương trình khác nhau thì có trường hợp nếu có 2 chương trình sử dụng tên giống nhau cho 2 thứ khác nhau. Namespaces là cách để giải quyết vấn đề này.

Một namespace là một bộ các tên được định nghĩa như là định nghĩa lớp, định nghĩa biến.

Namespace có thể là ý thức,có thể bị turn on và off khi một số tên của nó gây xung đột với tên trong namespace khác.

std namespace bao gồm tất cả các file trong thư viện chuẩn C++.

Ví dụ:

#include<iostream>

Nó đặt tất cả các tên định nghĩa ( như là cin hay cout) vào std namespace.

Chương trình sẽ không biết về các tên trong std namespace cho tới khi nó được khai báo, sử dụng chỉ dẫn using:

using namespace std ;

Mọi code được viết ra đều có một số tên, nếu không đặt các code này cho những namespace riêng thì nó sẽ được đưa vào global namespace.

Global namespace không có chỉ dẫn using vì nó luôn luôn là toàn cục (hiểu rằng using bị ẩn).

Chú ý: có thể sử dụng nhiều hơn một namespace trong cùng chương trình. Ví dụ : thường sử dụng global namespace và luôn sử dụng std namespace, tuy nhiên sẽ có lỗi xảy ra nếu như định một tên trong 2 namespace và sử dụng cả 2 namespace đó.

Chỉ có thể sử dụng được 2 tên được định nghĩa giống nhau trong 2 namespace khác nhau khi sử dụng riêng từng cái. Tuy nhiên không có nghĩa là không thể sử dụng 2 namespace trong cùng một chương trình.

Ví dụ:

Giả sử NS1 và NS2 là 2 namespace đã được đặt và myFunction alf một hàm void không có đối đượng định nghĩa theo 2 cách khác nhau trong 2 namespace. Điều sau là hợp lệ:

Page 9: REVIEW C++

Khối thứ nhất sử dụng định nghĩa của myFunction trong namspace NS1 và khối thứ 2 sử dụng trong NS2.

Chỉ dẫn using là chỉ áp dụng trong một khối. Do vậy thông thường đặt using ở đầu mỗi khối.

TẠO MỘT NAMESPACE

Để đặt một số code trong một namespace, đặt theo dạng:

Khi include 1 trong những nhóm này ở trong code nghĩa là đang nói đến tên được định nghĩa của Some_code trong Name_Space_Name.

Những tên này có thể được tạo ra có sẵn sử dụng chỉ dẫn using:

using namesapce Name¿

Ví dụ:

Page 10: REVIEW C++
Page 11: REVIEW C++

Bắt đầu hàm main:

Gọi hàm greeting(); đầu tiên sử dụng chỉ dẫn using namespace Sapce2 → gọi tới greeting được định nghĩa trong 2.

Tiếp theo hàm greeting được gọi từ Sapce1 → gọi tới greeting trong 1.

Ra khỏi khối gọi tới bigGreeting() → gọi tới trong hàm chính với namespace là std;

Kết quả:

Chú ý là bạn có thể có bất kì những nhóm namespace cho các namespace đơn. Trong ví dụ trên sử dụng 2 nhóm namespace cho namespace Space1 và Space2.

USING DECLARATIONS

Tình huống: có 2 namespace NS1, NS2. Hàm fun1 trong NS1 , fun2 trong NS2.

Page 12: REVIEW C++

Muốn viết hàm myFunction gọi tới cả fun1 và fun2. → sẽ có vấn đề trong việc khai báo:

→ xung đột không biết gọi tới namespace nào.

Để giải quyết sử dụng using declaration:

Định nghĩa One_name sẽ được gọi trong Name_Space

Có 2 cách khai báo chỉ dẫn using- using std∷ cout ;

- using namespace std ;

Điểm khác nhau là, với cách 1 chỉ tên trong namespace được đưa ra sử dụng, cách 2 thì toàn bộ các tên được sử dụng.

Trong trường hợp sử dụng:

Nếu gọi tới các tên trong NS1 và NS2 mà không có trường hợp bị trùng tên thì chương trình vẫn chạy không vấn đề.

Do đó câu lệnh sau là sai khi gọi myFunction():

using NS1∷myFunction

using NS2∷myFunction

Để tránh nhầm lẫn khi sử dụng với những hàm giống nhau thì viết đầy đủ:

Page 13: REVIEW C++

NS1∷ myFunction và NS2∷ myFunction

EXCEPTION

Một exception là một tình huống không mong muốn. ví dụ. đang viết một hàm trong một trang web, một số thứ có thể sai. Máy chủ internet bao gồm những trang có thể đi điến một black blank hoặc kết lỗi bị lỗi. Khi đó nó trả lại một giá trị đặc biệt nào đó như là NULL hay một mã lỗi. Exception cung cấp cách tốt hơn để giải quyết ván đề.

Exception đi cùng với một số thuật ngữ mới. Khi một phần cửa code phát hiện một tình huống exception, nó throw một exception. Một phần khác của code catches exception và xử lý cho đúng.

Ví dụ:

Hàm divideNumbes() có mẫu là số 0:

Khi throw thực hiện, hàm sẽ ngay lập tức kết thúc mà không trả về giá trị. Nếu người gọi bao quanh hàm với khối try/catch , nó sẽ nhận ngoại trừ và có thể xử lý nó:

Page 14: REVIEW C++

Khi đó hàm catch đã cho thấy cách xử lý khi mẫu là bằng 0.

Khác với Java, C++ không giúp bạn catch mọi exception có thể xảy ra. Nếu code không catch bất kì exception nào nhưng exception được throw nó sẽ kết thúc.

----

CLASS

STATIC MEMBERS

Khi cần một biến muốn share cho tất cả các đối tượng của một class. Ví dụ có một biến đếm cần để gọi bởi tất cả cá đối tượng trong class.

Biến này gọi là static được tạo ra trước khi đối tượng được tạo ra. Dùng chung cho tất cả các đối tượng của một class.

NEST và CLASS địa phương

Định nghĩa một class trong một class , class bên trong được gọi là nested class.

Page 15: REVIEW C++

Nested class có thể là public hay private. Nếu là private, nó không thể sử dụng bên ngoài class ngoài.

Dù nested class có là publich hay private thì nó vãn có thể sử dụng trong hàm thành viên định nghĩa ở class ngoài.

Nếu nested class là public thì ở bên ngoài có thể sử dụng với tên:

OuterClass∷ InnerClass

Để đảm bảo dữ liệu của đối tượng khi khai báo các member function trong class thường là const. những MF này gọi là inspector, và những MF non-const gọi là mutators.

Ví dụ:

Những hàm trả về đều có const ở cuối. những hàm void thao tác thì không.