friend function

2
Hàm Bạn và Lớp Bạn Hàm bạn: Nếu một thành viên của lớp được quy định là private hoặc protected thì chỉ có các hàm thành viên của lớp mới có quyền truy cập đến nó. Nếu một phương thức không phải là thành viên của lớp muốn truy cập đến, thì nó phải là hàm bạn của lớp đó. Phương thức bạn có thể được khai báo nhờ từ khóa friend. Ví dụ Kết quả #include using namespace std; class Rectangle { private: int w; int h; public: Rectangle(int, int); friend int Area(Rectangle); }; Rectangle::Rectangle(int w, int h){ this->w = w; this->h = h; } int Area(Rectangle rec){ return (rec.w*rec.h); } int main() { Rectangle rec(2, 5); cout< return 0; } 10 Giải thích: Hàm Area là một hàm toàn cục, nó không phải là thành viên của lớp (vì không sử dụng toán tử phạm vi khi khai báo). Nếu bạn cố tình truy cập đến các dữ liệu w và h thì chương trình dịch sẽ báo lỗi, bởi chúng được quy định là private. Khi ta khai báo hàm Area hàm bạn, sẽ giải quyết vấn đề này. Lớp bạn: Nếu ta có hai lớp A và B, và khai báo rằng B là bạn của A, thì khi đó, các phương thức của lớp A có thể truy cập đến các thuộc tính private và protected của lớp B. Ví dụ Kết quả #include using namespace std; class Rectangle Square: 5×5

Upload: tran-loc

Post on 17-Feb-2017

32 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Friend function

Hàm Bạn và Lớp Bạn Hàm bạn: Nếu một thành viên của lớp được quy định là private hoặc protected thì chỉ có các hàm thành viên của lớp mới có quyền truy cập đến nó. Nếu một phương thức không phải là thành viên của lớp muốn truy cập đến, thì nó phải là hàm bạn của lớp đó. Phương thức bạn có thể được khai báo nhờ từ khóa friend.

Ví dụ Kết quả

#include using namespace std;

class Rectangle

{

private:

int w;

int h;

public:

Rectangle(int, int);

friend int Area(Rectangle);

};

Rectangle::Rectangle(int w, int h){

this->w = w;

this->h = h;

}

int Area(Rectangle rec){

return (rec.w*rec.h);

}

int main()

{

Rectangle rec(2, 5);

cout<

return 0;

}

10

Giải thích: Hàm Area là một hàm toàn cục, nó không phải là thành viên của lớp (vì không sử dụng toán tử phạm vi khi khai báo). Nếu bạn cố tình truy cập đến các dữ liệu w và h thì chương trình dịch sẽ báo lỗi, bởi chúng được quy định là private. Khi ta khai báo hàm Area là hàm bạn, nó sẽ giải quyết vấn đề này. Lớp bạn: Nếu ta có hai lớp A và B, và khai báo rằng B là bạn của A, thì khi đó, các phương thức của lớp A có thể truy cập đến các thuộc tính private và protected của lớp B.

Ví dụ Kết quả

#include using namespace std;

class Rectangle

Square: 5×5

Page 2: Friend function

{

private:

int w;

int h;

public:

Rectangle(int, int);

friend class MakeSquare;

};

class MakeSquare{

private:

int w;

int h;

public:

MakeSquare(Rectangle);

void ShowSquare(void);

};

MakeSquare::MakeSquare(Rectangle rec){

this->w = max(rec.w, rec.h);

this->h = max(rec.w, rec.h);

}

void MakeSquare::ShowSquare(void){

cout<<”Square: “<<<”x”<

}

int main()

{

Rectangle rec(2, 5);

MakeSquare mk(rec);

mk.ShowSquare();

return 0;

}

Giải thích: Lớp Rectangle được quy định là lớp bạn của lớp Square, do đó, lớp Square có quyền truy cập đến các thuộc tính private và protected của lớp Rectangle. Hàm tạo của lớp Square truy cập đến các dữ liệu thành viên của lớp Rectangle để lấy chiều dài và chiều rộng của đối tượng rec (dù chúng là private), để tạo nên đối tượng mk. Đối tượng Square được tạo mới với cạnh của nó là số đo lớn nhất các cạnh của đối tượng Rectangle. Bạn cũng lưu ý rằng A là bạn của B, thì không có nghĩa là B cũng là bạn của A. Như vậy, tình bạn có thể là một chiều hoặc hai chiều tùy thuộc vào sự quy định của người lập trình.