一、类的组合
引言:由于需要分工合作,所以便有了类与类之间的组合关系。一个类可以只干它自己关心的事,而当另一个类需要使用它的功能时,直接嵌套它即可。
源程序:
#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类;而后者求线段长度主要依赖于成员函数/友元函数来实现!!