【问题标题】:unexpected behavior of overloaded operator "<<" c++重载运算符“<<”c ++的意外行为
【发布时间】:2021-03-14 15:47:28
【问题描述】:

我写了一个简单的程序来演示c++中重载运算符https://docs.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 dt{}
  • @Giogre 在第二个例子中有一个默认构造函数的定义,但是Date dt(); 没有调用默认构造函数
  • @Sao_Si 很抱歉,但 Giogres 评论中的解释是完全错误的

标签: c++ constructor operator-overloading


【解决方案1】:

尝试以下:

    int main()
    {
        Date dt;
        std::cout << dt;
    }

您使用的是哪个编译器? Microsoft C++ 编译器在没有 arg 的情况下报告与您的主函数的链接错误,即Date dt();

error LNK2001: unresolved external symbol "class Date __cdecl dt(void)" (?dt@@YA?AVDate@@XZ)

【讨论】:

  • 谢谢,终于成功了。我正在为 linux 使用 gcc。再次感谢
  • 好,如果有效,请接受答案。
  • @mkag 为什么不解释为什么Date dt(); 不正确?答案应附有对问题原因的解释。
猜你喜欢
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 2023-03-09
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 2016-08-10
相关资源
最近更新 更多