#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不返回一个引用时,那么我们可以认为这个元素是只读的,我们无法通过赋值等途径改变这个元素(其实是一个对象)的值,而我们返回一个引用的话,就相当于取出元素本身,就可以对它进行正常的读写操作。这样才符合数组的性质。
整理网上资料所得。。。。。。谢谢。