可以解释一下1234吗,134哪里错了

class CLASS{
double x;
friend void f()

{
    cout<<x<<endl;     // ①
}

public:
CLASS(double n):x(n){} // ②
};
int main()
{
CLASS t(6.8),*p=&t;
t.f(); // ③
p->f(); // ④
return 0;
}
则在注释部分标注编号的行中,编译时没有语法错误的是( )。

1、输出x的值,f是友元函数,友元函数不能直接调用类对象
2、构造函数,初始化x为n
3、通过对象调用f函数,但是f是友元函数,调用是直接调用,所以直接写f()就可以了
4、通过指针调用f函数,但是f是友元函数,调用是直接调用,所以直接写f()就可以了

  1. f()CLASS的友元函数,虽然f()可以访问CLASS的所以成员函数和变量,但是访问时需要有CLASS的对象,这里的x没有对象,所以错误
  2. 正确
  3. f()是友元函数,不是CLASS的成员函数,所以不能这样调用
  4. 同上

修改如下,供参考:

#include <iostream>
using namespace std;
class CLASS {
    double x;
    friend void f(CLASS tmp)
    {
        cout << tmp.x << endl;// ①
    }
public:
    CLASS(double n) :x(n) {}// ②
};
int main()
{
    CLASS t(6.8), * p = &t;
    f(t); // ③
    f(*p); // ④
    return 0;
}