我编写了一个简单的程序,用于展示在 c++ 中重载运算符 << 的使用。根据这篇文章:https://learn.microsoft.com/en-us/cpp/standard-library/overloading-the-output-operator-for-your-own-classes?view=msvc-160,我尝试编写了自己的代码:
#include <iostream>
#include <string>
class Date
{
private:
std::string str;
public:
Date(int x) : str(5, 'x'){}
friend std::ostream& operator<<(std::ostream& os, const Date& dt){
os << dt.str;
return os;
}
};
int main()
{
Date dt(6);
std::cout << dt;
}
这段代码正确运行并在控制台中打印了 "xxxxx"。但是当我删除构造函数的参数时,问题出现了:
#include <iostream>
#include <string>
class Date
{
private:
std::string str;
public:
Date() : str(5, 'x'){}
friend std::ostream& operator<<(std::ostream& os, const Date& dt){
os << dt.str;
return os;
}
};
int main()
{
Date dt();
std::cout << dt;
}
我在控制台上看到了“1”这个输出,但我不知道为什么会有这个结果。
Date dt();
是一个名为dt
的函数,不带参数并返回类型为Date
。可以使用以下任何一种方式创建默认构造的Date
:Date dt;
、Date dt{};
或者auto dt = Date();
。请注意,这些替代方式都将创建一个默认构造的Date
对象。 - François AndrieuxDate()
,而你并没有定义它,所以编译器会将其合成为创建一个空的Date
对象。而在第一个例子中,无论你在main()
中创建的dt
对象传入什么参数,输出都将是xxxxx
。 - GiogreDate dt();
没有调用默认构造函数。 - 463035818_is_not_a_number