[ C++ ] Hàm bạn, lớp bạn trong C++

[ C++ ] Hàm bạn, lớp bạn trong C++ 

Trong khi viết các chương trình trong C++, đôi khi chúng ta cần cấp quyền truy xuất cho một hàm tới các thành viên không là các thành viên chung của một lớp. Một truy xuất như thế được thực hiện bằng cách khai báo hàm như là bạn của lớp. Có hai lý do có thể cần đến truy xuất này là:
 - Có thể là cách định nghĩa hàm chính xác.
 - Có thể là cần thiết nếu như hàm cài đặt không hiệu quả.


* Cách viết một hàm bạn: Để một hàm trở thành hàm bạn, có hai cách viết:

Cách 1: Đặt từ khóa friend trước các hàm được khai báo trong lớp, sau đó xây dựng hàm bên ngoài như bình thường.

class A
{
private:
  //Cac thuoc tinh
public:
  friend void h1(...);
  friend int h2(...);
  ....
};

void h1(...)
{
  ...
}

int h2(...)
{
  ...
}
Cách 2: Dùng từ khóa friend để xây dựng hàm trong định nghĩa lớp.

class A
{
private:
  //Cac thuoc tinh
public:
   friend void h1(...)
   {
    ...
    }
   friend int h2(...)
   {
    ...
    }
  ....
};


* Tính chất của hàm bạn:

+ Trong thân hàm bạn của một lớp có thể truy nhập tới các thuộc tính của các đối tượng thuộc lớp này. Đây là khác nhau duy nhất giữa hàm bạn và hàm thông thường.
+ Hàm bạn không phải là phương thức của một lớp, lời gọi của hàm bạn giống như lời gọi của hàm thông thường.
---------------------
Ví dụ (hàm bạn): Viết hàm Area để tính diện tích hình chữ nhật, Area là hàm bạn của lớp Rectangle

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

class Rectangle
{
private:
int w;
int h;
public:
Rectangle(int, int);
friend int Area(Rectangle); // khai bao ham ban Area
}; 
Rectangle::Rectangle(int w, int h){
this->w = w;
this->h = h;
}
// ham ban
int Area(Rectangle rec){
return (rec.w*rec.h);
}
// ham main
int main()
{
   Rectangle rec(2, 5);
   cout<<"Dien tich HCN:  "<<Area(rec);
   return 0;
}

//--------------------------------
Ví dụ 2 (lớp bạn):  Lớp B là bạn của lớp A

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

class A
{
private:
int r; // chieu rong
int d; // chieu dai
public:
A(int, int);
friend class B; // khai bao lop B la ban cua A
};
A::A(int r, int d){
  this->r=r; this->d=d;
}
class B{
private:
int r;
int d;
public:
B(A); // khoi tao B theo A
void InKQ();
};

B::B(A t){
this->r = t.r;
this->d = t.d;
}
void B::InKQ(){
cout<<"\n Ket qua: "<<r*d;
}

// ham main
int main()
{
A rec(2, 5);
B m(rec);
m.InKQ();
return 0;
}

----------


Cùng bạn tự học CNTT - tailieucntt.org

0 nhận xét:

Cảm ơn bạn đã quan tâm tới bài viết này!