Hàm bạn

Trong nhiều phần thời lượng của cmùi hương này, họ đã làm được học tập về mọi ưu điểm của Việc giữ lại kín đáo tài liệu Khi cài đặt những class với những thành viên (biến thành viên, hàm thành viên) bên phía trong class. Tuy nhiên, đôi khi bạn sẽ gặp buộc phải gần như trường hợp cơ mà trong đó, bạn sẽ thấy tất cả những class và những hàm nằm ở vị trí bên phía ngoài những class đó, chuyển động nghiêm ngặt cùng nhau. Ví dụ, chúng ta có thể gồm một class để lưu trữ dữ liệu, và một hàm (hoặc một class khác) hiển thị tài liệu lên screen. Mặc dù class thực hiện câu hỏi lưu trữ tài liệu và phần code hiển thị tài liệu đã được tách bóc biệt để duy trì dễ ợt rộng, mà lại phần code hiển thị tài liệu đích thực lắp bó một bí quyết ngặt nghèo với kết nối cùng với những chi tiết của class tàng trữ tài liệu. Do kia, trong ngôi trường hòa hợp này, việc bịt giấu các cụ thể của class tàng trữ dữ liệu khỏi phần code hiển thị tài liệu sẽ không có tương đối nhiều ý nghĩa.

Bạn đang xem: Hàm bạn

Trong phần nhiều tình huống như thế này, ta gồm hai lựa chọn:

1) Cứ đọng khiến cho phần code hiển thị dữ liệu thực hiện được hầu hết hàm được công khai (public) của class tàng trữ tài liệu. Tuy nhiên, phương pháp này tiềm ẩn một vài điểm yếu kém. Trước hết, phải xác định rõ những hàm member nào sẽ được công khai, Việc này sẽ mất thời hạn, với có thể làm lộn xộn đồ họa code của class lưu trữ tài liệu. Thứ nhị, Lúc hiển thị công khai minh bạch một trong những hàm dồn phần code hiển thị tài liệu rất có thể áp dụng được, thì class lưu trữ tài liệu cũng bên cạnh đó phơi bày số đông hàm công khai kia cho phần đa đối tượng người tiêu dùng nhưng nó không muốn thấy được. Không có biện pháp như thế nào nhằm nói được rằng “hàm này được bố trí công khai chỉ để cho phần code hiển thị dữ liệu sử dụng”.

2) Sử dụng những class bạn và các hàm các bạn, bằng phương pháp này, bạn cũng có thể cấp cho phần code hiển thị tài liệu của mình quyền truy vấn cho tới những chi tiết private (riêng tư) của class lưu trữ dữ liệu. Vấn đề này chất nhận được phần code hiển thị dữ liệu có thể truy vấn trực tiếp cho tới toàn bộ những biến thành viên cùng hàm member private của class lưu trữ tài liệu, trong những lúc vẫn đảm bảo những đối tượng người sử dụng không muốn chẳng thể truy vấn vào được! Trong bài này, bọn họ đang tò mò kỹ hơn về class bạn (friend class) cùng hàm bạn (friend function).


1. Hàm bạn(Frikết thúc functions)

Hàm bạn là một trong những hàm rất có thể truy vấn cho những member private (gồm cả những biến thành viên cùng những hàm thành viên) của một class, như thể nó là 1 thành viên của class đó. Ngoại trừ Điểm lưu ý ở bên trên ra thì hàm các bạn hoàn toàn như thể với hàm bình thường. Một hàm bạn cũng có thể chỉ là 1 hàm bình thường, hoặc là một trong hàm thành viên của một class không giống. Để knhì báo một hàm bạn, chỉ cần áp dụng từ khóa friover ở trước phần nguim mẫu mã (prototype) của hàm cơ mà bạn có nhu cầu nó thay đổi chúng ta của class. cũng có thể khai báo hàm chúng ta bên trong phần public (công khai) hoặc phần private (riêng rẽ tư) của class mọi được.

Dưới đây là ví dụ về bài toán áp dụng hàm bạn:

