theo mình thấy
friend { something } gần như là phá vỡ tính chất bao đóng trong C++ -> không nên lạm dụng
friend method
friend function
friend class
các tài liệu về c++ chỉ nói về hàm bạn, nhưng qua ngâm cứu mình thấy có thể có phương thức bạn
(hay còn gọi là hàm bạn không độc lập, hàm bạn là hàm thành viên )
nhưng còn có 1 số lỗi, mặc dù mình thử build chạy , k báo lỗi, kết quả đúng, nhưng trên text editor có gạch chân và dí vào thì ra 1 lỗi cảnh báo
friend function
#include <iostream>
using namespace std;
class ham_ban{
private:
int songuyen;
friend void tang1dv(ham_ban &);
public:
ham_ban(int songuyen = 0 ){
this->songuyen = songuyen;
}
friend void xuat(ham_ban a){
cout << a.songuyen << endl;
}
};
void tang1dv(ham_ban &a){
a.songuyen++;
}
int main(){
ham_ban a;
ham_ban b(2);
xuat(a);
xuat(b);
ham_ban c;
tang1dv(c);
xuat(c);
system("pause");
return 0;
}
friend function multi class
#include <iostream>
using namespace std;
class songuyen;
class sothuc{
private:
float st;
public:
sothuc(float st = 1.9){
this->st = st;
}
void xuat(){
cout << st << endl;
}
friend void sosanh(songuyen, sothuc);
};
class songuyen{
private:
int sn;
public:
songuyen(int sn = 2){
this->sn = sn;
}
void xuat(){
cout << sn << endl;
}
friend void sosanh(songuyen, sothuc);
};
void sosanh(songuyen a, sothuc b){
if (a.sn > b.st) cout << "nguyen > thuc" << endl;
else if (a.sn < b.st) cout << "nguyen < thuc " << endl;
else cout << "thuc = nguyen" << endl;
}
int main(){
songuyen snguyen;
sothuc sthuc;
snguyen.xuat();
sthuc.xuat();
sosanh(snguyen, sthuc);
system("pause");
return 0;
}
friend method co doi class la ban truyen vao
#include <iostream>
using namespace std;
class sothuc;
class songuyen{
private:
int sn;
public:
songuyen(int sn = 0){
this->sn = sn;
}
void xuat(sothuc);
};
class sothuc{
private:
float st;
public:
sothuc(float st = 1.1){
this->st = st;
}
friend void songuyen::xuat(sothuc);
};
void songuyen::xuat(sothuc b){
cout << sn << endl;
cout << b.st << endl; // wanrning
}
int main(){
songuyen a;
sothuc b;
a.xuat(b);
system("pause");
return 0;
}
friend method khong co doi class la ban truyen vao
#include <iostream>
using namespace std;
class sothuc;
class songuyen{
private:
int sn;
public:
songuyen(int sn = 0){
this->sn = sn;
}
void xuat();
};
class sothuc{
private:
float st;
public:
sothuc(float st = 1.1){
this->st = st;
}
friend void songuyen::xuat();
};
void songuyen::xuat(){
cout << sn << endl;
sothuc sthuc;
cout << sthuc.st << endl;
}
int main(){
songuyen a;
a.xuat();
system("pause");
return 0;
}
friend method multi class
#include <iostream>
using namespace std;
class songuyen;
class sothuc;
class sosanh{
public:
void ss(songuyen, sothuc);
};
class songuyen{
private:
int sn = 2;
public:
friend void sosanh::ss(songuyen, sothuc);
};
class sothuc{
private:
float st = 2.0;
public:
friend void sosanh::ss(songuyen, sothuc);
};
void sosanh::ss(songuyen a, sothuc b){
if (a.sn > b.st) cout << "nguyen > thuc" << endl;
else if (a.sn < b.st) cout << "nguyen < thuc " << endl;
else cout << "thuc = nguyen" << endl;
}
int main(){
songuyen a;
sothuc b;
sosanh c;
c.ss(a, b);
system("pause");
return 0;
}
lỗi cảnh báo khi chạy friend method co doi class la ban truyen vao hoặc friend method khong co doi class la ban truyen vao, kết quả vẫn đúng, build k có lỗi, nhưng có lỗi cảnh báo trên màn hinh
friend class
#include <iostream>
using namespace std;
class songuyen{
private:
int sn = 1;
void xuat(){
cout << sn << endl;
}
public:
friend class sothuc;
};
class sothuc{
private:
float st = 1.2;
songuyen a;
public:
void xuat(){
cout << st << endl;
a.xuat();
cout << a.sn << endl;
}
};
int main(){
sothuc a;
a.xuat();
system("pause");
return 0;
}