You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ OOP中重载>>运算符后对象输出仍显示默认值的问题排查求助

解决你的C++ OOP输出默认值问题

嘿,我一眼就瞅出问题的核心了——你重载的operator>>和operator<<运算符,参数用的是值传递而非引用传递!这就导致你输入时修改的只是原对象的副本,原对象o1根本没被更新,所以输出时自然还是默认构造函数初始化的值。

问题根源详解

当你写istream& operator>>(istream &is, vdv obj)时,这里的obj是原对象的一个拷贝。你在函数里给obj.name、obj.age等赋值,都是在修改这个临时副本的数据,函数执行完副本就销毁了,原对象o1的属性完全没变化。同理,operator<<用值传递也会额外拷贝对象,既低效又没必要。

修复方案

1. 修改输入输出运算符的参数为引用

把operator>>的第二个参数改成非const引用(因为要修改对象),operator<<的第二个参数改成const引用(因为输出不会修改对象,这样更安全还能避免拷贝):

// 修改后的输入运算符
#include <limits> // 需要包含这个头文件来使用numeric_limits

istream &operator>>(istream &is, vdv& obj) {
    cout << "Nhap ho va ten: ";
    // 替换fflush(stdin),C++中fflush(stdin)是未定义行为
    is.ignore(numeric_limits<streamsize>::max(), '\n');
    getline(is, obj.name);
    
    cout << "Nhap mon thi dau: ";
    getline(is, obj.sport);
    
    cout << "Nhap tuoi: ";
    is >> obj.age;
    
    cout << "Nhap chieu cao: ";
    is >> obj.height;
    
    cout << "Nhap can nang: ";
    is >> obj.weight;
    
    // 清除输入后残留的换行符,避免后续getline读取空行
    is.ignore(numeric_limits<streamsize>::max(), '\n');
    return is;
}

// 修改后的输出运算符
ostream &operator<< (ostream & os, const vdv& u) {
    os << "Ho va ten: " << u.name << endl;
    os << "Mon thi dau: " << u.sport << endl;
    os << "Tuoi: " << u.age << endl;
    os << "Chieu cao: " << u.height << endl;
    os << "Can nang: " << u.weight << endl;
    return os;
}

2. 顺便修复几个小问题

  • 去掉fflush(stdin):C++标准里fflush只对输出流有效,用在stdin上是未定义行为,改用cin.ignore()清除缓冲区里的换行符更安全。
  • 简化析构函数:你的析构函数里给成员变量赋值的操作完全没必要,对象销毁时这些成员会自动被释放,析构函数可以写成空的:
    ~vdv() {}
    
  • 优化冒泡排序:你当前的冒泡排序循环条件有问题,内层循环应该从0开始,并且只遍历到n-i-1,避免重复比较和越界:
    void bubblesort(vdv *a, int n) {
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - i - 1; j++) {
                if (a[j] > a[j+1]) {
                    swap(a[j], a[j+1]);
                }
            }
        }
    }
    

验证修复效果

修改后再运行你的main函数:

int main() {
    vdv o1;
    cin >> o1;
    cout << o1;
    system("pause");
}

输入的属性就会正确赋值给o1,输出时也会显示你输入的内容了!

内容的提问来源于stack exchange,提问作者KhimCho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:49:43