LËp tr×nh híng ®èi tîng víi C++
|
So¹n bëi bé m«n C«ng nghÖ phÇn mÒm
|
Bµi thùc hµnh:
BÀI THỰC HÀNH SỐ 1
Môc tiªu:
+ Khởi động chương trình Borland C++ (BC).
+ Tạo, biên dịch và thực hiện chương trình C++ .
+ Định nghĩa lớp và khai báo đối tượng.
+ Cách thức truy cập và thao tác trên các hàm thành viên và các biến thành viên của lớp.
BÀI TẬP THỰC HÀNH
1. Khởi động chương trình Borland C++
2. Tạo và biên dịch và thực hiện chương trình C++
3. Định nghĩa lớp và khai báo đối tượng
4. Cách thức truy cập và thao tác trên các hàm thành viên và các biến thành viên của lớp.
1. Khởi động chương trình Borland C++
+ Để khởi động BC , bạn cần tìm và chạy tập tin BC.EXE. Thường thì tập tin này nằm trong thư mục BIN trong thư mục cài đặt.
Ví dụ : Bạn cài đặt Borland C++ trong thu mục C:\BC khi đó để khởi động Borland C++ bạn tìm và chạy tập tin BC.EXE trong thư mục C:\BC\BIN.
Màn hình của chương trình BC
* Ghi chú : Để khởi động nhanh bạn có thể tạo shortcut cho chương trình. Khi đó để khởi động BC bạn chỉ việc Double-Click vào biểu tượng của BC trên màn hình desktop.
2. Tạo và biên dịch và thực hiện chương trình C++
- Mở một file mới ( Menu File->New).
- Trong cửa sổ soạn thảo bạn gõ vào đoạn chương trình sau:
#include
#include
void main()
{
cout << "Hello world !";
getch();
}
- Lưu file vừa soạn thảo vào đĩa .(Menu File->Save hoặc phím nóng F2) .
- Nhấn tổ hợp phím CTRL - F9 để biên dịch và chạy chương trình. Kết quả như hình sau
Màn hình kết quả khi thực thi chương trình
3. Định nghĩa lớp và khai báo đối tượng
+ Phần này sẽ giúp các bạn hiểu được cách định nghĩa một lớp và khai báo một đối tượng của lớp đó.
+ Thực hiện các bước sau:
+ Tạo một file mới.
+ Trong cửa sổ soạn thảo gõ vào đoạn chương trình sau:
#include
#include
class MyFirstClass // Dinh nghai lop
{
public :
int dataMember;
}; // Ket thuc dinh nghia lop
void main()
{
MyFirstClass aObject; // Khai bao mot doi tuong
aObject.dataMember = 50;
cout << "Du lieu cua doi tuong la: " << aObject.dataMember;
getch();
}
|
+ Lưu thành file FirstClass.CPP
+ Biên dịch và chạy chương trình, kết quả như sau:
Màn hình kết quả
+ Qua chương trình trên ta thấy định nghĩa của một lớp tương tự như định nghĩa của một record chỉ thay từ khoá struct bằng từ khoá class và hoàn toàn tượng tự cho cách khai báo một đối tượng của lớp
4. Cách thức truy cập và thao tác trên các hàm thành viên và các biến thành viên của lớp.
+ Phần này sẽ giúp các bạn hiểu rõ hơn về các thành phần của lớp như hàm thành viên(Member Functions) , biến thành viên (data members) cũng như cách khai báo và truy cập lên các thành phần đó
+ Thực hiện các bước sau:
+ Tạo một file mới.
+ Trong cửa sổ soạnn thảo gõ vào chương trình sau:
#include
#include
class CPoint // Dinh nghai lop diem
{
private : // Khai bao bien thanh vien, co thuoc tinh private
int x; // hoanh do
int y; // tung do
public : // Khai bao bien thanh vien, co thuoc tinh public
void Init(int cx, int cy); // ham khoi tao vi tri diem
void Display(); // Ham in vi tri cua diem
void Move(int dx, int dy); // Ham di chuyen vi tri
}; // Ket thuc dinh nghia lop
/* Phan mo ta (cai dat) cac ham thanh vien */
void CPoint :: Init(int cx, int cy)
{
x = cx;
y = cy;
}
void CPoint :: Display()
{
cout << "\n x:y = " << x <<":" << y;
}
void CPoint :: Move(int dx, int dy)
{
x += dx; // x = x + dx
y += dy; // y = y + dy
}
// Chuong trinh chinh
void main()
{
clrscr();
CPoint p1; // Khai bao 1 doi tuong cua lop CPoint
CPoint *p; // Khai bao mot con tro doi tuong CPoint
cout << "Toa do cua p1 sau khi goi p1.Init(10,10)";
p1.Init(10,10); // Khoi tao toa do diem
p1.Display(); // Thu hien thi xem sao !
p1.Move(1,1); // Sau di chuyen di mot chut
cout << "\nToa do cua p1 sau khi goi p1.Move(1,1)";
p1.Display(); // Xem da di chuyen chua ?
p = new CPoint; // Xin cap phat mot doi tuong CPoint
p->Init(100,100);
cout << "\nToa do cua con tro p sau khi goi p->Init(100,100) :";
p->Display(); // hay nho, voi con tro phai la ->, khong phai "."
cout << "\nVa sau khi goi p->Move(10,10) ";
p->Move(10,10); // Chay mot doan nua roi hien thi
p->Display(); // Hien thi
cout << endl << endl << "An phim bat ky..." ;
getch();
}
|
+ Lưu file vào đĩa.
+ Kết quả khi chạy chương trình.
+ Ghi chú : Từ khoá public cho ta biết tầm vực của hàm hay biến được khai báo theo sau nó,ý nghĩa của từ khoá này sẽ được làm rõ trong bài thực hành sau.
Bµi tËp lµm thªm
Bài 1: Viết chương trình tính diện tích của hình chữ nhật và kiểm tra xem hình chữ nhật đó có phải là hình vuông hay không
Hướng dẫn: Định nghĩa một lớp hinh chữ nhật Rect như sau;
-
Class CRect // Lop hinh chu nhat
{
private :
int nWidth; // Chieu rong
int nHeight; // Chieu dai
public :
void Input(); // Nhap kich thuoc tu ban phim
void Init(int w, int h); // Khoi tao kich thuoc
long Area(); // Tra ve dien tich
int IsSquare(); // Co la hinh vuong khong.
] ; // Ket thuc phan dinh nghia (Khai bao) lop
|
+ Hàm Input cho phép người dùng nhập các chiều của hình chữ nhật từ bàn phím.
+ Hàm Init khởi tạo các chiều của hình chữ nhật với các giá tri w và h.
+ Hàm Area trả về diện tích của hình vuông.
+ Hàm IsSquare sẽ trả về 1 nếu hình chữ nhật là hình vuông, nếu không thì trả về 0.
Bài 2: Viết chương trình tạo ra lớp phân số, trong đó có các hàm thành viên cho phép nhập vào phân số, khởi tạo phân số, kiểm tra tính hợp lệ của phân số, rút gọn phân số và in phân số ra màn hình.
Bài 3: Xây dựng lớp "ngày" cho phép nhập vào một ngày, khởi tạo một ngày, kiểm tra ngày hợp lệ, tính ngày tiếp theo, và in ngày ra màn hình.
Hướng dẫn: Định nghĩa lớp ngày như sau
Class CDate // Lop ngay
{
private :
int nDay; // Ngay
int nMonth; // Thang
int nYear; // Nam
public :
void Input(); // Nhap ngay thang tu ban phim
void Init(int d, int m, int y);// Khoi tao gia tri
int IsValid(); // Kiem tra ngay xem co hop le ?
void NextDay(CDate &objNext); // Tinh ngay tiep theo
void Display();
¦ ; // Ket thuc phan dinh nghia (Khai bao) lop
|
Bµi thùc hµnh:
BÀI THỰC HÀNH SỐ 2
Môc tiªu:
Lớp (class) và đối tượng (object).
Các thuộc tính dữ liệu và các hàm thành viên “public” và “private”.
Mảng các đối tượng.
BÀI TẬP THỰC HÀNH
2.1 Lớp, đối tượng và các hàm thành viên
2.2 Mảng các đối tượng
Lớp, đối tượng và các hàm thành viên
Thành phần dữ liệu “public” trong lớp
Khi các thuộc tính được khai báo là “public” thì chúng có thể được truy xuất từ bên ngoài. Chương trình sau minh hoạ điều này:
Tạo file mới
Gõ đoạn chương trình sau
#include
class date
{
public:
int day;
int month;
int year;
};
void main()
{
date today;
today.day = 25;
today.month = 12;
today.year = 2001;
cout << “\n Ngay la “<< today.day<< “/” ;
cout << today.month << “/” << today.year << endl;
}
Lưu file với tên “date211.cpp”
Dịch và chạy chương trình
Kết quả trên màn hình là (nhấn tổ hợp phím Alt F5 để xem) :
Ngay la 25/12/2001
Trong chương trình trên, lớp date được cài đặt có ba thuộc tính được khai báo là public và các thuộc tính này có thể được truy xuất từ bên ngoài lớp. Ở đây chúng được truy cập từ hàm main(). Để truy xuất các thành phần của lớp, trong C++ sử dụng toán tử dấu chấm “.”;
Từ khoá endl dùng là ký tự xuống dòng hoặc làm cho đầy dòng, nó tương tự như ‘\n’.
Đóng file “date211.cpp”
Thành phần dữ liệu “private” trong lớp
Khi không dùng từ khoá public thì trình biên dịch C++ sẽ xem các thành phần của lớp được khai báo là private. Các thành phần được khai báo là private sẽ không truy cập trực tiếp được từ bên ngoài lớp.
Sửa lại file “date211.cpp”
#include
class date
{ //mac đinh cac thanh phan se đuoc xem la private
int day;
int month;
int year;
};
void main()
{
date today;
today.day = 25;
today.month = 12;
today.year = 2001;
cout << “\n Ngay la “<< today.day<< “/” ;
cout << today.month << “/” << today.year << endl;
}
Lưu file (save as) với tên “date212.cpp”
Dịch chương trình, bạn sẽ thấy các thông báo lỗi sau:
date:: day is not accessible
date:: month is not accessible
date:: year is not accessible
Chương trình trên không thực hiện được vì các thuộc tính dữ liệu có khai báo là private do trình biên dịch mặc định hiểu như vậy khi không chỉ rõ là public hay là private. Để truy cập đến các thuộc tính dữ liệu có khai báo là private bạn cần phải thông qua các hàm thành viên của lớp.
Đóng file “date212.cpp”
Sử dụng các hàm thành viên truy cập các thuộc tính dữ liệu “private”
Chương trình dưới đây minh hoạ việc sử dụng các hàm thành viên để truy cập các thuộc tính của lớp.
Tạo file mới
Gõ đoạn chương trình sau
#include
class date
{
private:
int day;
int month;
int year;
public:
void getdate (void)
{
cout << “\n Nhap vao ngay (dd): “;
cin >> day;
cout << “\n Nhap vao thang (mm): “ ;
cin >> month;
cout << “\n Nhap vao nam (yy): “ ;
cin >> year;
} //ket thuc ham getdate
void display (void)
{
cout << “\n Ngay la “ << day << “/”;
cout << month << “/” << year << endl;
} // ket thuc ham display
};
void main()
{
date today;
today.getdate();
today.display();
}
Lưu file với tên “date213.cpp”
Dịch và chạy chương trình
Kết quả trên màn hình là (nhấn tổ hợp phím Alt F5 để xem) :
Nhap vao ngay (dd): 25
Nhap vao thang (mm): 12
Nhap vao nam (yy): 01
Ngay la 25/12/01
Chương trình trên cài đặt lớp “date”có ba thuộc tính day, month, year kiểu số nguyên và được khai báo là private, hai hàm getdate(), display() được định nghĩa ở trong lớp và được khai báo là public, hai hàm này có thể được truy suất từ bên ngoài lớp.
Trong hàm main() có khai báo đối tượng (object) today có kiểu là date. Dùng toán tử dấu chấm “.” để truy xuất các hàm, gọi today.getdate() để nhập dữ liệu cho đối tượng today, today.display() để thể hiện trên màn hình. Như vậy, để truy xuất các thuộc tính có khai báo là private bạn phải thông qua các hàm thành viên.
Đóng file “date213.cpp”
Truyền tham số đối tượng cho các hàm thành viên
Tạo file mới
Gõ đoạn chương trình sau
#include
class Time
{
private:
int hours, minutes, seconds;
public:
void getinfo (void)
{
cin >> hours >> minutes >> seconds;
} //ket thuc ham getinfo
void display (void)
{
cout<
} // ket thuc ham display
void addit( Time aa, Time bb)
{
hours = aa.hours + bb.hours;
minutes = aa.minutes + bb.minutes;
seconds = aa.seconds + bb.seconds;
//kiem tra seconds < 60
if( seconds >= 60)
{
seconds -= 60; // seconds = seconds – 60
minutes++; //minutes = minutes + 1
}
//kiem tra minutes < 60
if (minutes >= 60)
{
minutes -=60;
hours++;
}
}
};
void main()
{
Time one, two, three;
cout << “\n Nhap vao thoi gian mot (gio phut giay): ”;
one.getinfo();
cout << “\n Nhap vao thoi gian hai (gio phut giay): ”;
two.getinfo();
three.addit(one, two);
cout << “Ket qua la “;
three.display();
}
Lưu file với tên “time214.cpp”
Dịch và chạy chương trình
Chú ý khi nhập giờ phút giây bạn phải nhập khoảng trắng giữa các giá trị.
Kết quả trên màn hình là (nhấn tổ hợp phím Alt F5 để xem) :
Nhap vao thoi gian mot (gio phut giay): 12 30 53
Nhap vao thoi gian hai (gio phut giay): 4 15 28
Ket qua la 16:46:21
Ngay la 25/12/01
Trong hàm main() ở chương trình trên có khai báo ba đối tượng của lớp Time là one, two, three. Thông tin của đối tượng one, two được cung cấp thông qua gọi hàm getinfo của từng đối tượng. Đối tượng three có được thông tin thông qua gọi hàm addit của nó, three.addit(one, two); ở lời gọi hàm này, ta đã truyền hai đối tượng one và two vào cho hàm addit, trong hàm addit aa, bb sẽ là các đối tượng đại diện cho one, two và các biến hours, minutes, seconds là các thuộc tính của đối tượng three.
5. Đóng file “time214.cpp”
Mảng các đối tượng
Mảng các đối tượng cùng loại được sử dụng giống như mảng kiểu dữ liệu cơ sở. Chương trình sau xây đựng lớp Student và sử dụng mảng Student trong chương trình chính.
Tạo file mới
Gõ đoạn chương trình sau
#include
class Student
{
private:
int rollno;
int marks;
public:
void getinfo ()
{
cout << “Nhap vao ma so sinh vien: “;
cin >> rollno ;
cout << “Nhap vao diem: “;
cin >> marks ;
} //ket thuc ham getinfo
void display ()
{
cout<
} // ket thuc ham display
int getmarks()
{
return marks;
} // ket thuc ham getmarks
};// ket thuc lop Student
void main()
{
Student stulist[100];
float total, average;
int no, i;
total = 0.0;
cout << “\n Nhap vao so luong sinh vien: ”;
cin >> no ;
for (i=0; i< no ; i++)
{
stulist[i].getinfo();
total = total + stulist[i].getmarks();
}
cout << “Ma so Diem”<< endl;
for (i=0; i< no; i++)
{
stulist[i].display();
}
average = total / no;
cout << “Diem trung binh cac sinh vien = ” << average;
}// ket thuc ham main
Lưu file với tên “stu22.cpp”
Dịch và chạy chương trình
Kết quả trên màn hình là (nhấn tổ hợp phím Alt F5 để xem) :
Nhap vao so luong sinh vien: 3
Nhap vao ma so sinh vien: 1
Nhap vao diem: 13
Nhap vao ma so sinh vien: 2
Nhap vao diem: 15
Nhap vao ma so sinh vien: 3
Nhap vao diem: 19
Ma so Diem
1 13
2 15
3 19
Diem trung binh cac sinh vien = 15.666667
Trong chương trình trên có khai báo mảng 100 đối tượng Student là stulist[100]. Để truy xuất đối tượng có vị trí thứ i ở trong mảng ta sử dụng stulist[i]. stulist[i].getinfo(); câu lệnh này gọi hàm getinfo() của đối tượng ở vị trí i trong mảng. Chú ý mảng trong C++ có chỉ số bắt đầu từ 0.
Bµi tËp lµm thªm
Viết chương trình quản lý học sinh với các chức năng sau:
Thêm một học sinh
Tìm thông tin các học sinh khi biết tên.
Tìm học sinh có điểm trung bình cao nhất
Xoá học sinh ra khỏi danh sách.
In danh sách hoc sinh.
class Hocsinh
{
private:
int maso;
char hoten[30];
int toan, ly, hoa, van, su, dia, anhvan;
public:
void nhapthongtin(); //nhap thong tin cho hoc sinh
void hienthi(); //hien thi thong tin hoc sinh len man hinh
float diemtrungbinh();//lay diem trung binh cua hoc sinh
char *ten(); //lay ten cua hoc sinh
}
Bµi thùc hµnh:
BÀI THỰC HÀNH SỐ 3
Môc tiªu:
• Constructors.
• Destructors.
• Hàm chồng (overloading).
• Hàm friend.
BÀI TẬP THỰC HÀNH
3.1. Constructors vµ destructors:
3.2. Constructors vµ destructors víi cÊp ph¸t ®éng:
3.3. §a n¨ng hãa hµm (hµm chång):
4.4 Hµm friend:
3.1. Constructors vµ destructors:
Trong phÇn nµy c¸c b¹n sÏ viÕt mét sè ch¬ng tr×nh trong ®ã cã sö dông c¸c hµm constructors (hµm khëi t¹o) vµ destructors (hµm hñy) ®Ó lµm râ thªm vÒ hai kh¸i niÖm nµy.
Khi mét ®èi tîng ®îc t¹o, c¸c thµnh viªn cña nã cã thÓ ®îc khëi t¹o bëi mét hµm constructor. Hµm constructors sÏ ®îc gäi mét c¸ch tù ®éng ®Ó thùc hiÖn c«ng viÖc nµy mµ kh«ng ph¶i gäi bÊt cø hµm nµo thuéc líp. Còng ho¹t ®éng gièng nh vËy, nhng hµm destructors sÏ ®îc gäi tù ®éng khi líp bÞ hñy.
Trong ch¬ng tr×nh díi ®©y c¸c b¹n sÏ thÊy c¸ch mµ c¸c hµm constructors vµ destructors thùc thi. Ch¬ng tr×nh sÏ sö dông hµm constructor ®Ó khëi t¹o mét vïng h×nh ch÷ nhËt th«ng qua hai thuéc tÝnh cña nã lµ nWidth (chiÒu dµi) vµ nHeight (chiÒu réng).
#include
#include
class CRectangle
{
private:
int nHeight; //chieu dai hinh chu nhat
int nWidth; //chieu rong hinh chu nhat
public:
CRectangle(); //ham constructor
int Area(); //ham tinh dien tich hinh chu nhat
void Initialize(int,int);
~CRectangle(); //ham destructor
};
CRectangle::CRectangle()
{
cout << "Khoi tao cac thuoc tinh bang ham constructor\n";
nHeight = 6;
nWidth = 8;
}
int CRectangle::Area()
{
return nHeight*nWidth;
}
void CRectangle::Initialize(int Rong,int Dai)
{
cout << "khoi tao lai hinh chu nhat voi cac bien duoc dua vao\n";
nWidth = Rong;
nHeight = Dai;
}
CRectangle::~CRectangle()
{
cout << "destructor dang duoc goi\n";
}
void main()
{
clrscr();
CRectangle Box,Square;
cout << "Dien tich cua Box la: "<< Box.Area() << "\n";
cout << "Dien tich cua Square la: "<< Square.Area() << "\n";
Box.Initialize(12,8);
Square.Initialize(8,8);
cout << "Dien tich cua Box la: "<< Box.Area() << "\n";
cout << "Dien tich cua Square la: "<< Square.Area() << "\n";
}
|
Khi ch¹y ch¬ng tr×nh trªn chóng ta sÏ thu ®îc kÕt qu¶ nh sau:
Khoi tao cac thuoc tinh bang ham constructor
Khoi tao cac thuoc tinh bang ham constructor
Dien tich cua Box la: 48
Dien tich cua Square la: 48
khoi tao lai hinh chu nhat voi cac bien duoc dua vao
khoi tao lai hinh chu nhat voi cac bien duoc dua vao
Dien tich cua Box la: 96
Dien tich cua Square la: 64
destructor dang duoc goi
destructor dang duoc goi
Ch¬ng tr×nh trªn khai b¸o mét líp tªn lµ CRectangle. Trong líp cã 2 biÕn private kiÓu integer. Trong c¸c hµm public cã mét hµm constructor vµ mét hµm destructor. Hµm constructor th× cã cïng tªn víi tªn líp cña nã. Hµm destructor ®îc ®Æt tªn còng theo mét c¸ch nh vËy nhng cã thªm dÊu ~ ë phÝa tríc tªn hµm ®ã.
Mçi lÇn mét ®èi tîng ®îc t¹o ra trong hµm main() th× hµm constructor cña nã sÏ ®îc thùc hiÖn. Trong hµm main() cã khai b¸o hai ®èi tîng thuéc líp CRectangle. Trong hµm constructor cã ®a vµo lÖnh ®Ó hiÓn thÞ dßng "Khoi tao cac thuoc tinh bang ham constructor" trªn mµn h×nh. Trong hµm main khi ta võa khai b¸o 2 ®èi tîng Box vµ Square th× c¸c constructors cña nã ®îc gäi nªn ë mµn h×nh output sÏ cã hai dßng:
Khoi tao cac thuoc tinh bang ham constructor
Vµ diÖn tÝch cña 2 h×nh ch÷ nhËt nµy sÏ ®îc tÝnh dùa trªn c¸c gi¸ trÞ ®· ®îc khëi t¹o trong hµm constructor (nWidth = 8,nHeight = 6). Khi ®ã diÖn tÝch cña hai h×nh ch÷ nhËt nµy lµ 48.
Sau ®ã ch¬ng tr×nh sÏ gäi hµm Initialize() cña Box vµ Square ®Ó g¸n l¹i gi¸ trÞ míi cho c¸c thuéc tÝnh nWidth, nHeight cña tõng ®èi tîng.
Box.Initialize(12,8);
Square.Initialize(8,8);
Khi ®ã diÖn tÝch cña Box vµ Square lÇn lît lµ 96, 64. V× c¸c gi¸ trÞ thuéc tÝnh cña 2 h×nh ch÷ nhËt nµy ®· ®îc g¸n l¹i víi c¸c gi¸ trÞ kh¸c nhau. Khi hµm Initialize() cña Box vµ Square ®îc gäi th× mµn h×nh output sÏ in ra mµn h×nh 2 dßng:
khoi tao lai hinh chu nhat voi cac bien duoc dua vao
khoi tao lai hinh chu nhat voi cac bien duoc dua vao
Khi 2 ®èi tîng Box vµ Square bÞ hñy vµo cuèi hµm main, hµm destructor cña c¸c ®èi tîng nµy sÏ ®îc tù ®éng thùc thi. ë trong mµn h×nh output chóng ta sÏ thÊy 2 dßng sau, do 2 hµm destructor ®îc thùc hiÖn:
destructor dang duoc goi
destructor dang duoc goi
Trong ch¬ng tr×nh díi ®©y, chóng ta sÏ viÕt mét líp víi tªn lµ CTime. Kh«ng gièng nh líp CRectangle ë trªn trong líp CTime cßn cã thªm mét constructor khëi t¹o c¸c gi¸ trÞ hours, minutes, seconds cña líp CTime. Vµ qua ®ã c¸c b¹n sÏ thÊy râ h¬n c¸c hµm constructor ®îc gäi khi víi tham sè hoÆc kh«ng cã tham sè. Vµ líp nµy cã mét hµm destructor ®Ó gäi khi líp bÞ hñy.
C¸c b¹n t¹o file vµ ®¸nh vµo ch¬ng tr×nh sau:
#include
#include
class CTime
{
private:
int nHours,nMinutes,nSeconds;
//bien luu gio, phut, giay cua lop CTime
public:
CTime(); //ham constructor khong doi so
CTime(int h,int m,int s);//ham constructor 3 doi so
void Display();
void AddIt(CTime Time1,CTime Time2);
~CTime(); //ham destructor
};
CTime::CTime()
{
cout << "ham constructor mac dinh\n";
nHours = nMinutes = nSeconds = 0;
}
CTime::CTime(int h,int m,int s)
{
cout << "ham constructor voi 3 doi so\n";
nHours = h;
nMinutes = m;
nSeconds = s;
}
void CTime::Display()
{
cout << nHours << ':' << nMinutes << ':' << nSeconds << endl;
}
void CTime::AddIt(CTime Time1,CTime Time2)
{
nHours = Time1.nHours + Time2.nHours;
nMinutes = Time1.nMinutes + Time2.nMinutes;
nSeconds = Time1.nSeconds + Time2.nSeconds;
//kiem tra nSeconds > 60
if(nSeconds >= 60)
{
nSeconds -= 60;
nMinutes ++;
}
//kiem tra nMinutes > 60
if(nMinutes >= 60)
{
nMinutes -= 60;
nHours ++;
}
}
CTime::~CTime()
{
cout << "Ham destructor\n";
}
void main()
{
clrscr();
CTime Result;
CTime T1(1,49,50);
CTime T2(3,40,30);
Result.AddIt(T1,T2);
cout << "Ket qua la: ";
Result.Display();
}
|
KÕt qu¶ sau khi thùc hiÖn ch¬ng tr×nh trªn lµ:
ham constructor mac dinh
ham constructor voi 3 doi so
ham constructor voi 3 doi so
Ham destructor
Ham destructor
Ket qua la: 5:30:20
Ham destructor
Ham destructor
Ham destructor
Trong ch¬ng tr×nh trªn, líp CTime cã ®Õn 2 constructors ®Ó khëi t¹o nã. Mét constructor th× kh«ng cã ®èi sè vµ mét cßn l¹i th× cã 3 ®èi sè.. Hµm constructor kh«ng cã ®èi sè lµ hµm constructor mÆc ®Þnh sÏ ®îc gäi. Trong hµm main(), biÕn Result, khi khai b¸o:
CTime Result;
Th× hµm constructor sÏ ®îc gäi cho ®èi tîng Result lµ constructor mÆc ®Þnh kh«ng cã ®èi sè. V× thÕ trong mµn h×nh output chóng ta sÏ thÊy xuÊt hiÖn dßng sau:
ham constructor mac dinh
Víi hµm constructor mÆc ®Þnh nµy th× c¶ ba thuéc tÝnh cña líp CTime lµ nHours, nMinutes, nSeconds ®Òu g¸n gi¸ trÞ lµ 0. Khi ®èi tîng ®îc khai b¸o nh sau th× constructor cßn l¹i sÏ ®îc gäi:
CTime T1(1,49,50);
CTime T2(3,40,30);
Khi khai b¸o hai ®èi tîng T1 vµ T2 chóng ta ®a vµo cho Time1, Time2 ba ®èi sè, khi ®ã hµm constructor CTime(int,int,int) sÏ ®îc gäi víi 3 ®èi sè lµ 3 gi¸ trÞ chóng ta ®a vµo. V× hai ®èi tîng ®îc khai b¸o nªn constructor sÏ ®îc gäi lÇn lît cho T1 vµ T2 nªn chóng ta sÏ nhËn ®îc tiÕp theo 2 dßng sau trong mµn h×nh output:
ham constructor voi 3 doi so
ham constructor voi 3 doi so
Hai dßng tiÕp theo trong mµn h×nh output chóng ta sÏ thÊy hai dßng gièng nhau lµ:
Ham destructor
NÕu nh chØ hiÓu theo nghÜa lµ hµm destructor chØ ®îc gäi khi mét ®èi tîng bÞ hñy th× chóng ta thÊy trong ch¬ng tr×nh 3 ®èi tîng khai b¸o cña chóng ta vÉn cha bÞ hñy cho tíi dßng lÖnh tiÕp theo sau nã. ThËt ra, trong ch¬ng tr×nh cña chóng ta cã gäi hµm AddIt cña ®èi tîng Result, víi 2 ®èi sè cña nã lµ T1 vµ T2. Mµ hµm destructor còng sÏ ®îc thùc hiÖn t¹i cuèi bÊt kú hµm nµo mµ ®èi sè cña nã lµ mét líp hay mét ®èi tîng nµo ®ã ®îc khai b¸o trong hµm. §©y chÝnh lµ lý do mµ hai dßng hiÓn thÞ cña hµm destructor hiÖn ra mµn h×nh output. Vµ hµm destructor cña líp CTime còng sÏ ®îc gäi 3 lÇn vµo cuèi hµm main(), v× khi ®ã 3 ®èi tîng Result, T1, T2 bÞ hñy.
Trong líp CTime xuÊt hiÖn cïng mét lóc hai hµm constructor víi hai tham sè kh¸c nhau ta gäi ®ã lµ ®a n¨ng hãa hµm constructor mµ ta sÏ xÐt ë phÇn sau.
3.2. Constructors vµ destructors víi cÊp ph¸t ®éng:
Trong C++ to¸n tö new thêng xuÊt hiÖn trong hµm constructors khi khëi t¹o ®èi tîng. Vµ vïng nhí cÊp ph¸t nµy ph¶i ®îc xãa khi ®èÝ tîng bÞ hñy, nªn to¸n tö delete dïng ®Ó xãa vïng nhí ®îc cÊp ph¸t b»ng to¸n tö new thêng ®îc ®Ó trong hµm destructors.
Trong ch¬ng tr×nh díi ®©y chóng ta sÏ x©y dùng mét líp mµ thuéc tÝnh cña nã lµ mét chuçi. Trong hµm constructor cña líp nµy chóng ta sÏ sö dông to¸n tö new ®Ó cÊp ph¸t vïng nhí cho chuçi nµy. Trong hµm destructor cña líp chóng ta sÏ dïng to¸n tö delete ®Ó xãa vïng nhí nµy ®i.
C¸c b¹n h·y më mét file míi vµ ®¸nh vµo ®ã ch¬ng tr×nh sau:
#include
#include
#include
class CString
{
private:
char* strName;
public:
CString(char* str)
{
int size = strlen(str);
strName = new char[size + 1];
strcpy(strName,str);
}
void Display()
{
cout << strName << endl;
cout<<"Chieu dai cua chuoi = "<
}
~CString()
{
delete []strName;
}
};
void main()
{
clrscr();
CString strFirst("Chao cac ban");
CString strSecond("Chao tam biet");
strFirst.Display();
strSecond.Display();
}
|
Vµ khi ch¬ng tr×nh ®îc ch¹y nã sÏ cho kÕt qu¶ ë mµn h×nh output nh sau:
Chao cac ban
Chieu dai cua chuoi = 12
Chao tam biet
Chieu dai cua chuoi = 13
Trong ch¬ng tr×nh trªn líp CString chØ cã mét thuéc tÝnh, mét con trá kiÓu char, cã tªn lµ strName. Con trá nµy sÏ trá ®Õn mét chuçi cã chiÒu dµi ®éng mçi khi ®èi tîng ®îc t¹o.
Hµm constructor lÊy mét ®èi sè lµ chuçi sÏ ®îc g¸n cho biÕn strName cña líp CString vµ biÕn nµy sÏ ®îc cÊp ph¸t mét vïng nhí b»ng to¸n tö new cã kÝch thíc ®óng b»ng víi kÝch thíc cña ®èi sè ®îc ®a vµo hµm constructor cña líp. Hµm Display cña líp CString dïng ®Ó hiÓn thÞ chuçi strName vµ ®é dµi cña nã ra mµn h×nh. Trong hµm destructor ch¬ng tr×nh sÏ dïng to¸n tö delete ®Ó xãa ®i vïng nhí ®· ®îc cÊp ph¸t cho biÕn strName.
3.3. §a n¨ng hãa hµm (hµm chång):
Trong phÇn nµy chóng ta sÏ viÕt mét ch¬ng tr×nh mµ trong ®ã cã nhiÒu hµm cïng tªn víi nhau, nhng nã kh¸c nhau vÒ sè ®èi sè hay kiÓu cña c¸c ®èi sè ®ã. C¸c hµm nh vËy ®îc gäi lµ c¸c hµm chång nhau. C¸c ®èi sè sÏ lµ sù ph©n biÖt kh¸c nhau ®Ó biÕt hµm nµo ®îc gäi, kiÓu tr¶ vÒ cña hµm kh«ng ®îc dïng ®Ó ph©n biÖt c¸c hµm nµy.
Ch¬ng tr×nh díi ®©y sÏ khai b¸o mét líp CWords trong ®ã nã cã c¸c thuéc tÝnh lµ sè nguyªn vµ mét chuçi ký tù.
Më file vµ nhËp vµo ch¬ng tr×nh sau ®©y:
#include
#include
#include
class CWords
{
private:
int nNum;
char strTitle[20];
public:
CWords()
{
nNum = 0;
strcpy(strTitle," ");
}
void Display(int i)
{
nNum = i;
cout << "Tham so la " << nNum << endl;
cout << "Day khong phai la chuoi" << endl;
}
void Display(char c)
{
strTitle[0] = c;
cout << "Tham so la " << strTitle[0] << endl;
cout << "Day la mot ky tu" << endl;
}
void Display(char* str)
{
strcpy(strTitle,str);
cout << "Tham so la " << strTitle << endl;
cout << "Day la mot chuoi" << endl;
}
void Display(char* str,int i)
{
strcpy(strTitle,str);
nNum = i;
cout<<"Tham so la "<
cout << "Day la mot chuoi" << endl;
}
};
void main()
{
clrscr();
CWords X;
X.Display(120);
X.Display('A');
X.Display("String");
X.Display("String",10);
}
|
Khi biªn dÞch ch¬ng tr×nh trªn vµ thùc hiÖn nã ta ®îc kÕt qu¶ nh sau:
Tham so la 120
Day khong phai la chuoi
Tham so la A
Day la mot ky tu
Chia sẻ với bạn bè của bạn: |