Con trỏ this

Một phần của tài liệu Bài giảng lập trình hướng đối tượng với C++ doc (Trang 40 - 45)

Mỗi đối tượng duy trì một con trỏ trỏ tới chính nó – gọi là con trỏ this – Đó là một tham số ẩn trong tất cả các tham chiếu tới các thành viên bên trong đối tượng đó. Con trỏ this tham chiếu đến đối tượng đang gọi hàm thành phần. Như vậy, có thể truy nhập đến các thành phần của đối tượng gọi hàm thành phần gián tiếp thông qua this.

int point::coincide(point pt)

{ return(this->x==pt.x && this->y==pt.y); }

.IV CÁC HÀM TRUY CẬP VÀ CÁC HÀM TIỆN ÍCH

Khơng phải tất cả các hàm thành viên đều là public để phục vụ như bộ phận giao diện của một lớp. Một vài hàm còn lại là private và phục vụ như các hàm tiện ích (utility functions)

cho các hàm khác của lớp.

Các hàm truy cập có thể đọc hay hiển thị dư liệu. Sử dụng các hàm truy cập để kiểm tra tính đúng hoặc sai của các điều kiện – các hàm như thế thường được gọi là các hàm khẳng định (predicate functions).

Một hàm tiện ích không là một phần của một giao diện của lớp. Hơn nưa nó là một hàm thành viên private mà hỗ trợ các thao tác của các hàm thành viên public. Các hàm tiện ích không dự định được sử dụng bởi các client của lớp.

Ví dụ 3.5: Minh hoạ hàm tiện ích

#include <iostream.h> #include <iomanip.h> #include <conio.h> class SalesPerson { public: SalesPerson(); //constructor

void SetSales(int, double);//Người dùng cung cấp con số doanh thu của một tháng void PrintAnnualSales();

private:

double Sales[12]; //12 con số doanh thu của các tháng double TotalAnnualSales(); //Hàm tiện ích

};

SalesPerson::SalesPerson() //Hàm constructor khởi tạo mảng { for (int I = 0; I < 12; I++)

Sales[I] = 0.0; }

//Hàm thiêt lập một trong 12 con số doanh thu của các tháng void SalesPerson::SetSales(int Month, double Amount)

{ if (Month >= 1 && Month <= 12 && Amount > 0) Sales[Month - 1] = Amount;

else

}

//Hàm tiện ích để tính tởng doanh thu hàng năm double SalesPerson::TotalAnnualSales()

{ double Total = 0.0;

for (int I = 0; I < 12; I++) Total += Sales[I];

return Total; }

void SalesPerson::PrintAnnualSales() //In tổng doanh thu hàng năm { cout << setprecision(2)

<< setiosflags(ios::fixed | ios::showpoint) << endl << "The total annual sales are: $" << TotalAnnualSales() << endl; } int main() { SalesPerson S; double salesFigure; clrscr();

for (int I = 1; I <= 12; I++)

{ cout << "Enter sales amount for month "<< I << ": "; cin >> salesFigure; S.SetSales(I, salesFigure); } S.PrintAnnualSales(); getch(); return 0; }

Enter sales amount for month 1: 120.5 Enter sales amount for month 2: 100.75 Enter sales amount for month 3: 180 Enter sales amount for month 4: 200 Enter sales amount for month 5: 350.06 Enter sales amount for month 6: 300 Enter sales amount for month 7: 120 Enter sales amount for month 8: 321 Enter sales amount for month 9: 123.45 Enter sales amount for month 10: 129 Enter sales amount for month 11: 124.5 Enter sales amount for month 12: 125.55

The total annual sales are: $2194.81

.V THIÊT LẬP VÀ HUỶ BỎ ĐỐI TUỢNG (adsbygoogle = window.adsbygoogle || []).push({});

.V.1. Hàm thiết lập - CONSTRUCTOR

Hàm thiết lập (constructor) là một hàm thành phần đặc biệt không thể thiếu được trong một lớp, là một hàm thành viên với tên giống như tên của lớp. Nó được gọi tự động mỗi khi có một đối tượng được khai báo. Chức năng của hàm thiết lập là khởi tạo các giá trị thành phần dư liệu của đối tượng, xin cấp phát bộ nhớ cho các thành phần dư liệu động.

