友元函数。
#include<iostream>
using namespace std;
class Test{
friend void Show(); //只在类中写出friend
public:
Test(int d = 0):data(d){
}
public:
//void Fun(Test * const this) //改写成这样
void Fun(){ //该函数作用域属于这个类里面
cout<<"data = "<<data<<endl; //能访问类声明的私有部分
}
private:
int data;
};
void Show(){ //这里不需要加friend,也不需要加Test:: 因为不属于Test 而是Test的朋友,地位一样
cout<<"This is Friend Show()"<<endl;
}
void main(){
Test t(100);
t.Fun(); //必须要有对象t去激活
Show(); //不需要对象去激活
}
友元函数,取出类中的私有数据。
#include<iostream>
using namespace std;
class Test{
//friend void Show(); //只在类中写出friend
friend void Show(Test &); //可以访问类中的私有数据
//一般把友元函数声明写在前面,友元函数可以访问类的所有数据
public:
Test(int d = 0):data(d){
}
public:
//void Fun(Test * const this) //改写成这样
void Fun(){ //该函数作用域属于这个类里面
cout<<"data = "<<data<<endl; //能访问类声明的私有部分
}
private:
int data;
};
void Show(Test &t){ //这里不需要加friend,也不需要加Test:: 因为不属于Test 而是Test的朋友,地位一样
cout<<"This is Friend Show()"<<endl;
cout<<"t.data = "<<t.data<<endl;
}
void main(){
Test t(100);
t.Fun(); //必须要有对象t去激活
//Show(); //不需要对象去激活
Show(t);
}
重载为友元函数。
#include<iostream>
using namespace std;
/*
class Test{
//friend void Show(); //只在类中写出friend
friend void Show(Test &); //可以访问类中的私有数据
//一般把友元函数声明写在前面,友元函数可以访问类的所有数据
public:
Test(int d = 0):data(d){
}
public:
//void Fun(Test * const this) //改写成这样
void Fun(){ //该函数作用域属于这个类里面
cout<<"data = "<<data<<endl; //能访问类声明的私有部分
}
private:
int data;
};
void Show(Test &t){ //这里不需要加friend,也不需要加Test:: 因为不属于Test 而是Test的朋友,地位一样
cout<<"This is Friend Show()"<<endl;
cout<<"t.data = "<<t.data<<endl;
}
void main(){
Test t(100);
t.Fun(); //必须要有对象t去激活
//Show(); //不需要对象去激活
Show(t);
}
*/
class Complex; //对复数类进行声明
ostream& operator<<(ostream& out,const Complex &c);
Complex operator+(int i, const Complex &c); //声明成友元方法
//复数
class Complex{
friend ostream& operator<<(ostream& out,const Complex &c); //友元函数
friend Complex operator+(int i, const Complex &c); //声明成友元方法
public:
Complex():m_real(0),m_imag(0){
}
//10,0构造出对象
Complex(int real,int imag = 0){
m_real = real;
m_imag = imag;
}
~Complex(){
}
public:
void PrintComplex()const{
cout<<"("<<m_real<<","<<m_imag<<")"<<endl;
}
public:
Complex operator+(int i){ //把operator+看成一个整体,是一个函数名
return Complex(m_real+i,m_imag);
}
Complex operator+(const Complex &c){ //把operator+看成一个整体,是一个函数名
return Complex(m_real+c.m_real,m_imag+c.m_imag);
}
private:
int m_real;
int m_imag;
};
ostream& operator<<(ostream& out,const Complex &c){
cout<<"("<<c.m_real<<","<<c.m_imag<<")";
return out;
}
Complex operator+(int i, const Complex &c){ //函数重载为友元
return Complex(c.m_real+i,c.m_imag);
}
void main(){
Complex c;
Complex c1(1,2);
Complex c2(3,4);
c = c1 + c2;
//c = c1 + 10; //11,2 形如c = c1.operator+(10);
c = 10 + c1;
cout<<c<<endl;
}
一个注意点。
#include<iostream>
using namespace std;
class Complex; //对复数类进行声明
ostream& operator<<(ostream& out,const Complex &c);
Complex operator+(int i, const Complex &c); //声明成友元方法
//如果用的是带.h的头文件,则不用写声明
#include<iostream.h>
//using namespace std;
/*
class Complex; //对复数类进行声明
ostream& operator<<(ostream& out,const Complex &c);
Complex operator+(int i, const Complex &c); //声明成友元方法
*/
输出重载成友元函数。
#include<iostream>
using namespace std;
class Complex; //对复数类进行声明
//ostream& operator<<(ostream& out,const Complex &c);
Complex operator+(int i, const Complex &c); //声明成友元方法
//复数
class Complex{
//friend ostream& operator<<(ostream& out,const Complex &c); //友元函数
friend Complex operator+(int i, const Complex &c); //声明成友元方法
public:
Complex():m_real(0),m_imag(0){
}
//10,0构造出对象
Complex(int real,int imag = 0){
m_real = real;
m_imag = imag;
}
~Complex(){
}
public:
void PrintComplex()const{
cout<<"("<<m_real<<","<<m_imag<<")"<<endl;
}
public:
Complex operator+(int i){ //把operator+看成一个整体,是一个函数名
return Complex(m_real+i,m_imag);
}
Complex operator+(const Complex &c){ //把operator+看成一个整体,是一个函数名
return Complex(m_real+c.m_real,m_imag+c.m_imag);
}
public:
ostream& operator<<(ostream& out){ //可以重载成成员函数,必须用对象进行驱动,一般重载成友元函数
cout<<"("<<m_real<<","<<m_imag<<")";
return out;
}
private:
int m_real;
int m_imag;
};
/*
ostream& operator<<(ostream& out,const Complex &c){
cout<<"("<<c.m_real<<","<<c.m_imag<<")";
return out;
}
*/
Complex operator+(int i, const Complex &c){ //函数重载为友元
return Complex(c.m_real+i,c.m_imag);
}
void main(){
Complex c;
Complex c1(1,2);
Complex c2(3,4);
c = c1 + c2;
//c = c1 + 10; //11,2 形如c = c1.operator+(10);
c = 10 + c1;
//cout<<c<<endl;
c<<cout<<endl; //相当于c是对象,调用c.operator<<(cout)
}
输入重载。
#include<iostream>
using namespace std;
class Complex; //对复数类进行声明
ostream& operator<<(ostream& out,const Complex &c);
istream& operator>>(istream& in,Complex &c);
Complex operator+(int i, const Complex &c); //声明成友元方法
//复数
class Complex{
friend ostream& operator<<(ostream& out,const Complex &c); //友元函数
friend istream& operator>>(istream& in,Complex &c);
friend Complex operator+(int i, const Complex &c); //声明成友元方法
public:
Complex():m_real(0),m_imag(0){
}
//10,0构造出对象
Complex(int real,int imag = 0){
m_real = real;
m_imag = imag;
}
~Complex(){
}
public:
void PrintComplex()const{
cout<<"("<<m_real<<","<<m_imag<<")"<<endl;
}
public:
Complex operator+(int i){ //把operator+看成一个整体,是一个函数名
return Complex(m_real+i,m_imag);
}
Complex operator+(const Complex &c){ //把operator+看成一个整体,是一个函数名
return Complex(m_real+c.m_real,m_imag+c.m_imag);
}
/*
public:
ostream& operator<<(ostream& out){ //可以重载成成员函数,必须用对象进行驱动,一般重载成友元函数
cout<<"("<<m_real<<","<<m_imag<<")";
return out;
}
*/
private:
int m_real;
int m_imag;
};
ostream& operator<<(ostream& out,const Complex &c){
cout<<"("<<c.m_real<<","<<c.m_imag<<")";
return out;
}
istream& operator>>(istream& in,Complex &c){
in>>c.m_real>>c.m_imag;
return in;
}
Complex operator+(int i, const Complex &c){ //函数重载为友元
return Complex(c.m_real+i,c.m_imag);
}
void main(){
Complex c;
cin>>c;
cout<<c<<endl;
}
版权声明:本文为博主原创文章,如有错误,恳请大家在评论区指出,在下不胜感激~如要转载注明出处即可~