代码显示"::"终端,原因未知


using namespace std;
struct A
{
int i;
A(int i_ = 13) : i(i_)
{
cout << _FUNCTION_ << "n";
}
~A()
{
cout << _FUNCTION_ << "n";
}
};
int main()
{
A* p = new A;
A a();
return 0;
}

当我运行它时,代码显示在我的终端上;A: :A";。我得到第一个A是从第一个FUNCTION调用的;A*p",但是为什么":"显得以及":"来自";A(("?

类型的构造函数与类型本身具有相同的名称。::作用域解析运算符,用于命名命名作用域中包含的内容,例如名称空间或类型。

因此,A的构造函数是A::A。第一个A是类型的名称,第二个是构造函数的名称;CCD_ 5用于指示构造函数是在类型的范围内声明的。

这反映了在没有定义的声明之后定义类型成员的方式。例如:

struct A
{
int i;
A(int i_ = 13);
~A();
};
// Note how we have to refer to the constructor to define it since we are
// no longer within the scope of A:
A::A(int i_) : i(i_)
{
cout << _FUNCTION_ << "n";
}
// Similar for the destructor.
A::~A()
{
cout << _FUNCTION_ << "n";
}

您应该只在输出中看到A::A。请注意,您只能在此处创建一个A值:

A* p = new A;

您从来没有delete p;,因此在输出中看不到匹配的析构函数调用(A::~A(。

此行不创建类型为A的变量;相反,它声明了一个名为a的函数,该函数不接受任何参数,并返回一个A值。此函数从未调用(也未定义(:

A a();

这是一个棘手的解析(不要与最棘手的解析混淆(。很明显,您打算声明一个变量,但这可能是函数变量声明,语法更喜欢函数声明。

要解决此问题,请删除parens或使用C++11的统一初始化语法:

A a;     // Default initialization
A a{};   // Uniform initialization

_FUNCTION_是一个神奇的常数,因此它发布了第一个"A";(调用的函数的名称。不过无法帮助完成其余部分。

最新更新