Kiểu dữ liệu Kiểm soát kiểu dữ liệu chặt chẻ hơn C Hàm phải được khai báo trước khi sử dụng Không cho phép gán giá trị nguyên cho các biến kiểu enum... Đa năng hoá Overloading Cho phép đ
Trang 2Nội dung
1 Khái niệm cơ bản về ngôn ngữ C++
2 Một số thay đổi so với ngôn ngữ C
3 Một số bổ sung so với ngôn ngữ C
Trang 5Object Code
able
Execut-C++
COMPILER NATIVE
C++
TRANSLATOR
LINKER
C COMPILER
C++
Program
Trang 6Cấp phát bộ nhớTham chiếu
Trang 7Những từ khoá mới
Thay đổi định danh trong chương trình C khi chuyển qua C++ nếu trùng với keyword
virtual
Trang 8//This is the variable //being given a value
x = 5;
*/
Trang 9Kiểu dữ liệu
Bổ sung kiểu Boolean: bool
• Giá trị: true/ false
• Các toán tử logic (!, &&, ||), phép toán quan hệ (>, >=, <, <=, !=, ==) giá trị kiểu bool
Các biểu thức điều kiện (if, while, for, do … while) đòi hỏi phải là một giá trị kiểu bool
Trang 11Kiểu dữ liệu
Kiểm soát kiểu dữ liệu chặt chẻ hơn C
Hàm phải được khai báo trước khi sử dụng
Không cho phép gán giá trị nguyên cho các biến kiểu enum
Trang 12 int *ip = vp; // Error in C++
int * ip = (int *) vp; //OK
Trang 13Dòng nhập/ xuất chuẩn (Standard I/O
stream)
Nhập: lấy dữ liệu từ bàn phím, file, …
Xuất: xuất kết quả lên màn hình, ra file, …
Sử dụng hai đối tượng (object stream)
cout (console output)
cin (console input)
Trang 15Dòng nhập/ xuất chuẩn
Sử dụng thư viện theo không gian tên (namespace): C++
trên Net #include <iostream>
using namespace std;
void main() {
cout<<"Tong cua chung:"<<x+y<<"\n";
cout<<"Hieu cua chung:"<<x-y<<"\n";
}
Trang 195.3 5.339
Trang 21Chuyển kiểu dữ liệu
Tự động chuyển kiểu từ kiểu có giá trị thấp thành kiểu có giá trị cao hơn cho phù hợp với phép toan
char short int long float double
Tuy nhiên nếu chuyển ngược lại có thể gây mất dữ liệu TBD sẽ sinh warning đối với các trường hợp này
Trang 22• Để hạn chế các lỗi, C++ cung cấp một cách mới sử
dụng 4 loại chuyển kiểu tường minh:
static_cast reinterpret_cast
const_cast dynamic_cast float x = static_cast<float>(3)/4;
Trang 23Không gắn được kiểu dữ liệu với giá trị hằng
Trình debug không biết đến tên hằng
Trang 25int x=16;
cout <<"Bien x toan cuc:"<<x;
cout<<"Bien x trong ham main:"<<x;
cout<<"Bien x toan cuc:"<<::x;
}
Trang 26Kiểu có cấu trúc: struct, union, enum
Tên truct, union và enum được xem là tên kiểu dữ liệu
struct và union có thể được xem như lớp
float r, i;
};
Complex c;
Trang 27 new type_name initializer
new ( type_name ) initializer
Nếu cấp phát không thành công thì sẽ trả về giá trị NULL
Trang 31Hàm inline
Công dụng: chèn code của hàm ngay tại nơi gọi hàm tăng tốc độ chương trìnhThêm từ khoá inline trước hàm
Trang 32Hàm inline
Hàm inline sẽ làm cho kích thước chương trình tăng lên Thường là các hàm nhỏ, ít phức tạp (không được là hàm đệ quy)
inline float CircleArea(float r) {
return (3.14159*r*r);
}
Trang 33Gọi hàm với danh sách
đối số không đầy đủ
(nếu không thay đổi giá
trị mặc định)
float CircleArea(float r=5); void main()
{
x = CircleArea();//r=5
y = CircleArea(7);
} float CircleArea(float r) {
return (3.1415*r*r); }
Trang 35Tham số mặc định (default parameter)
int MyFunc(int a= 1, int b , int c = 3, int d = 4); //prototype sai!!! int MyFunc(int a, int b = 2 , int c = 3, int d = 4); //prototype đúng
………
MyFunc(5, 7); //OK, các tham số c và d lấy giá trị mặc định
MyFunc(5, 7, , 8); //Lỗi do các tham số bị bỏ phải liên tiếp nhau
Trang 36Tham chiếu (reference)
Tham chiếu tới một đối tượng là một bí danh tới đối tượng đó
Có thể xem mọi thao tác trên tham chiếu đều được thực hiện trên chính đối tượng nguồn
Cú pháp:
type_name & variable_name
Trang 37*p = 9;
cout << "x = " << x << " y = " << y << ".\n"; //x = 9 y = 9
Trang 38Tham chiếu
Lưu ý
Tham chiếu phải được khởi tạo
int & x; //Error
Nội dung của tham chiếu là địa chỉ của biến mà nó đại diện (tương tự biến con trỏ)
Trang 42Đa năng hoá (Overloading)
Cho phép đa năng hóa hàm và đa năng hóa toán tử
Là phương pháp cung cấp nhiều hơn một định nghĩa cho tên hàm đã cho trong cùng một phạm viTBD sẽ lựa chọn phiên bản thích hợp của hàm hay toán tử dựa trên các tham số mà nó được gọi
Trang 43Đa năng hoá (Overloading)
Quá trình gọi hàm đa năng hóa:
Nếu tìm thấy một hàm nào đó của một hàm đa năng hóa có các tham số trùng với các tham số trong gọi hàm hàm đó được sử dụng
Nếu không TBD tìm một phiên bản của hàm cho phép chuyển kiểu đơn giản nhất
Trang 44Đa năng hoá (Overloading)
double max(double d1, double d2)
Trang 45Đa năng hoá
Điều kiện
Số lượng tham số phải khác nhau
Kiểu của tham số phải khác nhau
Nếu cùng số lượng tham số thì phải có ít nhất 1 tham số khác kiểu
Trang 46Đa năng hoá toán tử (operator overloading)
Các toán tử +, - , * , /, … chỉ áp dụng đối với các kiểu cài sẵn (int, char, float, …)
Muốn dùng các toán tử này trên các kiểu dữ liệu tự định nghĩa thì phải sử dụng đa năng hoá toán tử
Trang 47Đa năng hoá toán tử
Một toán tử có thể dùng cho nhiều loại kiểu dữ liệuCác toán tử được chia thành hai loại
Toán tử một ngôi: chỉ có một toán hạng
Toán tử hai ngôi: có hai toán hạng
Toán tử một ngôi lại chia thành hai loại
Tiền tố: toán tử đặt trước toán hạng
Hậu tố: toán tử đặt sau toán hạng
Trang 48Đa năng hoá toán tử
Trang 49Từ khóa operator khai báo một hàm chỉ rõ ý nghĩa
của toán tử operator_symbol.
Trang 50Đa năng hoá toán tử
Số lượng tham số của hàm chính là số ngôi của toán tử
Các toán tử được đa năng hóa sẽ được lựa chọn bởi TBD cũng theo cách thức tương tự như việc chọn lựa giữa các hàm được đa năng hóa
Trang 51Đa năng hoá toán tử
struct Complex {
………
c = c1 + c2;
c = operator + (c1, c2);
Trang 52Đa năng hoá toán tử
Không thể định nghĩa toán tử mới
Phần lớn các toán tử được đa năng hóa
Ngoại trừ các toán tử
* :: ?: typeid sizeof const_cast dynamic_cast reinterpret_cast static_cast
Trang 53Đa năng hoá toán tử
Không thể đa năng hóa ký hiệu tiền xử lý
Không thể thay đổi độ ưu tiên của toán tử hay số các toán hạng của nó
Không thể thay đổi ý nghĩa của toán tử khi áp dụng các kiểu cài sẵn
Trong hàm định nghĩa toán tử không có các tham
số có giá trị mặc định
Trang 55Template
Được sử dụng khi có những đoạn mã tương đồng về công việc nào đó
VD: hàm tìm giá trị lớn nhất của hai số nguyên
Hàm này chỉ sử dụng cho 2 số nguyên, đối với số thực viết lại hàm có sự thay đổi về kiểu dữ liệu
int Max(int a, int b)
{
return (a>b) ? a : b;
}
Trang 56Template
Template để giải quyết vấn đề xử lý có tính chất tổng quát (genetic) với kiểu dữ liệu chưa xác địnhDựa vào template có thể tạo các công việc cụ thể (thực thể) theo một cách nào đó
Gồm 2 loại
Hàm template
Lớp template
Trang 60Hàm template
template <class T>
void MyFun(T x) {
Trang 61Hàm template
template <class T , int n>
int ZeroCount( T x[]) {
int a[10];
… int c=ZeroCount <int,10> (a);
… }
Trang 62Q&A