Tải bản đầy đủ (.ppt) (44 trang)

Giáo án - Bài giảng: TÀI LIỆU LẬP TRÌNH OOP TRONG C++

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (9.43 MB, 44 trang )

GIỚI THIỆU MÔN HỌC
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
-
Thời lượng 30 tiết lý thuyết (2 chỉ), 30 tiết thực hành (1 chỉ)
-
Thi cuối kỳ lý thuyết: Trắc nghiệm (100%)
-
thực hành: làm bài tập lớn + báo cáo+ điểm danh (100%)
-
Tài liệu tham khảo:
1. Lập trình hướng đối tượng với C++, Lê Đăng Hưng, Tạ Tuấn Anh…
2. C how to program, Deitel, International edition, Prentice Hall, 2004
GIỚI THIỆU MÔN HỌC
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
-
Nội dung môn học
1. Lập trình hướng đối tượng – các khái niệm cơ bản
2. Các mở rộng của C++ so với C
3. Đối tượng và lớp
4. Định nghĩa toán tử trên lớp
5. Kỹ thuật thừa kế
6. Khuôn hình
CHƯƠNG 1:
CÁC KHÁI NIỆM CƠ BẢN
1. LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VÀ LẬP TRÌNH CẤU TRÚC
Lập trình cấu trúc:
Chương trình = Cấu trúc dữ liệu + giải thuật
Lập trình hướng đối tượng (Object oriented programming)
Đặt trọng tâm vào đối tượng
CHƯƠNG 1:
CÁC KHÁI NIỆM CƠ BẢN


1. LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VÀ LẬP TRÌNH CẤU TRÚC
Các đặc điểm của lập trình hướng đối tượng:
-
Tập trung vào dữ liệu thay cho các hàm
-
Chương trình được chia thành các đối tượng
-
Cấu trúc dữ liệu được thiết kế sao cho đặc tả được đối tượng
-
Các hàm thao tác trên các vùng dữ liệu của đối tượng được gắn với cấu dữ liệu đó
-
Dữ liệu được đóng gói lại, được che giấu và không cho phép các hàm ngoại lại truy nhập tự do
-
Các đối tượng tác động và trao đổi thông tin với nhau qua các hàm
-
Có thể dể dàng bổ sung dữ liệu và các hàm mới vào đối tượng nào đó khi cần thiết
-
Chương trình được thiết kế theo cách tiếp cận từ dưới lên
CHƯƠNG 1:
CÁC KHÁI NIỆM CƠ BẢN
1.LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VÀ LẬP TRÌNH CẤU TRÚC
Đối tượng (object)
-
Đối tượng là sự kết hợp giữa dữ liệu và phương thức - method (thủ tục, hàm) thao tác trên dữ liệu đó
Đối tượng = dữ liệu + phương thức
Lớp (class)
-
Lớp là một tập các đối tượng có cấu trúc dữ liệu và các phương thức giống nhau. Một đối tượng là một
thể hiện cụ thể (instance) của một lớp.
-

Trong lập trình ta có thể coi lớp như một kiểu dữ liệu, các đối tượng là biến có kiểu của lớp
Đóng gói
-
Đóng gói về chức năng: sử dụng các hàm hay thủ tục mà không cần biết đến nội dung bên trong nó,
người dùng chỉ cần biết chức năng và các tham số cần truyền vào để gọi hàm
-
Đóng gói dữ liệu: với mỗi đối tượng người dùng không thể truy cập trực tiếp vào các thành phần dữ
liệu của nó mà phải thông qua các phương thức
CHƯƠNG 1:
CÁC KHÁI NIỆM CƠ BẢN
1.LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VÀ LẬP TRÌNH CẤU TRÚC
Thừa kế (inheritance)
Kế thừa trong lập trình hướng đối tượng cho phép định nghĩa một lớp mới trên cơ sở lớp đã tồn tại và
bổ sung thêm các phương thức hay thành phần dữ liệu mới
Đa hình (polymorphime)
Các đối tượng khác nhau ứng xử với cùng một hành vi là khác nhau
Ví dụ:
- việc đi của xe đạp và xe hơi
- Tính diện tích của tam giác và đa giác
CHƯƠNG 1:
CÁC KHÁI NIỆM CƠ BẢN
1.LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VÀ LẬP TRÌNH CẤU TRÚC
Các ưu điểm của LTHĐT
-
Tính thừa kế
-
Xây dựng phần mềm theo quy trình không còn dựa chủ yếu vào kinh nghiệm -> rút ngắn thời gian, tăng
năng suất
-
Tính đóng gói tăng tính an toàn

