C++实现+运算符重载时出现无默认构造函数及<<报错如何解决
报错原因与解决方案
问题1:找不到默认构造函数
- 原因:C++规则规定,当你手动为类定义了带参数的构造函数后,编译器不会再自动生成无参的默认构造函数。你在
operator+重载函数中写了Chicken Chicky;,这行代码需要调用无参构造函数创建对象,但你的Chicken类只有一个需要传3个int参数的构造函数,自然会报错。你参考的Complex类的构造函数设置了默认参数Complex(int r = 0, int i = 0),不传参数也可以正常调用,本质上已经兼容了默认构造的功能,所以不会报错。 - 解决方法:二选一即可:
- 给现有三参数构造函数添加默认参数:
Chicken(int index = 0, int kentucky = 0, int sign = 0) - 在
operator+中创建返回对象时,直接调用现有三参数构造函数初始化,避免调用无参构造。
- 给现有三参数构造函数添加默认参数:
问题2:<<运算符相关报错
- 原因:标准库的
cout的<<运算符默认只支持输出基础类型等内置类型,你自定义的Chicken类没有重载<<运算符,编译器不知道该怎么输出Chicken类的对象,所以会报错。你参考的Complex类没有直接用cout << 对象,而是自己实现了print()成员函数来打印内部数据,所以不会触发这个错误。 - 解决方法:二选一即可:
- 参照Complex类的写法,给Chicken类添加自定义的
print()成员函数,打印你需要输出的成员变量,后续调用W.print()输出内容 - 全局重载
<<运算符,支持cout直接输出Chicken对象。
- 参照Complex类的写法,给Chicken类添加自定义的
修改后可正常运行的完整代码示例
#include <iostream> using namespace std; class Chicken { private: int i; int k; int s; int total = 0; public: Chicken(int index, int kentucky, int sign) { i = index; k = kentucky; s = sign; } Chicken operator+(Chicken const& obj) { // 直接调用现有构造函数,不需要无参构造 Chicken Chicky(0, 0, 0); Chicky.total = this->i + obj.i; // 其他成员的计算逻辑可以自己按需补充 return Chicky; } // 自定义打印函数方案 void print() const { cout << "计算结果total = " << total << endl; } // 声明<<运算符重载为友元,允许访问私有成员 friend ostream& operator<<(ostream& os, const Chicken& obj); }; // 全局重载<<运算符方案 ostream& operator<<(ostream& os, const Chicken& obj) { os << "计算结果total = " << obj.total; return os; } int main() { Chicken P(1, 2, 3); Chicken U(2, 2, 2); Chicken W = P + U; // 两种输出方式选一种即可 W.print(); cout << W << endl; }
内容的提问来源于stack exchange,提问作者Chicken
相关产品推荐
相关产品推荐

