#include<iostream>
using namespace std;
class Point
{
public:
Point()
{
X=Y=0;
cout<<"默认的构造函数被调用..."<<endl;
}
Point(intx,int y)
{
X=x;
Y=y;
cout<<"带xy的构造函数被调用..."<<endl;
}
GetX()
{
cout<<X<<endl;
}
GetY()
{
cout<<Y<<endl;
}
void Move(int x,int y)
{
X=x;
Y=y;
cout<<X<<Y<<endl;
}
private:
int X,Y;
};
class ArrayOfPoint
{
public:
ArrayOfPoint(int n)
{
numberOfPoints=n;
points=new Point[n];
}
~ArrayOfPoint()
{
numberOfPoints=0;
delete[] points;
cout<<"析构结束..."<<endl;
}
Point& Element(int n)
{
return points[n];
}
private:
int numberOfPoints;
Point *points;
};
int main()
{
int num;
cout<<"请输入要动态创建的个数:"<<endl;
cin>>num;
ArrayOfPoint Point(num);
Point.Element(0).Move(5,4);
Point.Element(1).Move(65,99);
return 0;
}
解释一下Point& Element(int n)
这里的Point是返回类型,Point&是按地址传送返回值。 如果把&去掉变成 Point Element(int n) 再加上语句 Point p=points.Element(0); p.Move(5,10); 那么p就是一个新建的对象,系统将points中单元0中存放的值复制给p,p是points的单元0的一个副本。你对p所做的操作不会影响points的单元0中的值。当操作完成时p会被析构。 把&再加回去: Point& Element(int n) Point p=points.Element(0); p.Move(5,10); 系统将Element(0)的返回值按地址赋给p,p的地址就是points的单元0的地址,p是points的单元0的一个别名。你对p所做的操作就是直接对points的单元0操作,会影响points的单元0中的值。同时操作结束后不会调用析构函数。
加&是返回一个变量的引用。简单地说加了&返回的是points[index]的引用,就能对其赋值;不加&,就只是一个返回值,不能对points[index]赋值。
C++中point&element(int size)同pointelement(int size)有什么区别
前者是声明对象的引用,后者是声明一个对象。引用是一个对象的别名,主要用于函数参数和返回值。说直白点,引用就是一个内存的别名。所以两两者在作为函数参数传递时不一样,引用传递的是地址,而后者传递的是值。 加了引用的好处好处最大的一个是返回值可以成为一个左值。 假设这个函数在类C中,则你可以这样写 C a; C b; c.element(size1) = b.element(size2) = b.elemnt(size3)。 这样可以方便的改写某个类的某个成员。至少这样的写法暗示了这个类需要这样的功能。
因为我们创建的points对象是一个在类内部由动态数组实现的对象,而我们对数组的操作无非就是取元素,改变元素,如果element不返回一个引用时,那么我们可以认为这个元素是只读的,我们无法通过赋值等途径改变这个元素(其实是一个对象)的值,而我们返回一个引用的话,就相当于取出元素本身,就可以对它进行正常的读写操作。这样才符合数组的性质。
整理网上资料所得。。。。。。谢谢。