即使"朋友类直接"已经在square class中注释为什么它正在改变rect类的私有变量?

时间:2016-06-22 07:24:56

标签: c++ friend-class

与下面的朋友类使用方案混淆,请帮我解决一下

#include <iostream>

using namespace std;

class square;

class rect {
    public :
            rect(int w = 0, int h = 0) : width(w), height(h), volume(w*h) {}
            void set_data(square &);
            int get_width(void)
            {
                return width;
            }
            int get_height(void)
            {
                return height;
            }
            int get_volume(void);
    private :
            int width;
            int height;
            int volume;
};

class square {
    public :
            square(int w = 0, int h = 0) : width(w), height(h), volume(w*h) {}
            int width;
            int height;
            int get_volume(void);
**//          friend class rect;**
    private :
            int volume;
};

void rect :: set_data(square &s)
{
    width = s.width; *// the variables of rect class are private and it shud not allow to change as i have commented "//friend class rect;" the sentence in square class.* 
    height = s.height;
}

int rect :: get_volume(void)
{
    return volume;
}

int square :: get_volume(void)
{
    return volume;
}

int main()
{
    rect r(5,10);
    cout<<r.get_volume()<<endl;
    square s(2,2);
    cout<<s.get_volume()<<endl;
    cout<<endl;
    cout<<endl;
    r.set_data(s); *// accessing the private members of the rect class through object of square class*
    cout<<"new width : "<<r.get_width()<<endl;
    cout<<"new height : "<<r.get_height()<<endl;
    cout<<r.get_volume()<<endl;
    return 0;
}

根据朋友指南,如果我们使用朋友类,那么它可以访问和修改其朋友类的私人成员,所以即使我已经评论了&#34; //朋友类rect;&#34;为什么我看到矩形的成员已被方形类改变为&#34; r.set_data(s);&#34;这个功能 在正常情况下,根据我的理解,类的私有变量只有在它是友元类时才能被改变(所以在下面输出新宽度和新高度不应该改变,因为我已经注释了&#34; //朋友类rect; &#34;但即使它被注释,我看到通过set_data函数更改了rect类的变量,所以如果仅通过将其他对象传递给任何函数来更改私有成员,则需要使用friend类。

    output of the program :

    50
    4

    new width : 2
    new height : 2
    50 

1 个答案:

答案 0 :(得分:3)

set_data是类rect的方法。它将square的公共数据成员复制到rect的私有数据成员中。没什么好奇的,friend在这里无关。当您拨打电话时,您不会在rect之前修改square的私人成员,而是通过类set_data本身的公共方法rect进行修改。从square获取新值并不意味着square修改它们。当您说'{34}修改rect&#34;的私有成员时,它意味着从类square的方法访问它们,这不是这里的情况。