C++ 为什么我的默认构造函数返回bool?
可能重复:C++ 为什么我的默认构造函数返回bool?,c++,constructor,boolean,C++,Constructor,Boolean,可能重复: 当我运行这个程序时,我得到了编译器警告:34[warning]rationaltest4()的地址将始终计算为true。但是我试图使它成为默认构造函数是有理数0/1。第34行是int main()行:cout程序打印“1”的原因是因为rationaltest4()声明函数指针。那么std::cout如何打印函数指针呢?它涉及自动转换。首先看看普通的旧数据指针。I/O机器没有打印double*指针或MyClass*指针的机制,也没有打印可能出现的无数个指针的机制。I/O机器所能做的是
当我运行这个程序时,我得到了编译器警告:34[warning]rationaltest4()的地址将始终计算为true。但是我试图使它成为默认构造函数是有理数0/1。第34行是int main()行:cout程序打印“1”的原因是因为
rationaltest4()代码>声明函数指针。那么std::cout
如何打印函数指针呢?它涉及自动转换。首先看看普通的旧数据指针。I/O机器没有打印double*
指针或MyClass*
指针的机制,也没有打印可能出现的无数个指针的机制。I/O机器所能做的是打印void*
指针的机制。由于隐式转换,同样的机制适用于double*
和MyClass*
指针,因为所有指针都转换为void*
指针
函数指针不会转换为void*
。函数指针不是指针!唯一可用的转换是转换为布尔值。转换成布尔值就是让我们做的事情,比如if(函数指针)do_something()
您的函数指针不是空的,因此当转换到bool
时,它将变成true
,打印为1
解决方案很简单:更改rationaltest4()代码>到Rational
test4;` 程序打印“1”的原因是因为rationaltest4()代码>声明函数指针。那么std::cout
如何打印函数指针呢?它涉及自动转换。首先看看普通的旧数据指针。I/O机器没有打印double*
指针或MyClass*
指针的机制,也没有打印可能出现的无数个指针的机制。I/O机器所能做的是打印void*
指针的机制。由于隐式转换,同样的机制适用于double*
和MyClass*
指针,因为所有指针都转换为void*
指针
函数指针不会转换为void*
。函数指针不是指针!唯一可用的转换是转换为布尔值。转换成布尔值就是让我们做的事情,比如if(函数指针)do_something()
您的函数指针不是空的,因此当转换到bool
时,它将变成true
,打印为1
解决方案很简单:更改rationaltest4()代码>到Rational
test4;` rationaltest4()代码>声明一个函数,而不是一个对象。这是“最麻烦的解析”。另外,你的标题似乎与你的问题无关。这么简单的错误,谢谢!当我运行程序时,它将返回1。所以我认为1意味着它是真的。这就是标题的原因。“最麻烦的解析”是什么意思?我认为这只是一个普通的麻烦解析。最令人烦恼的是S(S())代码>左右。RationalTest4()代码>声明一个函数,而不是一个对象。这是“最麻烦的解析”。另外,你的标题似乎与你的问题无关。这么简单的错误,谢谢!当我运行程序时,它将返回1。所以我认为1意味着它是真的。这就是标题的原因。“最麻烦的解析”是什么意思?我认为这只是一个普通的麻烦解析。最令人烦恼的是S(S())“函数指针不是指针”似乎有点太强了……它们不应该被视为指向数据的指针,这可能就是你的意思。@GManNickG-标准谈到了指针和函数指针。它们是(或者曾经是;C++11在某种程度上解决了这个问题)不相容的。C++98/03非常清楚:函数指针不是指针。有时一个限定词会把一个词变成另一个词。多值函数不是函数,超流形不是流形,笛卡尔张量不一定是张量,而红鲱鱼通常既不是红鲱鱼也不是鲱鱼。“函数指针不是指针”似乎有点太强了……它们不应该被视为指向数据的指针,这可能就是你的意思。@GManNickG-标准谈到了指针和函数指针。它们是(或者曾经是;C++11在某种程度上解决了这个问题)不相容的。C++98/03非常清楚:函数指针不是指针。有时一个限定词会把一个词变成另一个词。多值函数不是函数,超流形不是流形,笛卡尔张量不一定是张量,而红鲱鱼通常既不是红鲱鱼也不是鲱鱼。
#include <iostream>
using namespace std;
class Rational
{
public:
Rational();
friend ostream& operator <<(ostream& out,Rational rational1);
private:
int numerator;
int denominator;
};
int main()
{
//Rational test1(24,6), test2(24);
Rational test4();
//cout << test1<< endl;
//cout << test2<< endl;
cout << test4;
system("pause");
}
Rational::Rational() : numerator(0), denominator(1)
{
//empty body
}
ostream& operator <<(ostream& out,Rational rational1)
{
out << rational1.numerator <<"/"<<rational1.denominator;
return out;
}