C++基础---友元

友元概念


友元函数

定义:
friend<数据类型><友元函数名>(参数列表)
#include<iostream>
using namespace std;

//定义友元函数
class Rectangle
{
private:
    double length;
    double  width;
public:
    Rectangle(double l,double w):length(l),width(w){}
    friend double area(Rectangle &Rec); //定义友元
};
//友元实现
double area(Rectangle &Rec)
{
    return Rec.length*Rec.width;
}
int main()
{
    Rectangle Rect(12.0,2.1);
    cout<<"The area is "<<area(Rect);
    return 0;
}

友元成员


#include<iostream>
#include<string.h>

using namespace std;

class Boy;  //提起声明

class Girl
{
private:
  char *name;
  int age;
public:
   Girl(char *n,int num);
   void display(Boy &boy);
   ~Girl();
};

 Girl::Girl(char *n,int num)
 {
    name = new char[strlen(n)+1];
    strcpy(name ,n);
    age = num;
 }
 Girl::~Girl()
 {
     delete name;
 }

class Boy
{
private:
   char* name;
   int age;
public:
   Boy(char *n,int a);
   friend void Girl::display(Boy &b);  //声明友元函数
   ~Boy();
};

 Boy::Boy(char *n,int num)
 {
    name = new char[strlen(n)+1];
    strcpy(name ,n);
    age = num;
 }
 Boy:: ~Boy()
 {
     delete name;
 }
void Girl::display(Boy &b)
{
    cout<<"Girl\'s name: "<<name <<"  age :"<<age<<endl;
    cout<<"Boy\'s name: "<<b.name <<"  age :"<<b.age<<endl;
}


int main()
{
    Girl g("helinqian",28);
    Boy  b("yuanqianqian",27);
    g.display(b);
    return 0;
}
友元类

友元类一般形式:
friend class<友元类名>
using namespace std;

class Boy;  //提起声明

class Girl
{
private:
  char *name;
  int age;
public:
   Girl(char *n,int num);
   void display(Boy &boy);
   ~Girl();
};

 Girl::Girl(char *n,int num)
 {
    name = new char[strlen(n)+1];
    strcpy(name ,n);
    age = num;
 }
 Girl::~Girl()
 {
     delete name;
 }

class Boy
{
private:
   char* name;
   int age;
public:
   Boy(char *n,int a);
   friend class Girl;  //声明类girl是类boy的友元函数
   ~Boy();
};

 Boy::Boy(char *n,int num)
 {
    name = new char[strlen(n)+1];
    strcpy(name ,n);
    age = num;
 }
 Boy:: ~Boy()
 {
     delete name;
 }
void Girl::display(Boy &b)
{
    cout<<"Girl\'s name: "<<name <<"  age :"<<age<<endl;
    cout<<"Boy\'s name: "<<b.name <<"  age :"<<b.age<<endl;
}


int main()
{
    Girl g("helinqian",28);
    Boy  b("yuanqianqian",27);
    g.display(b);
    return 0;
}

注意事项:
友元关系不能被继承。
友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明
友元可以访问类的私有成员。
只能出现在类定义内部,友元声明可以在类中的任何地方,一般放在类定义的开始或结尾。
友元可以是普通的非成员函数,或前面定义的其他类的成员函数,或整个类。
类必须将重载函数集中每一个希望设为友元的函数都声明为友元。
友元关系不能继承,基类的友元对派生类的成员没有特殊的访问权限。如果基类被授予友元关系,则只有基类具有特殊的访问权限。该基类的派生类不能访问授予友元关系的类。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include <iostream> #include <string> using namespace std; struct CPoint { int x ; int y ; }; class CRectangle { private: const int id;//常量数据成员 static int total;//静态数据成员 const static string sclass; const static int f=1.0f; CPoint lefttop ; CPoint rightdown ; public: CRectangle( ); CRectangle( CPoint& lt, CPoint& rd ); CPoint GetLefttop() const { return lefttop; } CPoint GetRightdown() const { return rightdown; } void SetLefttop(CPoint & pt) { lefttop=pt; } void SetRightdown(CPoint & pt) { rightdown=pt; } int Getid() const { return id; } static int Gettotal() { return total; } int Area( ) const; int Perimeter( ) const; }; int CRectangle::total=0;//静态数据成员必须在类的外部定义(正好一次)。 const string CRectangle::sclass="CRectangle"; CRectangle::CRectangle( ):id(++total) { lefttop.x=0; lefttop.y=0; rightdown.x=1; rightdown.y=1; } CRectangle::CRectangle( CPoint& lt, CPoint& rd ):id(++total) { lefttop = lt ; rightdown = rd ; } int CRectangle::Area( ) const { int wd= rightdown.x - lefttop.x ; int ht= rightdown.y - lefttop.y ; return wd * ht ; } int CRectangle::Perimeter( ) const { int wd= rightdown.x - lefttop.x ; int ht= rightdown.y - lefttop.y ; return 2 * ( wd + ht ) ; } int main() { CPoint lt, rd; cin >> lt.x >> lt.y; cin >> rd.x >> rd.y; CRectangle crt(lt,rd);//调用有参构造函数 CRectangle crt2;//调用默认构造函数 //创建常量对象 const CRectangle crt3(lt,rd); cout<<"当前创建的矩形个数为:"; cout<<CRectangle::Gettotal()<<endl; //返回矩形的左上和右下点 CPoint lt1=crt.GetLefttop(); CPoint lt2=crt.GetRightdown(); //显示矩形的坐标 cout<<crt.Getid()<<"号矩形的坐标是:"<<"("<<lt1.x<<","<<lt1.y<<"), "; cout<<"("<<lt2.x<<","<<lt2.y<<")"<<endl; //显示矩形的面积和周长 cout << "Area:"<<crt.Area( )<<endl; cout <<"Perimeter:"<<crt.Perimeter( )<<endl; //修改矩形的左上角点 cout<<"请输入矩形新的左上点坐标:"; cin>> lt.x>>lt.y; crt.SetLefttop(lt); lt1=crt.GetLefttop(); //显示修改后矩形的坐标 cout<<"矩形的坐标是:"<<"("<<lt1.x<<","<<lt1.y<<"), "; cout<<"("<<lt2.x<<","<<lt2.y<<")"<<endl; //显示修改后矩形的面积和周长 cout << "Area:"<<crt.Area( )<<endl; cout <<"Perimeter:"<<crt.Perimeter( )<<endl; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值