You are on page 1of 20

“The only way to learn a new programming language is by writing programs in it.

Brian W. Kernighan and Dennis M. Ritchie

Lập trình hướng đối tượng (object-oriented programming)

Mở rộng của C++


By Hoàng Hữu Việt
Email: viethh@vinhuni.edu.vn
Viện Kỹ thuật và Công nghệ, Đại học Vinh

Vinh, 9/2022
Mục đích và nội dung
 Mục đích
 Giới thiệu một số mở rộng của C++ hỗ trợ cho lập trình hướng đối tượng.
 Nội dung
 Toán tử xuất, toán nhập, toán tử phạm vi
 Biến tham chiếu
 Tham số ngầm định của hàm
 Hàm inline
 Định nghĩa chồng hàm, chồng toán tử
 Toán tử New và Delete
Toán tử xuất, nhập
 Yêu cầu: mở thư viện <iostream>
 Dùng lệnh: using namespace std (visual stdio .NET)
 Toán tử xuất: <<
 Cú pháp: cout << [biểu thức 1] << [biểu thức 2] << ...
 Biểu thức xâu có thể chứa các ký tự điều khiển (\n, \t, ...).
 Không cần định dạng dữ liệu khi xuất.
 Toán tử nhập: >>
 Cú pháp: cin >> [biến 1] >> [biến 2] >>...
 Biến phải được khai báo trước.
 Không cần định dạng dữ liệu nhập.
 Không nhận dữ liệu nhập là dấu cách, dấu tab.
Toán tử xuất, nhập
 Ví dụ 2.1: viết chương trình 1 #include <iostream>
2 using namespace std;
tính diện tích và chu vi của hình
3 float dientich(float a, float b){
chữ nhật. 4 return a*b;
 Bài tập: viết chương trình nhập 5 }
6 float chuvi(float a, float b){
vào 1 mảng 2 chiều n dòng, m
7 return 2*(a + b);
cột các số thực. In mảng đã 8 }
nhập dạng ma trận và ma trận 9 int main(){
chuyển vị. 10 float a, b;
11 cout<<“\n nhap a = “; cin>>a;
12 cout<<“\n nhap b = “; cin>>b;
13 cout<<“dien tich :”<<dientich(a,b);
14 cout<<“chu vi :”<<chuvi(a,b);
15 }
Toán tử phạm vi
 Khi có một khai báo trùng tên giữa biến 1 #include <iostream>
cục bộ trong hàm và biến tổng thể, nếu 2 using namespace std;
truy nhập đến biến trùng tên trong hàm 3 int i = 5;
4 int main(){
thì bộ biên dịch hiểu là truy nhập biến
5 int i=2, j=3;
cục bộ.
6 i++;
 Để truy nhập đến biến tổng thể, sử dụng 7 i += i:: +j;
toán tử phạm vi (::). 8 j++;
9 i:: += i + j;
 Ví dụ tìm giá trị của i cục bộ, i tổng thể. 10 }

 Giá trị i cục bộ ?


 Giá trị i tổng thể?
Biến tham chiếu
 Biến tham chiếu (reference) là bí danh 1 #include <iostream>
của một đối tượng. 2 using namespace std;
3 int main(){
 Một biến tham chiếu dùng để tham
4 int i = 2, j = 3;
chiếu tới một biến cùng kiểu trong bộ
5 int &r = i;
nhớ. 6 i++;
 Các phép toán thao tác trên biến tham 7 r = 6;
chiếu thực chất là tham chiếu đến biến 8 int &p = j;
nhớ mà nó tham chiếu đến. 9 p = i;
10 }
 Khai báo:
<Kiểu dữ liệu> &<biến tham chiếu> = <tên biến>;
i r p j
 Ví dụ tìm giá trị của i, j, r, p
Tham số hàm là tham chiếu
1 #include <iostream>
 Khi khai báo biến tham chiếu phải using namespace std;
