1
#include <iostream>

class Y
{
      public:
             Y();
};

class X
{
      public:
             void foo() {}
             friend Y::Y();

             X()
             {
                    Y::Y();  //Statement 1
             }
};

Y::Y()
{
   std::cout << "Hello";
}

int main()
{
    X a;
    Y::Y();      //Statenent 2
}

上面的程序HelloHello在 Dev c++ 和键盘上产生输出。但是当我在 Code::Blocks 上运行时,它给出了错误remove the reduntant Y::

如果我用 h 替换语句 1 和 2 Y();,程序会产生所有 3 的输出。为什么会这样?

4

3 回答 3

4

在每一个类里面XX都可以用来指代那个类。例如,这允许

struct X {
  struct Y {
    static int f();
  };
};
int X::Y::f() {
  Y y;
  return 0;
}
int main() {
  return X::Y::f();
}

工作,即使Y 似乎不在X::Y::f.

标准指定的方式已经改变。在最初的 C++ 标准中,Y被简单地视为 的成员::X::Y,并且意味着::X::Y. 这种解释使得无法引用构造函数,因为X::X它始终是一种类型。结果,在第一个 TC 中,标准被更改为X::X引用类型的构造函数(在大多数情况下)。

您的一个编译器实现了原始 C++ 规则,另一个实现了较新的规则。

按照原来的规则,Y::Y();只是桃子。你正在构建一个类型。该类型具有可访问的构造函数,因此没有问题。

按照较新的规则,Y::Y();是一个错误。您正在调用构造函数,并且不允许显式调用构造函数。

对于那些感兴趣的人,这是核心语言问题 147。

于 2013-08-30T13:34:51.753 回答
0

Y::Y();在 C++ 中是错误的。即使 Dev C++ 也不应该允许它。

如果你的意思是调用类的构造函数,Y你只需要创建一个类型的对象Y,例如

Y my; //creates an object named my of type Y
Y my = Y(); //same as above
Y(); // creates a temporary object which is destroyed in the following line
于 2013-08-30T13:01:23.873 回答
0
If i replace statement 1 and 2 withh Y(); , the program produces the output in all 3. Why so?

输出是通过调用函数产生的Y::Y()。您可以在类 X 的实例的构造函数中执行此操作,也可以通过直接调用该函数来执行此操作。

但是让我们看一下变体“语句 1”。编码

int main ()
{
    X a;
}

创建一个未使用的变量。编译器可能会将其优化掉。在这种情况下,不会调用构造函数。这取决于编译器和使用的实际选项。当你直接调用函数 Y::Y() 时,它不能被优化掉,你总是得到输出。

于 2013-08-30T13:05:54.873 回答