展开全部
1.什么是友元函数?
一个类的私有数据成员通常只能由类的函数成员来访问,而友元函数可以访问类的私有数据成员,也能访问其保护成员
2. 友元函数的用处体现在哪里?
2.1 使用友元函数可提高性能,如:用友元函数重载操作符和生成迭代器类
2.2 用友元函数可以访问两个或多个类的私有数据,较其它方法使人们更容易理解程序的逻辑关系
3. 使用友元函数前应注意:
3.1 类的友元函数在类作用域之外定义,但可以访问类的私有和保护成员
3.2 尽管类定义中有友元函数原型,友元函数仍然不是成员函数
3.3 由于友元函数不是任何类的成员函数,所以不能用句柄(对象)加点操作符来调用
3.4 public, private, protected成员访问符与友员关系的声明无关,因此友元关系声明可在类定义的任何位置,习惯上在类定义的开始位置
3.5 友元关系是指定的,不是获取的,如果让类B成为类A的友元类,类A必须显式声明类B为自己的友元类
3.6 友元关系不满足对称性和传递性
3.7 如果一个友元函数想与两个或更多类成为友元关系,在每个类中都必须声明为友元函数
4. 注:由于C++属于混合语言,常在同一个程序中采用两种函数调用且这两种函数调用往往是相反的。类C语言的调用将
基本数据或对象传递给函数,C++调用则是将函数(或信息)传递给对象
例子如下:
#include <iostream>
using namespace std;
class Car
{
friend void display(Car); //类"Car"的朋友display() //友元函数的声明
private:
int speed;
char color[20];
public:
void input( )
{
cout<<"Enter the color : ";
cin>>color;
cout<<"Enter the speed : ";
cin>>speed;
}
};
void display(Car x) //友元函数的定义
{
cout<<"The color of the car is : "<<x.color<<endl;
cout<<"The speed of the car is : "<<x.speed<<endl;
}
int main( )
{
Car mine;
mine.input( ); //访问成员函数
display(mine); //友元函数的使用 //将对象"mine"传给友元函数
return 0;
}
输出结果:
Enter the color: green 回车
Enter the speed: 100 回车
The color of the car is : green
The speed of the car is : 100
一个类的私有数据成员通常只能由类的函数成员来访问,而友元函数可以访问类的私有数据成员,也能访问其保护成员
2. 友元函数的用处体现在哪里?
2.1 使用友元函数可提高性能,如:用友元函数重载操作符和生成迭代器类
2.2 用友元函数可以访问两个或多个类的私有数据,较其它方法使人们更容易理解程序的逻辑关系
3. 使用友元函数前应注意:
3.1 类的友元函数在类作用域之外定义,但可以访问类的私有和保护成员
3.2 尽管类定义中有友元函数原型,友元函数仍然不是成员函数
3.3 由于友元函数不是任何类的成员函数,所以不能用句柄(对象)加点操作符来调用
3.4 public, private, protected成员访问符与友员关系的声明无关,因此友元关系声明可在类定义的任何位置,习惯上在类定义的开始位置
3.5 友元关系是指定的,不是获取的,如果让类B成为类A的友元类,类A必须显式声明类B为自己的友元类
3.6 友元关系不满足对称性和传递性
3.7 如果一个友元函数想与两个或更多类成为友元关系,在每个类中都必须声明为友元函数
4. 注:由于C++属于混合语言,常在同一个程序中采用两种函数调用且这两种函数调用往往是相反的。类C语言的调用将
基本数据或对象传递给函数,C++调用则是将函数(或信息)传递给对象
例子如下:
#include <iostream>
using namespace std;
class Car
{
friend void display(Car); //类"Car"的朋友display() //友元函数的声明
private:
int speed;
char color[20];
public:
void input( )
{
cout<<"Enter the color : ";
cin>>color;
cout<<"Enter the speed : ";
cin>>speed;
}
};
void display(Car x) //友元函数的定义
{
cout<<"The color of the car is : "<<x.color<<endl;
cout<<"The speed of the car is : "<<x.speed<<endl;
}
int main( )
{
Car mine;
mine.input( ); //访问成员函数
display(mine); //友元函数的使用 //将对象"mine"传给友元函数
return 0;
}
输出结果:
Enter the color: green 回车
Enter the speed: 100 回车
The color of the car is : green
The speed of the car is : 100
展开全部
#include "iostream.h"
class a
{ int i;
public:
a(int n):i(n){}
friend void show(a & p);
//show就是类a的友元函数,它不是类a的成员函数,只是能访问类a的私有成员而已
};
void show(a & p)
{ cout<<p.i<<endl;
}
void main()
{ a b(10);
show(b);
}
//输出结果:10
class a
{ int i;
public:
a(int n):i(n){}
friend void show(a & p);
//show就是类a的友元函数,它不是类a的成员函数,只是能访问类a的私有成员而已
};
void show(a & p)
{ cout<<p.i<<endl;
}
void main()
{ a b(10);
show(b);
}
//输出结果:10
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
之前作过得一个练习,有使用友元函数,或许对你有点用。
#include <iostream.h>
using namespace std;
class MyDate
{
public:
friend ostream& operator<<(ostream &os,const MyDate &t);
friend istream& operator >>(istream &is,MyDate& t);
MyDate():m_year(0),m_month(1),m_day(1){}
MyDate(int year,int month,int day)
:m_year(year),m_month(month),m_day(day)
{
int nDays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},nDay=nDays[m_month];
if(IsLeepYear()&&m_month==2) nDay++;
if(m_year<0) m_year=0;
if(m_month<1) m_month=1;
else if(m_month>12) m_month=12;
if(m_day<1) m_day=1;
else if(m_day>nDay) m_day=nDay;
}
~MyDate(){}
int Set(int year,int month,int day)
{
int nDays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},nDay=nDays[m_month];
if(IsLeepYear()&&m_month==2) nDay++;
if(year<0||month<1||month>12||day<1||day>nDay) return 0;
m_year=year;
m_month=month;
m_day=day;
return 1;
}
MyDate& operator++(int)
{
int nDays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},nDay=nDays[m_month];
if(IsLeepYear()&&m_month==2) nDay++;
if(m_day+1>nDay)
{
m_month++;
m_day=1;
if(m_month>12)
{
m_year++;
m_month=1;
}
}
else
{
m_day++;
}
return *this;
}
MyDate& operator+=(int day)
{
int nDays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},nDay=nDays[m_month];
if(IsLeepYear()&&m_month==2) nDay++;
if(m_day+day>nDay)
{
m_month++;
m_day=m_day+day-nDay;
if(m_month>12)
{
m_year++;
m_month=1;
}
}
else
{
m_day+=day;
}
return *this;
}
int IsLeepYear(int year)
{
return (year%4==0&&year%100!=0||year%400==0);
}
int IsLeepYear()
{
return IsLeepYear(m_year);
}
private:
int m_year,m_month,m_day;
};
ostream& operator<<(ostream &os,const MyDate &t)
{
os<<t.m_day<<"/"<<t.m_month<<"/"<<t.m_year<<endl;
return os;
}
istream& operator >>(istream &is,MyDate& t)
{
cout<<"input Y M D"<<endl;
is>>t.m_year>>t.m_month>>t.m_day;
return is;
}
int main()
{
//构造函数输入日期,再次执行加一天,加多天操作。
MyDate date(2011,10,25);
cout<<date;
date++;
cout<<date;
date+=10;
cout<<date;
cout<<endl;
//设置函数输入日期,再次执行加一天,加多天操作。
date.Set(2011,10,25);
cout<<date;
date++;
cout<<date;
date+=10;
cout<<date;
cout<<endl;
//使用输入日期,再次执行加一天,加多天操作。
cin>>date;
cout<<date;
date++;
cout<<date;
date+=10;
cout<<date;
cout<<endl;
cin.get();
cin.get();
return 0;
}
#include <iostream.h>
using namespace std;
class MyDate
{
public:
friend ostream& operator<<(ostream &os,const MyDate &t);
friend istream& operator >>(istream &is,MyDate& t);
MyDate():m_year(0),m_month(1),m_day(1){}
MyDate(int year,int month,int day)
:m_year(year),m_month(month),m_day(day)
{
int nDays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},nDay=nDays[m_month];
if(IsLeepYear()&&m_month==2) nDay++;
if(m_year<0) m_year=0;
if(m_month<1) m_month=1;
else if(m_month>12) m_month=12;
if(m_day<1) m_day=1;
else if(m_day>nDay) m_day=nDay;
}
~MyDate(){}
int Set(int year,int month,int day)
{
int nDays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},nDay=nDays[m_month];
if(IsLeepYear()&&m_month==2) nDay++;
if(year<0||month<1||month>12||day<1||day>nDay) return 0;
m_year=year;
m_month=month;
m_day=day;
return 1;
}
MyDate& operator++(int)
{
int nDays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},nDay=nDays[m_month];
if(IsLeepYear()&&m_month==2) nDay++;
if(m_day+1>nDay)
{
m_month++;
m_day=1;
if(m_month>12)
{
m_year++;
m_month=1;
}
}
else
{
m_day++;
}
return *this;
}
MyDate& operator+=(int day)
{
int nDays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},nDay=nDays[m_month];
if(IsLeepYear()&&m_month==2) nDay++;
if(m_day+day>nDay)
{
m_month++;
m_day=m_day+day-nDay;
if(m_month>12)
{
m_year++;
m_month=1;
}
}
else
{
m_day+=day;
}
return *this;
}
int IsLeepYear(int year)
{
return (year%4==0&&year%100!=0||year%400==0);
}
int IsLeepYear()
{
return IsLeepYear(m_year);
}
private:
int m_year,m_month,m_day;
};
ostream& operator<<(ostream &os,const MyDate &t)
{
os<<t.m_day<<"/"<<t.m_month<<"/"<<t.m_year<<endl;
return os;
}
istream& operator >>(istream &is,MyDate& t)
{
cout<<"input Y M D"<<endl;
is>>t.m_year>>t.m_month>>t.m_day;
return is;
}
int main()
{
//构造函数输入日期,再次执行加一天,加多天操作。
MyDate date(2011,10,25);
cout<<date;
date++;
cout<<date;
date+=10;
cout<<date;
cout<<endl;
//设置函数输入日期,再次执行加一天,加多天操作。
date.Set(2011,10,25);
cout<<date;
date++;
cout<<date;
date+=10;
cout<<date;
cout<<endl;
//使用输入日期,再次执行加一天,加多天操作。
cin>>date;
cout<<date;
date++;
cout<<date;
date+=10;
cout<<date;
cout<<endl;
cin.get();
cin.get();
return 0;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询