c++ - 代码在终端显示“::”,原因未知
问题描述
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();”?
解决方案
类型的构造函数与类型本身具有相同的名称。 ::
是范围解析运算符,用于命名包含在命名范围内的事物,例如命名空间或类型。
因此的构造函数A
是A::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
推荐阅读
- flutter - 什么时候处理一个颤振小部件?
- wordpress - 在 URL WordPress 中结合两个自定义分类术语
- javascript - 使用拖动更改 div 高度
- flutter - 如何将带有字符串的抽屉传递到下一个屏幕
- python - 列具有范围值示例 1-3 、 1-5 、 1-100 ,如何将此范围转换为逗号分隔值示例 1-3 我需要 pyspark 中的 1,2,3
- sql - 在 Oracle 中加入字符串,如 SQL Server 中的 concat_ws
- reactjs - JWT cookie 令牌未定义
- gstreamer - 启用硬件加速 Nvidia Jetsons 以进行图像到视频编码
- c++ - c++ jemalloc malloc large fix size (64K, 128K) 内存占用300us以上
- javascript - 无法将 React Barcode 调整为定义的宽度和高度