c++语言中带&的成员函数

代码中&element函数,加&和不加&有什么区别?是什么知识点?

#include<iostream>
#include<cassert>

using namespace std;

class Point
{
public:
    Point():x(0),y(0)
    {
        cout<<"Defaut constructor called"<<endl;
    }

    Point(int x,int y):x(x),y(y)
    {
        cout<<"constructor called"<<endl;
    }

    ~Point()
    {
        cout<<"Destructor called"<<endl;
    }

    int getX() const
    {
        return x;
    }

    int getY() const
    {
        return y;
    }

    void move(int newX,int newY)
    {
        x=newX;
        y=newY;
    }

private:
    int x,y;
};

class ArrayOfPoints
{
public:
    ArrayOfPoints(const ArrayOfPoints& v);

    ArrayOfPoints(int size):size(size)
    {
        points=new Point[size];
    }

    ~ArrayOfPoints()
    {
        cout<<"Deleting..."<<endl;
        delete[] points;
    }

    Point &element(int index)
    {
        assert(index>=0 && index<size);
        return points[index];
    }

private:
    Point *points;
    int size;
};

ArrayOfPoints::ArrayOfPoints(const ArrayOfPoints& v)
{
    size = v.size;
    points=new Point[size];
    for(int i=0;i<size;i++)
        points[i]=v.points[i];
}

int main()
{
    int count;
    cout<<"Please input the count of points:";
    cin>>count;

    ArrayOfPoints pointsArray1(count);
    pointsArray1.element(0).move(5,10);
    pointsArray1.element(1).move(15,20);

    ArrayOfPoints pointsArray2=pointsArray1;
    cout<<"copy of pointsArray:"<<endl;
    cout<<"point_0 of array2:"<<pointsArray2.element(0).getX()<<","
        <<pointsArray2.element(1).getY()<<endl;
    cout<<"point_1 of array2:"<<pointsArray2.element(1).getX()<<","
        <<pointsArray2.element(1).getY()<<endl;

    pointsArray1.element(0).move(25,30);
    pointsArray1.element(1).move(35,40);
    cout<<"After the moving of pointsArray1:"<<endl;
    cout<<"point_0 of array2 :"<<pointsArray2.element(0).getX()<<","
        <<pointsArray2.element(0).getY()<<endl;
    cout<<"point_1 of array2:"<<pointsArray2.element(1).getX()<<","
        <<pointsArray2.element(1).getY()<<endl;

    return 0;

}


加上引用,可以提高性能,减少一次参数的复制

加 const 引用好处
1 - 省去函数体中的拷贝构造和析构,提高执行效率
2 - 在值被代码意外修改时,会编译报错

你可以看看这个 3.4 节

【以下回答由 GPT 生成】

ArrayOfPoints类中的element函数是一个返回Point类型引用的成员函数。这个函数的作用是返回数组中指定索引位置的元素。使用&符号的原因是要返回一个引用,而不是返回一个副本。通过返回引用,可以直接对数组中的元素进行修改。

这段代码涉及以下知识点: - 类的构造函数和析构函数:Point类和ArrayOfPoints类都定义了构造函数和析构函数,用来初始化对象和释放资源。 - 封装:Point类将坐标数据封装起来,并提供了访问和修改坐标的函数。 - 动态内存分配:ArrayOfPoints类在构造函数中使用new关键字分配了一个动态数组,并在析构函数中使用delete关键字释放了内存。 - 引用:ArrayOfPoints类的element函数返回了一个引用,允许对数组中的元素进行直接修改。 - 拷贝构造函数:ArrayOfPoints类定义了一个拷贝构造函数,用于在创建新对象时进行深拷贝。

解决方案:

Point &element(int index)
{
    assert(index >= 0 && index < size);
    return points[index];
}

这段代码定义了一个返回Point类型引用的成员函数element。在函数体中,首先通过assert函数检查索引是否有效,然后返回数组中指定索引位置的元素的引用。

使用&符号的原因是为了返回一个引用,而不是返回一个副本。因为返回一个副本的话,对副本的修改不会影响到原数组中的元素。通过返回引用,可以直接对原数组中的元素进行修改。这种方式可以减少内存消耗,避免对大对象进行值拷贝的性能损耗。同时,在需要访问或修改数组中的元素时,也更加直观和方便。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^