对象的成员函数可以修改另一个对象吗?

时间:2019-01-07 03:51:59

标签: c++ member-functions this-pointer

今天的问题是,一个对象可以修改另一个具有相同类类型的对象吗?例如,假设一个类有一些私有数据成员。我们创建该类类型的两个对象。一个对象如何修改另一个对象?这样做合法吗?

我们可以编写一个成员函数使一个对象能够修改另一个具有相同类类型的对象吗?如果某个对象代表视频游戏中的战斗机,并且您想让一个战斗机能够伤害另一架战斗机,那么这可能很有用。

事实证明,可以在C ++中执行此操作。我们想了解为什么C ++使我们能够执行此操作。这样做,我们必须首先了解成员函数实际上是什么以及它如何工作。阅读问题的答案。

1 个答案:

答案 0 :(得分:0)

在这里,我们有一个class Bucket,其中有两个私有数据成员。还有一个构造函数,一个复制构造函数和一些其他函数。让我们将注意力转移到modifyOther函数上。它采用单个参数,该参数是指向Bucket对象的指针。然后,该成员函数可以编辑其他Bucket对象。

#include <iostream>
using namespace std;

class Bucket {
  public:
    // Acts as constructor acceptint two arguments x and y,
    // one argument x,
    // or no arguments (default constructor).
    Bucket(int x = 0, int y = 0) : x(x), y(y) {}

    Bucket(const Bucket& rhs)
    {
        this->x = rhs.x;
        this->y = rhs.y;
    }

    void modifyOther(Bucket* other)
    {
        other->x = -1;
        other->y = 1;
    }

    void printInfo()
    {
        cout << "x = " << this->x << endl;
        cout << "y = " << this->y << endl;
        cout << endl;
    }
  private:
    int x;
    int y;
};


int main()
{
    Bucket a(10, 5);
    a.printInfo();

    Bucket b(8, 9);
    b.printInfo();

    a.modifyOther(&b);

    a.printInfo();
    b.printInfo();

    return 0;
}

main()函数中,我们声明了两个class Base类型的对象。请注意,它们是相同的数据类型。那很重要。然后,我们调用对象a的{​​{1}}函数来成功修改对象modifyOther的内部私有数据成员。

以下是此代码的输出:

b

现在您可能在想,这不合法吗?私有数据成员不是只允许对象本身访问吗?事实证明,x = 10 y = 5 x = 8 y = 9 x = 10 y = 5 x = -1 y = 1 private之类的成员访问说明由编译器强制执行,并且编译器没有单个对象的概念,只有类。

public数据成员可以由其类内部的任何内容访问,并且可以由该类的成员函数访问。由于private是类型modifyOther的成员函数,因此它可以访问class Base变量privateint x并进行更改。因此,这里没有违反任何规则。

什么是成员函数?它只是一个独立的函数,它使用指向调用对象的“不可见”指针,并通过该指针访问对象。该指针称为int y。查看this函数。我使用printInfo来表示成员变量是有原因的。因为所有成员函数都使用指向调用对象的“不可见” this->y指针,所以该函数实际上如下所示:

this

请注意,我故意为此功能添加了最后一行。将void printInfo(Bucket* this) { cout << "x = " << this->x << endl; cout << "y = " << this->y << endl; cout << endl; // this->x = -1; } 函数的定义与printInfo函数的比较。它们看起来非常相似。实际上,唯一的区别是modifyOther参数的名称! Bucket*是指向调用对象的隐式指针。 Bucket* this只是指向其他Bucket* other对象的指针。编译器是“哑”的,它不能仅根据它们的名称来区分这两个Bucket之间的区别。它对待他们一样!因此,我们可以得出结论,用于修改调用对象的相同机制也可以用于修改相同类类型的另一个对象。

请记住,我们不能使用相同的技巧来传递指向另一个类型的对象的指针并对其进行修改。这是行不通的。成员函数只能访问同一类中的 Bucket *表示该变量只能由该特定类的成员函数修改,而不能由其他任何成员函数修改。 private变量不能被外界修改,因此外界也包括不同类的任何成员函数。

如果您不理解此主题,请在StackOverflow上查看我的类似问题,也请观看我在研究此主题时发现的YouTube视频。

Are there multiple member functions compiled for each C++ object?

What is the 'this' pointer?

https://www.youtube.com/watch?v=_Wv-lEl1sgg&t=0s