代码之家  ›  专栏  ›  技术社区  ›  Sadique

Const Member函数Vs Const Friend函数

c++
  •  1
  • Sadique  · 技术社区  · 14 年前

    此代码如何修改常量函数中的值:

    #include<iostream>
    using namespace std;
    class Y;
    class X{
      public:
        void access(Y &y) const;
    };
    
    class Y{
        int d;
      public:
        friend void X::access(Y &y) const;
        Y(){d=0;}
    }; 
    
    void X::access(Y &y) const 
    {
        cout<<"Y is "<<y.d<<endl;
        y.d=1;
        cout<<"Y is "<<y.d<<endl;
    }
    
    int main() {
        X x;
        Y y;
        x.access(y);
    }
    

    这个代码给出了一个错误:

    #include<iostream>
    
    using namespace std;
    
    class Y{
        int d;
      public:
        void set() const{d=0;}
    };                          
    
    int main() {
        Y y1;
        return 0;
    }
    
    4 回复  |  直到 14 年前
        1
  •  3
  •   fredoverflow    14 年前

    const 功能,仅限 *this 常数 ,而不是传递给函数或其他任何东西的参数。

        2
  •  4
  •   Michael Burr    14 年前

    因为在你的第一个例子中:

    void X::access(Y &y) const;
    

    const 告诉编译器函数不会修改 class X 隐式 this 参数指向。这个 class Y 作为引用传递的对象不是 .

    set() 函数是 Y类 :

     void set() const
    

    它的声明是这样的 指向Y对象的参数是常量指针(因此无法修改对象)。

    X::access() 不允许修改 Y 对象,将声明更改为:

    void X::access(Y const& y) const;
    
        3
  •  2
  •   James McNellis    14 年前

    在第一个例子中,const限定符 X::access(Y &y) const 意味着 X 无法修改调用它的对象。自从 Y 参数由非常量引用获取,可以在函数中修改。

    在第二个例子中,const限定符 Y::set() const 意味着 d .

        4
  •  2
  •   stijn    14 年前

    在第一个示例中,在方法X::access中修改Y.d。该方法不会修改X本身的任何成员,因此是完全正常的。

    但是,在第二个示例中,Y::set()方法被声明为const,因此它不能更改Y::d。