我有一个简单的程序,如下所示
#include<iostream>
using namespace std;
class A
{
public:
A()
{
int a();
cout<<"\n value of A is:- "<<a<<"\n\n";
}
};
int main()
{
A obj;
return 0;
}
上面的程序输出一个,虽然我没有将任何值传递给变量a
。是否有一些任务构造函数正在执行或者调用了一些其他类型的默认构造函数,如果我使用任何变量keep()。
同样的情况也发生在float数据类型中。
看起来很简单,但我想了解这背后的概念。有人可以帮帮我吗?
答案 0 :(得分:4)
int a()
声明一个名为a
的函数,不带任何参数并返回int
。当您尝试输出函数时,它会转换为函数指针,而函数指针又转换为bool
。函数的地址始终为非null,因此它将转换为true
,打印为1。
但是请注意,您违反了一个定义规则:如果函数缺少定义,则不允许您获取函数的地址。但是,编译器不需要诊断违反ODR的情况。在这种特殊情况下,编译器决定它并不关心实际地址,因为它知道无论如何它都将是非空的。
如果您要声明int
并对其进行值初始化,则正确的语法为
int a{};
答案 1 :(得分:1)
根据Most vexing parse,int a();
是函数声明,它不接受任何参数并返回int
。当你输出它时会衰减到非空的函数指针,然后转换为bool
true
,因此结果为1
。
如果您只想申报,可以
int a;
如果你想声明并初始化它,你可以
int a = 1; // initialized with the specified value
int a{2}; // initialized with the specified value, since C++11
int a{}; // initialized with 0, since C++11
答案 2 :(得分:1)
您似乎认为int a();
声明了一个变量。这是不正确的。您正在声明一个名为a
的函数,其中没有返回int
的参数。
您可能想要的是int a;
。
此外,你必须在读取之前初始化一个变量(比如在你的输出语句中),否则程序将包含未定义的行为并且没有任何意义,编译器可以自由生成它喜欢的任何代码。不是你想要的情况,所以真正想要的是int a = 0;
。
至于为何输出1
; a
正在转换为bool
(true
),其打印为1
。