/*** i-google-map.com - Kênh công bố IT hàng đầu Việt Nam**

Lưu ý rằng, họ yêu cầu truyền vào trong 1 đối tượng người sử dụng của class Accumulator mang lại hàm reset(). Như vậy là do hàm reset() không phải là 1 trong những hàm thành viên của class Accumulator. Nó không có bé trỏ *this, với cũng ko tải đối tượng người dùng nào của class Accumulator để hoàn toàn có thể thao tác thuộc, trừ Khi ta cung ứng cho nó.

Dưới đấy là một ví dụ khác:


class Valueprivate: int m_value;public: Value(int value) m_value = value; frikết thúc bool isEqual(const Value &value1, const Value &value2);; bool isEqual(const Value &value1, const Value &value2) return (value1.m_value == value2.m_value);Trong ví dụ này, họ khai báo hàm isEqual() là bạn của class Value. Hàm isEqual() thừa nhận vào nhị đối tượng người sử dụng Value làm cho tsay đắm số truyền vào. Bởi vị hàm isEqual() là bạn của class Value, vì thế nó tất cả thẻ truy cập tới những thành viên private của tất cả những đối tượng người tiêu dùng Value. Trong ngôi trường phù hợp này, nó thực hiện quyền truy vấn đó nhằm thực hiện một phép đối chiếu bên trên nhì đối tượng người sử dụng, và trả về true nếu bọn chúng bằng nhau.

Xem thêm: Phím Tắt Để Mở Học Viện Trong Game Là Gì? Giải Đáp Tân Thủ: Và Cách Sở Hữu

Mặc mặc dù cả hai ví dụ bên trên trông có vẻ như nlỗi được bố trí sẵn, không thực tiễn lắm, tuy nhiên ví dụ sau siêu giống với những trường vừa lòng cơ mà chúng ta đang gặp gỡ vào chương thơm 9, Khi thảo luận về bài toán hấp thụ ông chồng toán tử (operator overloading)!

2. hầu hết bạn(Multiple friends)

Một hàm hoàn toàn có thể là các bạn của rất nhiều class và một thời gian. Ví dụ, thuộc xét đoạn code ví dụ sau:

/*** i-google-map.com - Kênh báo cáo IT bậc nhất Việt Nam**

class Humidity;Đây là một trong knhì báo nguyên ổn mẫu mã lớp (class prototype), đến trình biên dịch biết rằng chúng ta vẫn định nghĩa một class mang tên Humidity sau này. Nếu không có cái code này, trình biên dịch vẫn nói cùng với chúng ta rằng nó lưỡng lự Humidity là gì, Lúc so với cú pháp (parsing) chiếc phần ngulặng chủng loại (prototype) của hàm PrintWeather() bên phía trong class Temperature. Nguyên mẫu lớp (class prototype) vào vai trò y như các nguim mẫu mã hàm (function prototype) – chúng nói cho trình biên dịch biết chiếc nào đấy trông ra sao, nhằm trình biên dịch hoàn toàn có thể hiểu rằng rằng, à, cái này hoàn toàn có thể thực hiện được ngay lập tức hiện thời, rồi quan niệm sau cũng được. Tuy nhiên, không y hệt như các hàm, các class không có giao diện trả về hoặc tsay đắm số truyền vào, vì chưng vậy các class prototypes số đông chỉ gồm cú pháp đơn giản dễ dàng là tự khóa class theo sau bởi tên của class mong chế tạo nguyên chủng loại, ví dụ: class ClassName, trong các số ấy ClassName là tên gọi của class cụ thể.

3. Lớp bạn(Friend classes)

Việc biến toàn bộ một tờ trở nên các bạn của một lớp khác là hoàn toàn có thể. Vấn đề này có thể chấp nhận được tất cả những member của lớp bạn cũng có thể truy vấn cho tới các member private của lớp không giống. Đây là một trong những ví dụ:

/*** i-google-map.com - Kênh biết tin IT hàng đầu Việt Nam**

6.7 5Có một trong những chú ý bổ sung cập nhật về các lớp chúng ta. Thứ đọng duy nhất, tuy nhiên Display là các bạn của Storage, nhưng Display không có quyền truy vấn thẳng vào bé trỏ *this của những đối tượng người sử dụng nằm trong lớp Storage. Thứ đọng nhị, chỉ vị Display là bạn của Storage, điều đó ko có nghĩa là Storage cũng chính là các bạn của Display. Nếu ao ước nhị lớp là các bạn của nhau, cả hai lớp đó đều cần knhị báo lớp cơ là các bạn của chính mình. Cuối cùng, nếu như lớp A là bạn của lớp B, với lớp B là bạn của lớp C, điều này không có nghĩa là lớp A là các bạn của lớp C.

Hãy cẩn thận Lúc áp dụng những hàm các bạn cùng lớp các bạn, chính vì việc này rất có thể chất nhận được các hàm các bạn hoặc lớp chúng ta phạm luật tính gói gọn (encapsulation) của OOP.. Nếu các lên tiếng cụ thể của một lớp bị biến đổi, thì những cụ thể của lớp các bạn cũng trở thành bị phải biến hóa. Do đó, hãy tinh giảm thực hiện các hàm các bạn và lớp chúng ta ở tại mức về tối tgọi.

4. Các hàm member là bạn

Ttốt bởi vì có tác dụng cho cả một class biến hóa các bạn, ta rất có thể chỉ thay đổi một hàm thành viên phát triển thành chúng ta cũng khá được. Điều này được triển khai tựa như nlỗi Lúc vươn lên là một hàm thông thường thành bạn, ko kể việc ta phải thêm chi phí tố className:: vào phía trước tên hàm member, ví dụ: Display::displayItem.


Thật may là điều đó hoàn toàn có thể được giải quyết và xử lý thuận lợi bằng phương pháp di chuyển phần code có mang class Display lên trước phần code khái niệm class Storage:

/*** i-google-map.com - Kênh lên tiếng IT bậc nhất Việt Nam**

Chúng ta lại liên tiếp chạm chán may khi lỗi này cũng có thể sửa vào một vài bước dễ dàng. Đẩu tiên, bạn có thể định một forward declaration – khai báo trước đến class Storage. Tiếp theo, bạn cũng có thể dịch chuyển phần code quan niệm của hàm Display::displayItem() ra nêm ko kể class Display, đặt tại sau phần code quan niệm tương đối đầy đủ của class Storage. Sau lúc sửa như trên, ta đã được:

/*** i-google-map.com - Kênh công bố IT số 1 Việt Nam**

Nếu bạn Cảm Xúc việc knhì báo những hàm thành viên trở nên hàm các bạn này thật là nhảm nhí, thì thật ra nó đúng là như thế đấy =)). Và thật may là, việc này chỉ quan trọng lúc họ cố gắng làm tất cả phần đông sản phẩm công nghệ bên trong một file duy nhất. Có một chiến thuật giỏi rộng đó là đặt từng phần code quan niệm của mỗi class vào phía bên trong những file header đơn nhất, cùng với những phần code quan niệm những hàm thành viên sinh sống bên trong những file .cpp tương xứng. Theo cách đây, toàn bộ những phần code quan niệm class sẽ tức thì nhanh chóng có thể được nhìn thấy (visible) bên trong những tệp tin .cpp, với bọn họ cũng trở thành không cần phải sắp xếp lại thứ từ của những class hoặc các hàm!

5. Tổng kết

Một hàm chúng ta hoặc class bạn là một hàm hoặc class nhưng mà có thể truy vấn tới những member private của một class không giống như thế nó là member của class kia. Điều này cho phép hàm các bạn hoặc class bạn có thể thao tác làm việc một phương pháp nghiêm ngặt và gắn kết với class khác, nhưng ko để cho class không giống đề nghị phơi bày ra các member private của mình (ví dụ: Thông qua những hàm truy vấn cập).

Việc kết bạn được thực hiện ko phổ biến Lúc nhì hoặc những class phải làm việc cùng nhau một biện pháp nghiêm ngặt và kết nối, hoặc phổ cập hơn các, Khi tư tưởng các toán thù tử hấp thụ ck – overloading operators