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";(调用的函数的名称。不过无法帮助完成其余部分。