C++ 答案并不清楚,c++;

C++ 答案并不清楚,c++;,c++,C++,下面是一个测试问题: 考虑以下代码: class A { typedef int I; // private member I f(); friend I g(I); static I x; }; 以下哪项是有效的: a. A::I A::f() { return 0; } b. A::I g(A::I p = A::x); c. A::I g(A::I p) { return 0; } d. A::I A::x = 0; 只有第一版(a)才认为这个问题的答案

下面是一个测试问题:

考虑以下代码:

class A {
    typedef int I; // private member
    I f();
    friend I g(I);
    static I x;
};
以下哪项是有效的:

a. A::I A::f() { return 0; }
b. A::I g(A::I p = A::x);
c. A::I g(A::I p) { return 0; }
d. A::I A::x = 0;

只有第一版(a)才认为这个问题的答案是正确的,但为什么?在我看来,所有这些都是有效的。甚至测试了他们编译成功的所有代码。为什么只有第一个答案是正确的?

< P>它们都是有效的C++。 以下是准确的代码,这是标准本身的一个示例:

我就是这样解析它们的:

a. A::I A::f() { return 0; } // defines A::f() which was previously prototyped

b. A::I g(A::I p = A::x);    // declares prototype g(A::I), but doesn't define it

c. A::I g(A::I p) { return 0; } // defines g(A::I)

d. A::I A::x = 0; // defines static storage for A::x which was previously declared in A

这些都是单独或集体编译的。

编写测试原始答案的人是错误的

  • 这个例子(确切地说)来自C++标准本身,第§11/7节,[class.access],并且已经被编写“测试”的人复制
该示例在标准中更进一步,使用了模板(这里我将省略它们):

  • 引用标准进行解释:
这里,
A::I
的所有用法都是格式良好的,因为
A::f
A::x
是 A类和g类的成员是A类的朋友 例如,第一次使用
A::I
时的访问检查必须是 推迟到确定使用
A::I
作为返回 a类成员的类型。]


很难宣称
typedef int I
是一个成员;它是私有类型,但不是真正的成员。但是,这几乎不会影响您问题的答案或问题内部的问题。@重复数据消除或OK;标准说类型是成员——我不会反对标准,我会尝试更新我的术语。我(过去)认为的成员显然是数据成员。哦,好吧……也许b&c被认为是不正确的(尽管这与无效不同),因为A::I是私有的,所以除了从私有方法(如f())调用外,您永远不能调用g()。我想不出一个可能的原因d被认为是错误的。@Narek:幸好你质疑了测试本身。科学怀疑+1您如何知道只有a)是正确的?问题说“是”,表明至少可以给出几个答案。你尝试了吗?这是OTAICE C++测试题。您可以在Google中搜索“typedefint I;//private member”,在每个站点中,Google查找您看到的正确答案的字符串仅标记为第一个答案。这是怎么回事?避免oDesk的另一个原因是什么?我可以用你提供的链接在线编译代码吗?
      class A {
          typedef int I;      // private member
          I f();
          friend I g(I);
          static I x;
      };

      A::I A::f() { return 0; }
      A::I g(A::I p = A::x);
      A::I g(A::I p) { return 0; }
      A::I A::x = 0;