Lập Trình C++ - Hàm Bạn
Có thể bạn quan tâm
Nếu một hàm được định nghĩa là một hàm friend trong C ++ thì dữ liệu là proctected và private của một lớp có thể được truy cập bằng hàm này. Bằng cách sử dụng từ khóa friend để cho trình biên dịch biết hàm đã cho là một hàm của bạn. Để truy cập dữ liệu, việc khai báo một hàm friend nên được thực hiện bên trong phần thân của một lớp bắt đầu từ khóa friend.
Có hai kiểu hàm bạn cơ bản trong C++:
- Một hàm tự do là hàm bạn của một lớp
- Một hàm thành phần (phương thức) của một lớp là bạn của một lớp khác Ngoài ra còn có một số kiểu hàm bạn mở rộng từ hai kiểu này:
- Một hàm là bạn của nhiều lớp
- Tất cả các hàm của một lớp là bạn của lớp khác (lớp bạn)
Hàm tự do bạn của một lớp Một hàm bạn của một lớp được khai báo bằng từ khóa friend khi khai báo khuôn mẫu hàm trong lớp tương ứng.
class <Tên lớp>{ // Khai báo các thành phần lớp như thông thường // Khai báo hàm bạn friend <Kiểu trả về> <Tên hàm bạn>([<Các tham số>]); }; Khi đó, định nghĩa chi tiết hàm bạn được thực hiện như định nghĩa một hàm tự do thông thường: <Kiểu trả về> <Tên hàm bạn>([<Các tham số>]){ // Có thể truy nhập trực tiếp các thành phần private // của lớp đã khai báo }Lưu ý:
- Mặc dù hàm bạn được khai báo khuôn mẫu hàm trong phạm vi lớp, nhưng hàm bạn tự do lại không phải là một phương thức của lớp. Nó là hàm tự do, việc định nghĩa và sử dụng hàm này hoàn toàn tương tự như các hàm tự do khác.
- Việc khai báo khuôn mẫu hàm bạn trong phạm vi lớp ở vị trí nào cũng được: hàm bạn không bị ảnh hưởng bởi các từ khóa private, protected hay public trong lớp.
- Trong hàm bạn, có thể truy nhập trực tiếp đến các thành phần private và protected của đối tượng có kiểu lớp mà nó làm bạn (truy nhập thông qua đối tượng cụ thể).
Ví dụ minh họa việc định nghĩa một hàm bạn của lớp Car, hàm này so sánh xem hai chiếc xe, chiếc nào đắt hơn.
#include<iostream> #include<string> using namespace std; /* Định nghĩa lớp */ class Car { private: int speed; // Tốc độ string mark; // Nhãn hiệu float price; // Giá xe public: void init(int, string, float);// Khởi tạo thông tin về xe friend void moreExpensive(Car, Car); // Khai báo hàm bạn của lớp }; /* Khai báo phương thức bên ngoài lớp */ void Car::init(int speedIn, string markIn, float priceIn) { speed = speedIn; mark = markIn; price = priceIn; return; } /* Định nghĩa hàm bạn tự do */ void moreExpensive(Car car1, Car car2) { if (car1.price > car2.price)//Truy nhập đến các thuộc tính private cout << "xe thu nhat dat hon" << endl; else if (car1.price < car2.price) cout << "xe thu nhat dat hon" << endl; else cout << "hai xe dat nhu nhau" << endl; return; } // Hàm main, chuong trình chính int main() { Car car1, car2; // Khai báo biến lớp // Khởi tạo xe thứ nhất, thứ hai car1.init(100, "Ford", 3000); car2.init(150, "Mercedes", 3500); // So sánh giá hai xe moreExpensive(car1, car2); // Sử dụng hàm bạn tự do return; system("pause"); return 0; }Kết quả:
xe thu nhat dat hon// vì xe thứ hai có giá $3500, trong khi xe thứ nhất được khởi tạo giá là $3000.Phương thức lớp là bạn của một lớp khác Trong C++, một phương thức của lớp này cũng có thể làm bạn của một lớp kia. Để khai báo một phương thức f của lớp B là bạn của lớp A và f nhận một tham số có kiểu lớp A, ta phải khai báo tuần tự như sau (trong cùng một chương trình):
- Khai báo khuôn mẫu lớp A, để làm tham số cho hàm f của lớp B: class A;
- Khai báo lớp B với hàm f như khai báo các lớp thông thường: class B{ … // Khai báo các thành phần khác của lớp B void f(A); };
- Khai báo chi tiết lớp A với hàm f của lớp B là bạn class A{ … // Khai báo các thành phần khác của lớp A friend void B::f(A); };
- Định nghĩa chi tiết hàm f của lớp B: void B::f(A){ … // Định nghĩa chi tiết hàm f }
Lưu ý:
- Trong trường hợp này, hàm f chỉ được định nghĩa chi tiết một khi lớp A đã được định nghĩa chi tiết. Do vậy, chỉ có thể định nghĩa chi tiết hàm f ngay trong lớp A (ở bước 3) hoặc sau khi định nghĩa lớp A (ở bước 4), mà không thể định nghĩa chi tiết hàm f ngay trong lớp B (ở bước 2).
- Hàm f có thể truy nhập đến các thành phần private và protected của cả hai lớp A và B. Tuy nhiên, muốn f truy nhập đến các thành phần của lớp A thì phải thông qua một đối tượng cụ thể có kiểu lớp A.
Ví dụ: việc cài đặt và sử dụng một hàm permission() của lớp Person, là hàm bạn của lớp Car. Hàm này thực hiện việc kiểm tra xem một người có đủ quyền điều khiển xe hay không, theo luật sau:
- Với các loại xe thông thường, người điều khiển phải đủ 18 tuổi.
- Với các loại xe có tốc độ cao hơn 150km/h, người điều khiển phải đủ 21 tuổi.
Kết quả:
Co quyen dieu khien //Vì người chủ xe đã 20 tuổi và xe chỉ có tốc độ 100km/h.Từ khóa » Hàm Bạn Là Gì C++
-
Dùng Hàm Bạn Và Lớp Bạn Trong C++ Như Thế Nào? - CodeLearn
-
Hàm Bạn Và Lớp Bạn Trong C++ - Lập Trình Không Khó
-
Hàm Bạn Và Lớp Bạn Trong C++ | TopDev
-
Hàm Bạn (Friend Function) Và Lớp Bạn (Friend Class) Trong C++
-
Chi Tiết Bài Học Hàm Bạn (friend Function) - Vimentor
-
[Tự Học C++] Hàm Bạn(Friend Functions) Và Lớp Bạn Trong C++
-
Hàm Bạn (friend Function) Trong Lập Trình Hướng đối Tượng Với C++
-
Hàm Friend Trong C++ - Học Lập Trình C++ Online - Viettuts
-
Friend Trong C++
-
Hàm Friend Trong C++
-
Hàm Bạn Trong C++ | CppDeveloper
-
[C++] - Bài 52: Hàm Bạn - Friend Funtions. - YouTube
-
Kỹ Thuật C++ Sự Khác Nhau Giữa Hàm Bạn Và Phương Thức Của Một ...
-
Hàm Trong C/C++