解决“不存在默认构造函数”的问题

我在学加法运算符重载,我在类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;
};

  • 37
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: C++不存在默认构造函数是指在定义一个C++时,如果没有显式地声明或定义默认构造函数,那么编译器就不会为该生成默认构造函数默认构造函数是一个没有任何参数的构造函数,它负责在创建对象时,给对象的成员变量初始化。当我们没有定义任何构造函数时,编译器会默认生成一个默认构造函数。但是,如果我们在中显式定义了任何其他构造函数,编译器就不会再生成默认构造函数了。 当一个没有默认构造函数时,我们在创建对象时必须显式地调用有参构造函数来进行对象的初始化。如果我们没有定义有参构造函数,那么编译器会报错,因为它无法自动创建默认构造函数。 为什么C++不存在默认构造函数呢?这是因为C++允许我们在定义时通过构造函数对对象进行初始化,这样可以确保对象的合法性和一致性。但是,如果自动生成默认构造函数,那么对象就会使用默认值进行初始化,可能会导致对象的成员变量处于一个不合理的状态,进而引发错误。 为了避免这种错误,C++规定没有显式定义或声明默认构造函数,是无法使用默认构造函数的。因此,我们必须显式地定义或声明一个有参构造函数来对对象进行初始化。这样可以保证对象始终处于一个合理的状态,提高程序的稳定性和安全性。 ### 回答2: C++如果没有显式声明构造函数,编译器会为其生成一个默认构造函数。然而,如果中有一些特殊的成员、基或者虚函数,编译器就无法生成默认构造函数。 当中存在有以下情况时,编译器无法生成默认构造函数: 1. 的成员或基没有默认构造函数:如果的成员或者基没有默认构造函数,编译器无法通过自动生成的默认构造函数来初始化这些成员或者基,因此无法生成默认构造函数。 2. 定义了带参数的构造函数:如果中定义了任何构造函数(不论是默认参数构造函数还是重载的构造函数),编译器会认为你提供的构造函数相对于默认构造函数更为重要,所以不会再为生成默认构造函数。 3. 定义了虚函数:当中定义了虚函数时,编译器无法自动生成默认构造函数,因为默认构造函数无法初始化虚函数的相关信息(例如虚函数表)。 为了解决没有默认构造函数问题,可以手动为编写一个构造函数来完成初始化工作,或者使用初始化列表来初始化的成员或基。总之,在需要使用默认构造函数的地方,我们需要手动为提供一个默认构造函数,而不是依赖于编译器的默认构造函数。 ### 回答3: C++中,不存在默认构造函数的意思是,在定义一个时,如果没有显式地定义构造函数,那么编译器不会自动生成默认的构造函数。 构造函数是用来初始化对象的特殊成员函数,它会在对象创建时自动调用。当我们没有为定义任何构造函数时,编译器会自动生成一个默认构造函数。 然而,当我们显式地定义了一个或多个构造函数时,编译器就不会再自动生成默认构造函数了。这就是所谓的“不存在默认构造函数”。 如果我们需要创建一个没有默认构造函数的对象,我们就必须显式地定义自己的构造函数,以确保对象可以被正确地初始化。否则,在实例化该对象时将会产生编译错误。 值得注意的是,当定义了至少一个自定义构造函数后,如果我们还想要使用默认构造函数,则需要手动显式地定义一个默认构造函数。 例如,下面是一个没有默认构造函数例子: ```cpp class MyClass { public: MyClass(int value) { // 构造函数的实现 } }; ``` 在这个例子中,我们定义了一个名为MyClass的,它只有一个带有一个整型参数的构造函数。因此,如果我们在没有提供参数的情况下实例化MyClass的对象,将会出现编译错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FeatherWaves

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值