【问题标题】:Can't cout from within overloaded function无法从重载函数中计算出来
【发布时间】:2017-07-09 02:59:35
【问题描述】:

我正在研究重载的运算符。

由于某种原因,我没有从我的重载函数中获得 cout 输出。

class MyString {

    public:
        MyString(const char aString[20]){
            // copy the input string to "data"
            for(int i = 0; i < 20; i++){
                data[i] = aString[i];
            }
        }

    public:

        MyString operator=(const MyString copyFrom){
            MyString copyTo("");

            cout << "hi";

            for(int i = 0; i < 20; i++){
                copyTo.data[i] = copyFrom.data[i];
            }

            return copyTo;
        }

    public:
        char data[20]; // a pointer to memory
};


int main() {
    MyString a("hello");

    MyString b = a;

    cout << b.data << endl;

    return 0;
}

当我运行我的代码时,我得到以下结果:

C:\MinGW\bin>g++ stringoverloading3.cpp

C:\MinGW\bin>a.exe 你好

C:\MinGW\bin>

重载是否会杀死 cout?

【问题讨论】:

  • 当然,除非我的超载实际上没有被调用......嗯
  • 这个MyString b = a; 不是一个赋值(它是一个初始化),所以不会调用赋值运算符。你的 C++ 教科书应该解释这一点。
  • btw 数组和指针与代码中的注释建议的不一样
  • 并且赋值运算符应该将参数作为const的引用。
  • 您的赋值运算符(实际上并未调用)不会更改已分配的实例。并且您的构造函数会读取其输入缓冲区的末尾,这是未定义的行为。

标签: c++ operator-overloading cout


【解决方案1】:

线

MyString b = a;

不是作业。是初始化。调用复制构造函数来初始化对象。要调用赋值运算符,请使用:

MyString b;
b = a;

为了能够使用它,必须首先实现默认构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 2017-09-27
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    相关资源
    最近更新 更多