-
Ánh xạ các đối tượng từ thế giới thực vào chương trình
-
Cách tiếp cận theo HĐT dể dàng cài đặt
-
Dể mở rộng và nâng cấp
-
Thuận tiện mô tả giao tiếp giữa hệ thống với thế giới bên ngoài
-
Quản lý được độ phức tạp của chương trình
CHƯƠNG 1:
CÁC KHÁI NIỆM CƠ BẢN
2. CÁC NGÔN NGỮ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Các ưu điểm của LTHĐT
-
Tính thừa kế
-
Xây dựng phần mềm theo quy trình không còn dựa chủ yếu vào kinh nghiệm -> rút ngắn thời gian, tăng
năng suất
-
Tính đóng gói tăng tính an toàn
-
Ánh xạ các đối tượng từ thế giới thực vào chương trình
-
Cách tiếp cận theo HĐT dể dàng cài đặt
-
Dể mở rộng và nâng cấp
-
Thuận tiện mô tả giao tiếp giữa hệ thống với thế giới bên ngoài
-

Quản lý được độ phức tạp của chương trình
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
1. CÁC ĐIỂM KHÔNG TƯƠNG THÍCH GIỮA C++ VÀ ANSI C
1.2 Khai báo hàm nguyên mẫu
-
Tronc C chỉ cần khai báo tên hàm và giá trị trả về, không cần danh sách kiểu
của các tham số
-
C++ khai báo hàm nguyên mẫu
Với C++ một lời gọi hàm chỉ được chấp nhận khi trình biên dịch biết được kiểu
của các tham số, kiểu của giá trị trả về
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
1. CÁC ĐIỂM KHÔNG TƯƠNG THÍCH GIỮA C++ VÀ ANSI C
1.2 Khai báo hàm nguyên mẫu
Chuyển kiểu tự động theo nguyên tắc sau:
char -> int ->longint -> float ->double
Ví dụ:
double ham(int , double) /* khai báo hàm ham*/
….
main()
{
int n;
char c;
double x, x1, x2,x3;
x1=ham(n,x); /* không có chuyển đổi kiểu*/
x2=ham(c,x); /* có chuyển đổi kiểu từ char->int*/
x3=ham(x,n); /* có chuyển đổi kiểu từ double ->int và từ int thành double */
….

CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
1. CÁC ĐIỂM KHÔNG TƯƠNG THÍCH GIỮA C++ VÀ ANSI C
1.3 Sự tương thích giữa con trỏ void và các con trỏ khác
Trong ANSI C, kiểu void tương thích với các kiểu con trỏ khác cả hai chiều
Ví dụ:
void *g;
int *i;
Phép gán sau là hợp lệ
g=i ;
i=g ;
Trong C++ chỉ có chuyển đổi kiểu ngầm định từ một kiểu con trỏ tùy ý thành void*,
còn ngược lại phải thực hiện chuyển đổi kiểu tường minh.
Ví dụ:
g=i;
i=(int*)g;
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
2. CÁC KHẢ NĂNG RA VÀO MỚI CỦA C++
Trong tệp tiêu đề isotream.h người ta định nghĩa hai đối tượng cout và cin tương
ứng với hai thiết bị chuẩn ra vào được sử dụng cùng với << và >>. Thường thì ta
hiểu cout là màn hình còn cin là bàn phím
2.1 Ghi dữ liệu ra thiết bị chuẩn cout
Ví dụ 1 :
#include <iostream.h>
main()
{
cout << “Hello C++”;
}
CHƯƠNG 2:

NHỮNG MỞ RỘNG CỦA C++
2. CÁC KHẢ NĂNG RA VÀO MỚI CỦA C++
2.1 Ghi dữ liệu ra thiết bị chuẩn cout
Sử dụng cout và << đưa ra các giá trị khác nhau
Ví dụ 2 :
#include <iostream.h>
void main()
{
int n=25;
cout << “value :“;
cout << n;
}
Ví dụ 3 :
#include <iostream.h>
void main()
{
int n=25;
cout << “value :“<<n ;
}
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
2. CÁC KHẢ NĂNG RA VÀO MỚI CỦA C++
2.1 Các khả năng viết ra trên cout
Có thể sử dụng toán tử << cùng với cout để đưa ra màn hình giá trị của một biểu
thức có các kiểu sau :

Kiểu cơ sở (char, int, float, double)

Xâu ký tự (char *)


Con trỏ (trừ con trỏ char *)
Trong trường hợp muốn đưa ra địa chỉ của xâu ký tự phải thực hiện việc chuyển đổi
kiểu tường minh (char*)->(void*)
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
2. CÁC KHẢ NĂNG RA VÀO MỚI CỦA C++
2.1 Các khả năng viết ra trên cout
Ví dụ:
#include <iostream.h>
void main()
{
int n=25;
long p=250000;
unsigned q=63000 ;
char c=’a’ ;
float x=12.3456789;
double y=12.3456789e16;
char *st= “Hello C++”;
int *ad=&n ;
cout <<”Gia tri cua n :” <<n<< “\n”;
cout <<”Gia tri cua p :” <<p<<”\n”;
cout <<”Gia tri cua c :” <<c<<”\n”;
cout <<”Gia tri cua q :” <<q<<”\n”;
cout <<”Gia tri cua x :” <<x<<”\n”;
cout <<”Gia tri cua y :” <<y<<”\n”;
cout <<”Gia tri cua st :” <<st<<”\n”;
cout <<”Dia chi cua ad :” <<ad<<”\n”;
cout <<”Dia chi cua st :”
<<(void*)st<<”\n”;
}

CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
2. CÁC KHẢ NĂNG RA VÀO MỚI CỦA C++
2.2 Đọc dữ liệu từ thiết bị chuẩn cin
Ví dụ 1:
int n;
cin>>n;
Ví dụ 2:
int n ;
float p ;
char c ;
cin>>c>>n>>p ;
Dùng toán từ >> để nhập dữ liệu cho các kiểu char, int, float, double và char*
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
2. CÁC KHẢ NĂNG RA VÀO MỚI CỦA C++
2.2 Đọc dữ liệu từ thiết bị chuẩn cin
Giống với hàm scanf(), cin tuân theo một số qui ước dùng trong việc phân tích các
ký tự

Các giá trị số được phân cách bởi : SPACE, TAB, CR, LF. Khi gặp một ký tự
không hợp lệ như dấu “.” đối với số nguyên, chữ cái đối với số, sẽ kết
thúc việc đọc cin, ký tự không hợp lệ này sẽ được xem xét trong lần đọc sau

Đối với gía trị xâu ký tự, dấu phân cách cũng là SPACE, TAB, CR còn đối
với gía trị ký tự, dấu phân cách là dấu CR. Trong hai trường hợp này không
có khái niệm “ký tự không hợp lệ”. Mã sinh ra do nhấn phím Enter của lần
nhập trước vẫn được xét trong lần nhập chuỗi hay ký tự tiếp theo và do đó
sẽ có nguy cơ không nhập được đúng giá trị mong muốn khi đưa ra lệnh
nhập xâu lý tự hoặc ký tự ngay sau các lệnh nhập cá giá trị khác. Giải pháp

khắc phục ta dùng một trong hai lệnh sau
fflush(stdin) ; // khai báo trong stdio.h
cin.clear(); // hàm thành phần của lớp cin
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
2. CÁC KHẢ NĂNG RA VÀO MỚI CỦA C++
2.2 Đọc dữ liệu từ thiết bị chuẩn cin
Ví dụ :
#include<iostream.h>
void main()
{
int n;
float x;
char t[81] ;
do
{
cout << “Nhap vao mot so nguyen, mot xau, mot so thuc : ” ;
cint >>n>>t>>x ;
cout << “Da nhap ”<<n<< “, ”<<t<< “va ”<<x<<“\n ” ;
} while (n) ;
}
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
3. NHỮNG TIỆN ÍCH CHO NGƯỜI LẬP TRÌNH
3.1 Ghi chú thích cuối dòng
C++ dùng // để chỉ ra một dòng là chú thích
Ví dụ
cout << ” Xin chao \n“ ; // xin chao
3.2 Khai báo mọi nơi
Ví dụ

{
int a ;
a=32 ;
cout <<a<< ” \n“ ;

int *p=&a ;
cout<< p <<” \n“

// chua co j
for (int j=0 ;j<10 ;j++)
….
}
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
3. NHỮNG TIỆN ÍCH CHO NGƯỜI LẬP TRÌNH
3.1 Toán tử phạm vi ::
Ví dụ 1:
int a=5 ;
main()
{
int a=10 ;
cout<<a ;

}
Ví dụ
Ví dụ
2:
2:
#include<iostream.h>
#include<iostream.h>

int a ;
int a ;
main()
main()
{
{


int a=10; // a cục bộ
int a=10; // a cục bộ


::a=10 ; // a toàn cục
::a=10 ; // a toàn cục


cout<<a; // a cục bộ
cout<<a; // a cục bộ


cout<<::a; // a toàn cục
cout<<::a; // a toàn cục
}
}
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
4. HÀM INLINE
Trong C++ ta có thể định nghĩa các hàm được thay thế trực tiếp thành mã lệnh máy
tại chổ gọi (inline) mỗi lần được tham chiếu. Ưu điểm của hàm inline là chúng không
đòi hỏi các thủ tục bổ sung khi gọi hàm và trả về giá trị. Do vậy, hàm inline được

thực hiện nhanh hơn so với các hàm thông thường
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
4. HÀM INLINE
Ví dụ :
Ví dụ :
#include<iostream.h>
#include<iostream.h>
#include<conio.h>
#include<conio.h>
inline long tong(int a[]); // khai báo
inline long tong(int a[]); // khai báo
hàm inline
hàm inline
void main()
void main()
{
{


int i;
int i;


int a[3];
int a[3];


for (i=0;i<3;i++)
for (i=0;i<3;i++)



a[i]=i;
a[i]=i;


cont<<”Tong cac phan tu trong mang
cont<<”Tong cac phan tu trong mang
la:”<<tong(a);
la:”<<tong(a);
getch();
getch();
}
}
// định nghĩa hàm inline
// định nghĩa hàm inline
inline long tong(int a[])
inline long tong(int a[])
{
{


int i;
int i;


long s=0;
long s=0;



for (i=0;i<3;i++)
for (i=0;i<3;i++)


s+=a[i];
s+=a[i];


return s;
return s;
}
}
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
5. THAM CHIẾU
Ngôn ngữ C++ giới thiệu một khái niệm mới là tham chiếu ”reference”. Một tham
chiếu có thể là một biến, tham số hình thức của hàm hay dùng làm giá trị trả về của
một hàm.
5.1 Tham chiếu tới một biến
Ví dụ:
int n ;
int &p=n ; //p là một biến tham chiếu, p tham chiếu tới vùng nhớ nơi n lưu trữ
Nếu viết:
n=7;
cout<<p;
Kết quả in ra là:
CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
5. THAM CHIẾU
5.1 Tham chiếu tới một biến

Tham chiếu và con trỏ giống nhau vì cùng chỉ đến các đối tượng có địa chỉ, cùng
được cập phát địa chỉ khi khai báo. Nhưng cách sử dụng thì khác nhau. Khi nói tới
tham chiếu ta phải gán nó với một biến nào đó đã khai báo, trong khi con trỏ thì
không nhất thiết phải khởi tạo giá trị cho nó. Con trỏ có thể tham chiếu tới nhiều
biến khác nhau con biến tham chiếu chỉ có thể tham chiếu tới một biến duy nhất lúc
khởi tạo nó.
Ví dụ :
Ví dụ :
int n=3, m=4 ;
int n=3, m=4 ;
int *p ;
int *p ;
p=&n ; // p chỉ tới n
p=&n ; // p chỉ tới n
*p=4 ;
*p=4 ;


p=&m ; // cho p chỉ tới m
p=&m ; // cho p chỉ tới m
int &q=n ; // khai báo biến tham
int &q=n ; // khai báo biến tham
chiếu q chỉ đến n
chiếu q chỉ đến n
q=4 ; // gán cho n giá trị là 4
q=4 ; // gán cho n giá trị là 4


q=m ; // gán m cho biến n
q=m ; // gán m cho biến n

CHƯƠNG 2:
NHỮNG MỞ RỘNG CỦA C++
5. THAM CHIẾU
5.1 Tham chiếu tới một biến
Ví dụ :
Ví dụ :
#include<iostream.h>
#include<iostream.h>
void main()
void main()
{
{


int x=3,&y; // sẽ báo lỗi vì y chưa
int x=3,&y; // sẽ báo lỗi vì y chưa
được khởi tạo
được khởi tạo




}
}
Ví dụ :
Ví dụ :
int &p=3; // không hợp lệ
int &p=3; // không hợp lệ
const int &p=3; // hợp lệ
const int &p=3; // hợp lệ

×