2
xác lập biến mà nó tham chiếu 3 void swap1(float x, float y){
đến. 4 float t = x; x = y; y= t;
5 }
 Biến tham chiếu là 1 kiểu dữ liệu 6 void swap2(float *x, float *y){
nên có thể dùng làm tham số cho 7 float t = *x; *x = *y; *y= t;
hàm. 8 }
9 void swap3(float &x, float &y){
 Khi sử dụng biến tham chiếu làm 10 float t = x; x = y; y= t;
tham số hàm, chương trình dịch sẽ 11 }
truyền địa chỉ của biến cho hàm 12 int main(){
13 int x = 2, y = 3;
(truyền tham biến). 14 swap1(x,y); // x = ?, y = ?
 Ví dụ xét 3 hàm sau, hàm nào hoán 15 swap2(&x,&y); // x = ?, y = ?
16 swap3(x,y); // x = ?, y = ?
đổi được giá trị của x và y ? }
17
Tham số ngầm định của hàm
 Đối với hàm định nghĩa tham số 1 #include <iostream>
2 using namespace std;
ngầm định, khi gọi hàm có thể 3 float dientich(float a=1, float b=2){
khuyết các tham số có giá trị 4 return a*b;
ngầm định, khi đó hàm lấy giá 5 }
6 float chuvi(float a, float b = 0){
trị truyền vào là giá trị ngầm
7 return 2*(a + b);
định. 8 }
9 int main(){
 Ví dụ 2.5: Viết các hàm tính 10 cout<<“dientich :”<<dientich();
diện tích và chu vi hình chử 11 cout<<“dien tich :”<<dientich(3);
nhật có định nghĩa các tham số 12 cout<<“dien tich :”<<dientich(2,3);
13 cout<<“chu vi :”<<chuvi();
có giá trị ngầm định. cout<<“chu vi :”<<chuvi(3);
14
 Lỗi ở lệnh nào? 15 cout<<“chu vi :”<<chuvi(2,3);
16 }
Tham số ngầm định của hàm
 Các tham số ngầm định phải đặt ở cuối danh sách các tham số của hàm.
Khi 1 tham số phía sau không có giá trị ngầm định thì các tham số trước
nó cũng không có giá trị ngầm định.
 void f(int a, int b = 1, int c = 2) // OK
 void f(int a, int b = 1, int c) // !OK
 Các tham số ngầm định có thể lấy giá trị của 1 biểu thức.
Hàm inline
 Khi có 1 lời gọi hàm trong chương
trình, chương trình phải:
 Lưu các trạng thái đang thực hiện dở.
Lưu địa chỉ trở về.

Chương trình

hàm
 Chuyển sang thực hiện hàm. Lời gọi hàm

 Cấp phát bộ nhớ cục bộ của hàm.


 Thực hiện hàm.
 Giải phóng vùng nhớ cục bộ.
 Khôi phục các trạng thái đã cất và thực
hiện tiếp chương trình.
Hàm inline
 Nếu hàm đơn giản, chỉ có ít dòng lệnh thì thời gian gọi hàm lâu hơn thời
gian thực hiện hàm.
 Để tránh điều này  định nghĩa hàm inline.
 Định nghĩa hàm inline: Thêm từ khoá inline lên đầu hàm thông thường.
 Khi có lời gọi hàm ở đâu thì bộ biên dịch chèn trực tiếp đoạn mã của
hàm vào mà không gọi theo cách thông thường.
 Ví dụ 2.6: định nghĩa hàm inline tìm giá trị lớn nhất của 2 biến số thực:
inline float max(float x, float y){
return (x>y)? x:y;
}
 Những hàm có cấu trúc lặp không nên định nghĩa là hàm inline.
Định nghĩa chồng hàm
1 #include <iostream>
 Định nghĩa chồng hàm là định 2 #include <string.h>
nghĩa các hàm trùng tên mà 3 using namespace std;
có các tham số khác nhau. 4 int mymax(int x = 0, int y = 0){
5 return (x > y) ? x : y;
 Khi gọi hàm, trình biên dịch 6 }
7 float mymax(float x, float y){
dựa vào tham số hàm để xác return (x > y) ? x : y;
8
định hàm nào được gọi. 9 }
10 char* mymax(char *x, char *y){
11 return (strcmp(x,y) > 0) ? x : y;
12 }
13 int main(){
14 cout<<"\n Max = "<<mymax(2,5);
15 cout<<"\n Max = "<<mymax(2.5,5);
16 char x[] = "abc", y[] = “xyz";
17 cout<<"\n Max = "<<mymax(x,y);
18 }
Định nghĩa chồng toán tử
 Định nghĩa các toán tử trùng tên  Phương án 1: viết các hàm dạng:
