我在学加法运算符重载,我在类person里建了一个返回类型为类person的运算符重载的函数,在这个函数里我建了个对象temp;
我想实现 :对象p1+对象p2
但是报错了,错误为:类 "person" 不存在默认构造函数
#include<iostream>
using namespace std;
class person {
public:
//需要在此加上perosn(){};
person operator+(const person& p) {
person temp;//此处报错
temp.age_a = this->age_a + p.age_a;
temp.age_b = this->age_b + p.age_b;
return temp;
}
person(int age_a, int age_b) {
this->age_a = age_a;
this->age_b = age_b;
}
public:
int age_a;
int age_b;
};
void test() {
person p1(10, 20);
person p2(20, 30);
person p3 = p1 + p2;
cout << p3.age_a << p3.age_b << endl;
}
int main() {
test();
return 0;
}
解决方法:在person类中先创建个无参的构造函数类型;
有了这个类型你才能创建这种类型的对象;
#include <iostream>
using namespace std;
class person {
public:
perosn(){};
person operator+(person& p) {
person temp;
temp.m_a = p.m_a + this->m_a;
temp.m_b = p.m_b + this->m_b;
return temp;
}
int m_a;
int m_b;
};
void test() {
person p1;
p1.m_a = 10;
p1.m_b = 20;
person p2;
p2.m_a = 10;
p2.m_b = 20;
person p3 = p1 + p2;
cout << p3.m_a << p3.m_b << endl;
}
int main() {
test();
return 0;
}
后来我发现,下面代码,没有为了temp而写无参构造函数啊,这也是可以的,为什么?
原来是:图一无参构造函数没写,只写了有参构造函数,系统也不给你无参构造函数了,所以temp居无定所。
2021.4.18:
或者写个有默认参数值的构造函数,这时可以不写出默认的构造函数了;
2021.8.8:
也可以使用"=default"来解决这个问题:
如果程序中已定义构造函数,默认情况下,编译器就不再隐含生成默认构造函数。如果此时依然希望编译器隐含生成默认构造函数,可以使用"=default"。
class person {
public:
perosn() = default;
person operator+(person& p) {
person temp;
temp.m_a = p.m_a + this->m_a;
temp.m_b = p.m_b + this->m_b;
return temp;
}
int m_a;
int m_b;
};