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
相关产品推荐
相关产品推荐