cho các kiểu dữ liệu khác nhau. ps cong(ps a, ps b){
 Ví dụ 2.7: cho cấu trúc phân số ps c;
như sau: c.ts = a.ts*b.ms + a.ms*b.ts;
struct ps{ c.ms = a.ms*b.ms;
int ts; return c;
int ms; }
}; ps tru(ps a, ps b){
ps c;
 Định nghĩa các phép toán +, -, *,
c.ts = a.ts*b.ms - a.ms*b.ts;
/, -(đảo dấu)...? c.ms = a.ms*b.ms;
return c;
}
Định nghĩa chồng toán tử
 Sử dụng các hàm đã viết tính giá trị của:
 s1 = -a+b–c;
 s2 = -a*b+c*d-e;
 với a, b, c, d, e là các phân số.
 Cách viết:
 s1 = cong(daodau(a),tru(b,c)) hoặc
 s1 = tru(cong(daodau(a),b),c)
 Chú ý:
 Cách biểu diễn là không duy nhất.
 Cách biểu diễn rất phức tạp, không thể hiện rõ công thức
 Tại sao nếu a, b, c là các số nguyên hoặc số thực thì dử dụng được +, -, ?
Định nghĩa chồng toán tử
 Phương án 2: định nghĩa chồng  Định nghĩa toán tử + và – cho ps:
toán tử ps operator + (ps a, ps b){
 Định nghĩa toán tử giống như định ps c;
nghĩa hàm, chỉ thay tên hàm bằng từ c.ts = a.ts*b.ms + a.ms*b.ts;
khoá operator <toán tử>. c.ms = a.ms*b.ms;
 Cú pháp: return c;
}
<type> operator <toán tử> (tham số){
ps operator - (ps a, ps b){
<nội dung>
ps c;
}
c.ts = a.ts*b.ms - a.ms*b.ts;
 <type> là kiểu dữ liệu trả về của hàm c.ms = a.ms*b.ms;
 <toán tử> là các phép toán. return c;
}
Định nghĩa chồng toán tử
 Ví dụ 2.8. Cho cấu trúc phân số
struct ps{
int ts;
int ms;
}
 Viết hàm nhập 1 phân số (hoặc toán tử nhập)

 Viết hàm in 1 phân số (hoặc toán tử xuất)


 Viết hàm rút gọn 1 phân số

 Định nghĩa các toán tử: +, *, >

 Viết chương trình nhập vào 1 mảng a gồm n phân số


 Tính tổng và tích của mảng
 Tìm phân số lớn nhất, bé nhất
Toán tử new và delete
 Toán tử new
 Dùng để cấp phát bộ nhớ động
 Cú pháp: <con trỏ> = new <type>[n] (n > 0)
 Ví dụ:
 float *x = new float[50];
 char *s = new char[30];
 Toán tử delete
 Dùng để xoá vùng nhớ đã cấp bởi toán tử new.
 Ví dụ: delete x; delete a;
Bài tập
 Bài 1: Cho cấu trúc phân số
struct ps{
int ts;
int ms;
};
 Viết hàm nhập 1 phân số (hoặc toán tử nhập)

 Viết hàm in 1 phân số (hoặc toán tử xuất)


 Viết hàm rút gọn 1 phân số

 Định nghĩa các toán tử: +, -, *, /, - (đảo dấu).

 Định nghĩa các toán tử so sánh: >, >=, <, <=, ==, !=;

 Định nghĩa các toán tử: ++, --, +=, -=, *=.

 Viết chương trình nhập vào 2 phân số, minh hoạ các phép toán trên.
Bài tập
 Bài 2: Cho cấu trúc số phức
struct complex{
foat pt;
float pa;
}
 Viết hàm nhập 1 số phức

 Viết hàm in 1 số phức

 Định nghĩa các toán tử: +, -, *.

 Viết chương trình nhập 2 số phức, tính và in ra tổng, hiệu, tích của chúng.
Kết thúc

You might also like