首页 > 解决方案 > 代码在终端显示“::”,原因未知

问题描述

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 是从 "A* p" 的第一个FUNCTION调用的,但是为什么会出现 "::" ?“::”之后的最后一个A来自“A a();”?

标签: c++algorithmfunction

解决方案


类型的构造函数与类型本身具有相同的名称。 ::范围解析运算符,用于命名包含在命名范围内的事物,例如命名空间或类型。

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

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

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();

这是一个令人头疼的解析(不要与最令人头疼的解析混淆)。显然您打算声明一个变量,但这可以是函数变量声明,并且语法更喜欢函数声明。

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

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

推荐阅读