Các constructor không thể mô tả các kiểu trả về hoặc các giá trị trả về. Các constructor có thể được đa năng hóa để cung cấp sự đa dạng để khởi tạo các đối tượng của lớp.

Ví dụ 3.6: Dùng hàm thiết lập thay cho hàm init() trong lớp point ở ví dụ 3.2.

#include <iostream.h> #include <conio.h> class point

{ /*khai báo các thành phần dữ liệu*/ int x;

int y; public:

/*khai báo các thành phần hàm*/

point() {x=0; y=0;} // hàm thiết lập không tham số – constructor mặc định point(int ox,int oy) {x=ox;y=oy;} //hàm thiết lập có 2 tham số

void move(int dx,int dy) ; void display();

};

void point::move(int dx,int dy){ x+=dx; y+=dy; } void point::display(){ cout<<"Toa do : "<<x<<" "<<y<<"\n"; } void main() { clrscr();

point a(5,2); //Sử dụng hàm thiết lập có hai tham số cout<<”Diem A: \n”;

a.move(-2,4); a.display();

point b; //sử dụng hàm thiết lập khơng có tham số cout<<”Diem B: \n”;

b.move(-2,4); b.display();

point m[10]; //tạo mảng m có 10 đối tượng point – sử dụng constructor mặc định getch(); } Diem A: Toa do : 5 2 Toa do : 3 6 Diem B: Toa do : -2 4

Nếu không có constructor nào được định nghĩa trong một lớp thì trình biên dịch tạo một constructor mặc định (default constructor). Constructor này không thực hiện bất kỳ sự khởi tạo nào, vì vậy khi đối tượng được tạo, nó không đảm bảo được ở một trạng thái phù hợp.

Constructor có thể có các tham số mặc định. Một constructor mà hoặc tất cả các tham số của nó có giá trị mặc định hoặc không có tham số nào thì cũng được gọi là constructor mặc định. Như vậy bằng cách này, ta có thể tạo ra constructor mặc định để đảm bảo đối tượng tạo ra có mợt trạng thái phù hợp.

Mợt sớ lưu ý:

• Hàm thiết lập có cùng tên với tên của lớp. • Hàm thiết lập phải có tḥc tính public.

• Hàm thiết lập không có giá trị trả về, và không cần khai báo void. • Có thể có nhiều hàm thiết lập trong cùng lớp (chờng các hàm thiết lập).

• Khi một lớp có nhiều hàm thiết lập, việc tạo các đối tượng phải kèm theo các tham số phù hợp với mợt trong các hàm thiết lập đã khai báo.

• Chỉ có thể có một constructor mặc định cho mỗi lớp.

• Đới với mảng các đới tượng, thì nhất thiết phải có constructor mặc định.

Con trỏ và cấp phát đợng đới tượng:

• Ta có thể tạo con trỏ đới tượng và truy xuất các thành phần của đối tượng như sau:

point a; //tạo đối tượng a

point *ptr; //khai báo con trỏ đối tượng ………….

ptr = &a; //cho con trỏ trỏ vào đối tượng a …………. (adsbygoogle = window.adsbygoogle || []).push({});

ptr = new point(5,2) //dùng toán tử new cấp phát động cho đối tượng ………..

ptr->display(); //gọi hàm thành phần của đối tượng được trỏ ptr->move(-2,3); //gọi hàm thành phần của đối tượng được trỏ

Khai báo tham chiếu đối tượng

• Khi đới tượng là nợi dung mợt biến có kiểu lớp, ta có thể gán cho nó các “bí danh”; nghĩa là có thể khai báo các tham chiếu đến chúng. Một tham chiếu đối tượng chỉ có ý nghĩa khi tham chiếu tới một đối tượng nào đó đã được khai báo trước đó. Chẳng hạn:

point a(2,5); //tạo đối tượng a

point &ra=a; //ra là bí danh của đối tượng a a.display(); ra.display(); ra.move(2,3); a.display(); Toa do : 2 5 Toa do : 2 5 Toa do : 4 8

Một phần của tài liệu Bài giảng lập trình hướng đối tượng với C++ doc (Trang 40 - 45)