muathu0507
New Member
Download miễn phí Giáo trinh C++ và lập trình hướng đối tượng
Mục lục
Trang
Lời nói đầu 3
Chương 1. C++ và lập trình hướng đối tượng 6
§1. Làm việc với TC++ 3.0 6
§2. C và C++ 7
§3. Lập trình cấu trúc và lập trình hướng đối tượng 8
§4. Một số mở rộng đơn giản của C++ so với C 14
§5. Vào ra trong C++ 20
§6. Cấu trúc, hợp và kiểu liệt kê 25
§7. Cấp phát bộ nhớ 28
§8. Các hàm trong C++ 33
Chương 2. Hàm trong C++ 36
§1. Biến tham chiếu (Reference variable) 36
§2. Truyền giá trị cho hàm theo tham chiếu 40
§3. Hàm trả về các tham chiếu 47
§4. Đối có giá trị mặc định 51
§5. Các hàm trực tuyến (inline) 56
§6. Định nghĩa chồng các hàm (overloading) 61
§7. Định nghĩa chồng toán tử 69
§8. Các ví dụ về định nghĩa chồng toán tử 76
§9. Các bài toán về ma trận và vec tơ 83
Chương 3. Khái niệm về lớp 93
§1. Định nghĩa lớp 93
§2. Biến, mảng đối tượng 96
§3. Con trỏ đối tượng 100
§4. Đối của cách, con trỏ this 103
§5. Nói thêm về kiểu cách và kiểu đối của
cách 110
§6. Hàm, hàm bạn 123
§7. Phạm vi truy xuất 140
§8. cách toán tử 141
Chương 4. Hàm tạo, hàm huỷ và các vấn đề liên quan 150
§1. Hàm tạo (constructor) 150
§2. Lớp không có hàm tạo và hàm tạo mặc định 156
§3. Lớp đa thức 160
§4. Hàm tạo sao chép (copy constructor) 166
§5. Hàm huỷ (destructor) 176
§6. Toán tử gán 185
§7. Phân loại cách 193
§8. Hàm tạo và đối tượng thành phần 196
§9. Các thành phần tĩnh 206
§10. Mảng đối tượng 214
§11. Cấp phát bộ nhớ cho đối tượng 219
§12. Đối tượng hằng, cách hằng 224
§13. Hàm bạn, lớp bạn 229
Chương 5. Dẫn xuất và thừa kế 237
§1. Sự dẫn xuất và tính thừa kế 237
§2. Hàm tạo, hàm huỷ đối với tính thừa kế 245
§3. Phạm vi truy nhập đến các thành phần của lớp cơ sở 251
§4. Thừa kế nhiều mức và sự trùng tên 255
§5. Các lớp cơ sở ảo 260
§6. Một số ví dụ về hàm tạo, hàm huỷ trong thừa kế
nhiều mức 262
§7. Toán tử gán của lớp dẫn xuất 270
§8. Hàm tạo sao chép của lớp dẫn xuất 278
§9. Hàm phát triển, hoàn thiện chương trình 285
§10. Bổ sung, nâng cấp chương trình 291
§11. Từ khái quát đến cụ thể 310
§12. Toàn thể và bộ phận 316
Chương 6. Tương ứng bội và cách ảo 317
§1. cách tĩnh 317
§2. Sự hạn chế của cách tĩnh 323
§3. cách ảo và tương ứng bội 329
§4. Sự linh hoạt của cách ảo trong phát triển
nâng cấp chương trình 339
§5. Lớp cơ sở trừu tượng 343
§6. Sử dụng tương ứng bội và cách ảo 351
§7. Xử lý các thuật toán khác nhau 356
Chương 7. Các dòng tin (stream) 364
§1. Các lớp stream 364
§2. Dòng cin và toán tử nhập 365
§3. Nhập ký tự và chuỗi ký tự từ bàn phím 367
§4. Dòng cout và toán tử xuất 374
§5. Các cách định dạng 376
§6. Cờ định dạng 380
§7. Các bộ phận định dạng và các hàm định dạng 385
§8. Các dòng tin chuẩn 391
§9. Xuất và in ra máy in 393
§10. Làm việc với tệp 398
§11. Ghi dữ liệu lên tệp 400
§12. Đọc dữ liệu từ tệp 411
§13. Đọc ghi đồng thời trên tệp 419
§14. Xử lý lỗi 425
§15. Nhập xuất nhị phân 428
§16. Đọc ghi đồng thời theo kiểu nhị phân 431
§17. Xây dựng toán tử nhập xuất đối tượng trên tệp 437
§18. Hệ thống các lớp stream 443
Chương 8. Đồ hoạ 446
§1. Khái niệm đồ hoạ 446
§2. Khởi động hệ đồ hoạ 448
§3. Lỗi đồ hoạ 451
§4. Mầu và mẫu 452
§5. Vẽ và tô 454
§6. Chọn kiểu đường 460
§7. Cửa sổ (viewport) 464
§8. Tô điểm, tô miền 467
§9. Xử lý văn bản trên màn hình đồ hoạ 471
§10. Cắt hình, dán hình và tạo ảnh chuyển động 476
§11. Một số chương trình đồ hoạ 478
§12. In ảnh từ màn hình đồ hoạ 488
Chương 9. Truy nhập trực tiếp vào bộ nhớ 491
§1. Các hàm truy nhập theo địa chỉ phân đoạn 491
§2. Bộ nhớ màn hình văn bản 492
§3. Chuyển đổi địa chỉ 494
§4. Các ví dụ minh hoạ 495
Chương 10. Một số chương trình hướng đối tượng
trên C++ 504
§1. Lớp cửa sổ 504
§2. Lớp menu 512
§3. Lớp hình học 518
§4. Các lớp ngăn xếp và hàng đợi 525
§5. Các lớp sắp xếp 537
§6. Ví dụ về các lớp sắp xếp 544
Phụ lục 1. Thứ tự ưu tiên của các phép toán 550
Phụ lục 2. Các từ khoá của C++ 553
Phụ lục 3. Bảng mã ASCII và mã quyét 554
Phụ lục 4. Hàm với đối số bất định trong C 561
Phụ lục 5. Tóm tắt các hàm của Turbo C theo thứ tự
ABC 568
Phụ lục 6. Phân tích, thiết kế và lập trình hướng đối
tượng 577
§1. Phân tích hướng đối tượng 577
§2. Thiết kế hướng đối tượng 594
§3. Lập trình hướng đối tượng 618
http://cloud.liketly.com/flash/edoc/jh2i1fkjb33wa7b577g9lou48iyvfkz6-swf-2013-04-10-giao_trinh_c_va_lap_trinh_huong_doi_tuong.0Jt5ApGG1O.swf /tai-lieu/de-tai-ung-dung-tren-liketly-5848/
Để tải bản Đầy Đủ của tài liệu, xin Trả lời bài viết này, Mods sẽ gửi Link download cho bạn sớm nhất qua hòm tin nhắn.
Ai cần download tài liệu gì mà không tìm thấy ở đây, thì đăng yêu cầu down tại đây nhé:
Nhận download tài liệu miễn phí
Tóm tắt nội dung tài liệu:
< "\nDa thuc d " << d ;cout << "\nDa thuc u " << u ;
cout > d;
cout << "\nDa thuc d " << d ;
cout << "\nDa thuc u " << u ;
cout > u;
cout << "\nDa thuc d " << d ;
cout << "\nDa thuc u " << u ;
getch();
172 173
}
4.4. Ví dụ về hàm tạo sao chép
Trong chương trình trên đã chỉ rõ: Hàm tạo sao chép mặc định là chưa thoả mãn đối với lớp DT. Vì vậy cần viết hàm tạo sao chép để xây dựng đối tượng mới ( ví dụ u) từ một đối tượng đang tồn tại (ví dụ d) theo các yêu cầu sau:
+ Gán d.n cho u.n
+ Cấp phát một vùng nhớ cho u.a để có thể chứa được (d.n + 1) hệ số.
+ Gán các hệ số chứa trong vùng nhớ của d.a sang vùng nhớ của u.a
Như vây chúng ta sẽ tạo được đối tượng u có nội dung ban đầu giống như d, nhưng độc lập với d.
Để đáp ứng các yêu cầu nêu trên, hàm tạo sao chép cần được xây dựng như sau:
DT:T(const DT &d)
{
this->n = d.n;
this->a = new double[d.n+1];
for (int i=0;i<=d.n;++i)
this->a = d.a;
}
Chương trình sau sẽ minh hoạ điều này: Sự thay đổi của d không làm ảnh hưởng đến u và ngược lại sự thay đổi của u không làm ảnh hưởng đến d.
//CT4_08.CPP
// Viết hàm tạo sao chép cho lớp DT
#include
#include
#include
class DT
{
private:
int n; // Bac da thuc
double *a; // Tro toi vung nho chua cac he so da thuc
// a0, a1,...
public:
DT()
{
this->n=0; this->a=NULL;
}
DT(int n1)
{
this->n=n1 ;
this->a = new double[n1+1];
}
DT(const DT &d);
friend ostream& operator<< (ostream& os,const DT &d);
friend istream& operator>> (istream& is,DT &d);
} ;
DT:T(const DT &d)
{
this->n = d.n;
this->a = new double[d.n+1];
for (int i=0;i<=d.n;++i)
this->a = d.a;
}
ostream& operator<< (ostream& os,const DT &d)
{
174 175
os << " - Cac he so (tu ao): " ;
for (int i=0 ; i<= d.n ; ++i)
os << d.a <<" " ;
return os;
}
istream& operator>> (istream& is,DT &d)
{
if (d.a!=NULL) delete d.a;
cout << " - Bac da thuc: " ;
cin >> d.n;
d.a = new double[d.n+1];
cout << "Nhap cac he so da thuc:\n" ;
for (int i=0 ; i<= d.n ; ++i)
{
cout << "He so bac " << i << " = " ;
is >> d.a ;
}
return is;
}
void main()
{
DT d;
clrscr();
cout > d;
DT u(d);
cout << "\nDa thuc d " << d ;
cout << "\nDa thuc u " << u ;
cout > d;
cout << "\nDa thuc d " << d ;
cout << "\nDa thuc u " << u ;
cout > u;
cout << "\nDa thuc d " << d ;
cout << "\nDa thuc u " << u ;
getch();
}
§ 5. Hàm huỷ (Destructor)
5.1. Công dụng của hàm huỷ
Hàm huỷ là một hàm thành viên của lớp (cách) có chức năng ngược với hàm tạo. Hàm huỷ được gọi trước khi giải phóng (xoá bỏ) một đối tượng để thực hiện một số công việc có tính “dọn dẹp” trước khi đối tượng được huỷ bỏ, ví dụ như giải phóng một vùng nhớ mà đối tượng đang quản lý, xoá đối tượng khỏi màn hình nếu như nó đang hiển thị, ...
Việc huỷ bỏ một đối tượng thường xẩy ra trong 2 trường hợp sau:
+ Trong các toán tử và các hàm giải phóng bộ nhớ, như delete, free,...
+ Giải phóng các biến, mảng cục bộ khi thoát khỏi hàm, cách.
5.2. Hàm huỷ mặc định
Nếu trong lớp không định nghĩa hàm huỷ, thì một hàm huỷ mặc định không làm gì cả được phát sinh. Đối với nhiều lớp thì hàm huỷ mặc định là đủ, và không cần đưa vào một hàm huỷ mới.
5.3. Quy tắc viết hàm huỷ
Mỗi lớp chỉ có một hàm huỷ viết theo các quy tắc sau:
176 177
+ Kiểu của hàm: Hàm huỷ cũng giống như hàm tạo là hàm không có kiểu, không có giá trị trả về.
+ Tên hàm: Tên của hàm huỷ gồm một dẫu ngã (đứng trước) và tên lớp:
~Tên_lớp
+ Đối: Hàm huỷ không có đối
Ví dụ có thể xây dựng hàm huỷ cho lớp DT (đa thức) ở §3 như sau:
class DT
{
private:
int n; // Bac da thuc
double *a; // Tro toi vung nho chua cac he so da thuc
// a0, a1,...
public:
~DT()
{
this->n=0;
delete this->a;
}
...
} ;
5.4. Vai trò của hàm huỷ trong lớp DT
5.4.1. Khiếm khuyết của chương trình trong §3
Chương trình trong §3 định nghĩa lớp DT (đa thức) khá đầy đủ gồm:
+ Các hàm tạo
+ Các hàm toán tử nhập >>, xuất <<
+ Các hàm toán tử thực hiện các phép tính + - *
Tuy nhiên vẫn còn thiếu hàm huỷ để giải phóng vùng nhớ mà đối tượng kiểu DT (cần huỷ) đang quản lý.
Chúng ta hãy phân tích các khiếm khuyết của chương trình này:
+ Khi chương trình gọi tới một cách toán tử để thực hiện các phép tính cộng, trừ, nhân đa thức, thì một đối tượng trung gian được tạo ra. Một vùng nhớ được cấp phát và giao cho nó (đối tượng trung gian) quản lý.
+ Khi thực hiện xong phép tính sẽ ra khỏi cách. Đối tượng trung gian bị xoá, tuy nhiên chỉ vùng nhớ của các thuộc tính của đối tượng này được giải phóng. Còn vùng nhớ (chứa các hệ số của đa thức) mà đối tượng trung gian đang quản lý thì không hề bị giải phóng. Như vậy số vùng nhớ bị chiếm dụng vô ích sẽ tăng lên.
5.4.2. Cách khắc phục
Nhược điểm trên dễ dàng khắc phục bằng cách đưa vào lớp DT hàm huỷ viết trong 5.3 (mục trên).
5.5. Lớp hình tròn đồ hoạ
Chương trình dưới đây gồm:
Lớp HT (hình tròn) với các thuộc tính:
int r; // Bán kính
int m ; // Mầu hình tròn
int xhien,yhien; // Vị trí hiển thị hình tròn trên màn hình
char *pht; // Con trỏ trỏ tới vùng nhớ chứa ảnh hình tròn
int hienmh; // Trạng thái hiện (hienmh=1), ẩn (hienmh=0)
Các cách:
+ Hàm tạo không đối
HT();
thực hiện việc gán giá trị bằng 0 cho các thuộc tính của lớp.
+ Hàm tạo có đối
HT(int r1,int m1=15);
thực hiện các việc:
- Gán r1 cho r, m1 cho m
178 179
- Cấp phát bộ nhớ cho pht
- Vẽ hình tròn và lưu ảnh hình tròn vào vùng nhớ của pht
+ Hàm huỷ
~HT();
thực hiện các việc:
- Xoá hình tròn khỏi màn hình (nếu đang hiển thị)
- Giải phóng bộ nhớ đã cấp cho pht
+ cách
void hien(int x, int y);
có nhiệm vụ hiển thị hình tròn tại (x,y)
+ cách
void an();
có nhiệm vụ làm ẩn hình tròn
Các hàm độc lập:
void ktdh(); //Khởi tạo đồ hoạ
void ve_bau_troi(); // Vẽ bầu trời đầy sao
void ht_di_dong_xuong(); // Vẽ một cặp 2 hình tròn di
// chuyển xuống
void ht_di_dong_len();// Vẽ một cặp 2 hình tròn di
// chuyển lên trên
Nội dung chương trình là tạo ra các chuyển động xuống và lên của các hình tròn.
//CT4_09.CPP
// Lop do hoa
// Ham huy
// Trong ham huy co the goi PT khac
#include
#include
#include
#include
#include
#include
void ktdh();
void ve_bau_troi();
void ht_di_dong_xuong();
void ht_di_dong_len();
int xmax,ymax;
class HT
{
private:
int r,m ;
int xhien,yhien;
char *pht;
int hienmh;
public:
HT();
HT(int r1,int m1=15);
~HT();
void hien(int x, int y);
void an();
};
HT:: HT()
{
r=m=hienmh=0;
xhien=yhien=0;
pht=NULL;
}
180 181
HT::HT(int r1,int m1)
{
r=r1; m=m1; hienmh=0;
xhien=yhien=0;
if (r<0) r=0;
if (r==0)
{
pht=NULL;
}
else
{
int size; char *pmh;
size = imagesize(0,0,r+r,r+r);
pmh = new char[size];
getimage(0,0,r+r,r+r,pmh);
setcolor(m);
circle(r,r,r);
setfillstyle(1,m);
floodfill(r,r,m);
pht = new char[size];
getimage(0,0,r+r,r+r,pht);
putimage(0,0,pmh,COPY_PUT);
delete pmh;
pmh=NULL;
}
}
void HT::hien(int x, int y)
{
if (pht!=NULL && !hienmh) // chua hien
{
hienmh=1;
xhien=x; yhien=y;
putimage(x,y,pht,XOR_PUT);
}
}
void HT::an()
{
if (hienmh) // dang hien
{
hienmh=0;
putimage(xhien,yhien,pht,XOR_PUT);
}
}
HT::~HT()
{
an();
if (pht!=NULL)
{
delete pht;
pht=NULL;
}
}
void ktdh()
{
int mh=0,mode=0;
initgraph(&mh,&mode,"");
xmax = getmaxx();
ymax = getmaxy();
}
182 183
void ve_bau_troi()
{
for (int i=0;i<2000;++i)
...