1

可能重复:
使用空括号调用默认构造函数时出错

当我运行它时,我得到编译器警告:34 [警告]`Rational test4()的地址,将始终评估为真。但我试图让它默认构造函数是有理数 0/1。第 34 行是 int main() 行:cout << test4;。

#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;
}
4

1 回答 1

1

您的程序打印“1”的原因是因为Rational test4();声明了一个函数指针。那么如何std::cout打印函数指针呢?它涉及自动转换。首先查看普通的旧数据指针。I/O 机器没有打印double*指针、MyClass*指针或任何可能出现的无数指针的机制。I/O 机器可以做的是打印void*指针的机制。由于隐式转换,相同的机制适用于double*MyClass*指针,因为所有指针都转换为void*指针。

函数指针不会转换为void*. 函数指针不是指针!唯一可用的转换是布尔值。转换为布尔值是让您执行诸如if (function_pointer) do_something();您的函数指针不为空之类的操作,因此转换为布尔值后,bool它会true打印为1.

解决方案很简单:将其更改Rational test4();Rationaltest4;`,

于 2012-10-09T00:39:33.480 回答