Tôi rất mới để C++, và khi tôi đang cố gắng tìm hiểu các hàm bạn bè, tôi thấy từ friend description on Cppreference rằng:Thành viên từ hàm bạn bè luôn là inline
2) (chỉ được phép trong định nghĩa lớp phi địa phương) Xác định một hàm không phải là thành viên, và làm cho nó trở thành một người bạn của lớp này cùng một lúc. Hàm không phải thành viên đó luôn là nội tuyến.
class X {
int a;
friend void friend_set(X& p, int i) {
p.a = i; // this is a non-member function
}
public:
void member_set(int i) {
a = i; // this is a member function
}
};
Điều này có nghĩa rằng tất cả các chức năng bạn luôn phải inline? Trong một từ khác, các hàm của bạn bè có được định nghĩa hoàn toàn bên trong lớp không?
Tuy nhiên, tôi cũng tìm thấy một trường hợp mà các chức năng bạn được định nghĩa bên ngoài lớp từ Cplusplus
// friend functions
#include <iostream>
using namespace std;
class Rectangle {
int width, height;
public:
Rectangle() {}
Rectangle (int x, int y) : width(x), height(y) {}
int area() {return width * height;}
friend Rectangle duplicate (const Rectangle&);
};
Rectangle duplicate (const Rectangle& param)
{
Rectangle res;
res.width = param.width*2;
res.height = param.height*2;
return res;
}
Tôi thực sự bối rối bởi cuộc xung đột này. Hiểu biết của tôi về nội dòng có sai không? "a nonmember friend function defined inside the class is automatically inline" có nghĩa là gì?
"được định nghĩa bên trong lớp" là các từ khóa ở đây. Hàm friend * được định nghĩa bên trong lớp * là nội dòng. Điều đó không có nghĩa là * tất cả * chức năng của bạn bè đều là nội dòng. Ví dụ thứ hai của bạn rõ ràng cho thấy một chức năng bạn bè được định nghĩa * bên ngoài * lớp. Nó không phải là nội tuyến. – AnT
Bạn trích cú pháp 2 từ cppreference và sau đó bạn hỏi "Điều này có nghĩa là tất cả các hàm của bạn bè luôn phải là nội tuyến?" Không: một ví dụ ngược được đưa ra trong cú pháp ngay lập tức trước 1. –