友元与类的提前编译

友元:
友元函数:
#include
using namespace std ;

class Time {
 
    public:
      Time (int,int ,int );
      friend voiddisplay (Time &);
      private:
      inthour;
      intminute;
      int sec;

};

Time ::Time(int h , int m ,int s )
{
      hour = h;
      minute = m;
      sec =s;
}
void display( Time & t)
{
      cout<<t.hour <<endl << t.minute<< t.sec ;
}
int main()
{
      Timet(10,13,56);
      display(t);
      return 0;
}

友元成员函数
#include
using namespace std ;
class Date ;
class Time {
      public:
      Time (int,int ,int );

      voiddisplay(Date &);
      private:
      inthour;
      intminute;
      int sec;

};
class Date{
      public:
      friend voidTime::display(Date &);//声明time类中的display函数为本类的友元成员函数
      Date(int ,int ,int );
      private:
      intmonth;
      int day;
      int year;
};
Time ::Time(int h , int m ,int s )
{
      hour = h;
      minute = m;
      sec =s;
}
//注意:void Time::display( Date & t)必须声明在classDate后,因为他们要使用Date里面的成员。
void Time::display( Date & t)
{
      cout<<t.month <<endl << t.day<<endl<< t.year<<endl ;
}
Date::Date(int m, int d ,int y )
{
          month = m;
      day =d;
      year = y;
}
int main()
{
      Timet(10,13,56);
      Date dl(12,25,2004);
      t.display(dl);
      return 0;
}

类的提前引用:
      在一般情况下,类必须先声明,然后才能使用他。但是在特殊情况下,在正式生命之前,需要使用该类名。但是注意,类的提前声明使用范围是有限的。只有在正式声明一个类以后才能定义他去定义对象。
因为在定义对象时要为这些对象分配存储空间,在正式声明类之前,编译系统无法确定应为对象分配多大的空间。编译系统只有在“见到”类体后,才能确定应该为对象预留多大的空间。在对一个类做了提
前声明后,可以使用该类的名字去定义指向该类型对象的指针变量或者对象的引用(),因为指针变量和引用本身的大小是固定的,以它指向的类对象的大小无关。

友元类:
#include
using namespace std ;
class Date ;
class Time {
      public:
      Time (int,int ,int );
      voiddisplay(Date &);
      private:
      inthour;
      intminute;
      int sec;
};
class Date{
      public:
      friend classTime;//声明time类中的display函数为本类的友元成员函数
      Date(int ,int ,int );
      private:
      intmonth;
      int day;
      int year;
};
Time ::Time(int h , int m ,int s )
{
      hour = h;
      minute = m;
      sec =s;
}
void Time::display( Date & t)
{
      cout<<t.month <<endl << t.day<<endl<< t.year<<endl ;
}
Date::Date(int m, int d ,int y )
{
          month = m;
      day =d;
      year = y;
}
int main()
{
      Timet(10,13,56);
      Date dl(12,25,2004);
      t.display(dl);
      return 0;
}
好的,关于关系的定义,我们知道,关系是一种之间的特殊关系,在这种关系下,的成员函数可访问其它的私有成员变量。下面是我编写的具体实现。 ``` #include<iostream> using namespace std; class Student;//提前声明 class Score { public: void setScore(Student &stu);//设置成绩 }; class Student { friend class Score;//Score为 private: int id;//学号 string name;//姓名 int age;//年龄 public: void setId(int id){this->id = id;}//设置学号 void setName(string name){this->name = name;}//设置姓名 void setAge(int age){this->age = age;}//设置年龄 }; void Score::setScore(Student &stu) { //使用关系,访问Student的私有成员变量 cout<<"请输入"<<stu.name<<"的成绩:"<<endl; int score; cin>>score; cout<<stu.name<<"的学号为"<<stu.id<<",年龄为"<<stu.age<<",成绩为"<<score<<endl; } int main() { Student stu; stu.setId(1); stu.setName("小明"); stu.setAge(20); Score sc; sc.setScore(stu);//通过Score对象访问Student的私有成员变量 return 0; } ``` 在上面的程序中,我们定义了两个:Student和Score。其中,Score是Student,表示Score可以访问Student的私有成员变量。实现时,我们声明了一个名为setScore的Score成员函数,该函数的参数为Student的对象引用,通过该函数我们可以访问Student的私有成员变量,最后输出该学生的成绩。 编译并运行上述程序,输出结果为: ``` 请输入小明的成绩: 95 小明的学号为1,年龄为20,成绩为95 ``` 可以看到,我们成功地运用关系定义了一个能够访问另一个的私有成员变量的,同时实现了相应的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值