一、类的组合

引言:由于需要分工合作,所以便有了类与类之间的组合关系。一个类可以只干它自己关心的事,而当另一个类需要使用它的功能时,直接嵌套它即可。

源程序:

#include "stdafx.h"
#include<iostream>
#include<cmath>
using namespace std;

//定义Point类
class Point{
public:
 Point(int x=0,int y=0): x(x),y(y){}
 int getX(){ return x;}
 int getY(){ return y;}
private:
 int x,y;
};

//定义Line类
class Line{
public:
 Line(Point p1,Point p2);
 double getLength(){ return length;}
private:
 Point p1,p2;//所谓类的组合,指的是类中内嵌其它类的对象作为成员数据!
 double length;
};

Line::Line(Point p1,Point p2): p1(p1),p2(p2){
 double x=static_cast<double>(p1.getX()-p2.getX());//类的组合中,还是只能通过对象引用其成员函数(对于两个类而言,它们只是分工不同而已,它们并没有特殊关系)
 double y=static_cast<double>(p1.getY()-p2.getY());
 length=sqrt(x*x+y*y);
}

 


//主函数
int _tmain(int argc, _TCHAR* argv[])
{
 Point myp1(1,1),myp2(4,5);//定义Point类的对象
 Line line(myp1,myp2);//定义Line类的对象!
 cout<<"the length of line:";
 cout<<line.getLength()<<endl;;
 return 0;
}
 

 

二、友元类:描述的是类与类之间的关系,也即共享。

class A{
public:
 void display(){ cout<<x<<endl;}
 int getX(){ return x;}
 friend class B;//声明B是A的友元类
private:
 int x;
};
……

class B{
public:
 void set(int i);
 void display();
private:
 A a;
};
void B::set(int i){
 a.x=i;//在类B中,可以通过对象访问类A的私有成员
}
 

【注意】 ①友元类是单向关系,即B——>A;②友元类不能派生,即B跟A的子类无关;③友元类也不能传递,即C——>B——>A不能直接C——>A。

 

 

 

关于友元函数:描述的是友元函数与该类的关系,似乎没起到什么大的用处,下面的程序是求线段长的另一种方法。

源程序:

#include "stdafx.h"
#include<iostream>
#include<cmath>
using namespace std;

//定义Point类
class Point{
public:
 Point(int x=0,int y=0): x(x),y(y){}
 int getX(){ return x;}
 int getY(){ return y;}
 friend float dist(Point &p1,Point &p2);//①友元函数是在类中声明的非成员函数!
private:
 int x,y;
};

//友元函数的实现
float dist(Point &p1,Point &p2){    //②因为是非成员函数,所以它的实现不需要在前面加上Point::作用域
 double x=p1.x-p2.x;//③友元函数可以通过对象访问类的私有成员数据(这和普通成员函数有区别吗?)
 double y=p1.y-p2.y;
 return static_cast<float>(sqrt(x*x+y*y));
}


//主函数
int _tmain(int argc, _TCHAR* argv[])
{
 Point myp1(1,1),myp2(4,5);
 cout<<"the distance is:";
 cout<<dist(myp1,myp2)<<endl;
 return 0;
}

 

------------------------------------------------------------------------------------------

就本题的求线段长而言,个人觉得使用static成员函数来的更方便、更容易理解,源程序如下:

#include "stdafx.h"
#include<iostream>
#include<cmath>
using namespace std;

//定义Point类
class Point{
public:
 Point(int x=0,int y=0): x(x),y(y){}
 int getX(){ return x;}
 int getY(){ return y;}
 static float dist(Point &p1,Point &p2);//静态成员函数
private:
 int x,y;
};

//静态成员函数的实现
float Point::dist(Point &p1,Point &p2){   
 double x=p1.x-p2.x;
 double y=p1.y-p2.y;
 return static_cast<float>(sqrt(x*x+y*y));
}


//主函数
int _tmain(int argc, _TCHAR* argv[])
{
 Point myp1(1,1),myp2(4,5);
 cout<<"the distance is:";
 cout<<Point::dist(myp1,myp2)<<endl;
 return 0;
}

 

 

【总结】 后两种与类的组合区别是:类的组合中是分工合作,有嵌套,求线段长度依赖于Line类;而后者求线段长度主要依赖于成员函数/友元函数来实现!!