C++面向对象#构造函数#

本文介绍了C++中的构造函数,包括默认构造函数的使用,如何通过重载构造函数满足不同初始化需求,以及初始化列表的重要性和应用场景。特别强调了初始化列表在处理常量成员、引用成员和无默认构造函数类成员时的必要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

构造函数

重载构造函数

初始化列表


 

构造函数

一般的构造函数都会有参数来初始化成员,而默认构造函数是没有参数的构造函数,在创建对象的时候如果对象名后面不加括号,那么系统就会调用默认构造函数,

//面向对象2
//作者:分解机226

#include <iostream>
using namespace std;

class BOLI
{
public:
	BOLI()
	{
		xin = 5;
		li = 20;
		mian = 1;
		shi = 314;
	}
	int xin;
	int li;
	int mian;
	int shi;
};
int main()
{
	BOLI boli;
	cout << "想法是:" << boli.xin << boli.li << boli.mian << boli.shi << endl;
	return 0;
}

我们可以看到BOLI类的构造函数没有参数,所以他就是一个默认构造函数,我们在主函数中声明变量boli的时候没有加参数列表,,就好像是声明了一个未初始化的变量那样,如果一个类没有任何的构造函数,系统就会自动生成一个默认函数,但是有些编译器声明不带参数却没有默认构造函数的对象有可能会报错。

重载构造函数

构造函数在重载的时候业满足一般函数的重载规则。

//面向对象2
//作者:分解机226

#include <iostream>
using namespace std;

class BOLI
{
public:
	BOLI(int a,int b)
	{
		area = a * b;
	}
	BOLI(int a)
	{
		area = a*a;
	}
	int getBOLI()
	{
		return area;
	}
private:
	int area;
};
int main()
{
	int a = 56;
	int b = 456;
	int c = 45;
	BOLI area1(a, b);
	BOLI area2(c);
	cout << "a*b=" << area1.getBOLI() << endl;
	cout << "c*c=" << area2.getBOLI() << endl;
}

 上面的一段代码展示了和一般的函数重载原理相同构造函数的重载,由于实参的个数不同,编译器很容易就找到了相应版本的函数。

初始化列表

前面我们展示了一个构造函数的实例,类成员的初始化都在函数体中用赋值进行,我们也可以使用初始化列表来初始化

//面向对象2
//作者:分解机226

#include <iostream>
using namespace std;

class TIME
{
public:
	TIME(int hr, int min ,int sec) :hour(hr), minute(min), second(sec)
	{

	}
	int gethour()
	{
		return hour;
	}
	int getminute()
	{
		return minute;
	}
	int getsecond()
	{
		return second;
	}
private:
	int hour;
	int minute;
	int second;
};

int main()
{
	TIME time(12, 18, 58);
	cout << "时间是" << time.gethour() << "时"
		<< time.getminute() << "分" <<
		time.getsecond() << "秒" << endl;
	return 0;
}

 上面一段代码展示了初始化列表的使用,初始化列表在参数和函数体之间,以一个冒号开始,用逗号隔开几个类似调用构造函数的初始化表达式,初始化列表看似与函数体中赋值的形式等价,但是不是这样的,

	//面向对象2
	//作者:分解机226

	#include <iostream>
	using namespace std;

	class B
	{
	public:
		B()
		{
			cout << "B构造函数被调用" << endl;
			num = 0;
		}
	private:
		int num;
	};
	class A
	{
	public:
		A(B bb)
		{
			cout << "A的构造函数被调用" << endl;
			num = 0;
			b = bb;
		}
	private:
		int num;
		B b;
	};

	int main()
	{
		B b;
		cout << "创建A的对象前" << endl;
		A a(b);
		return 0;
	}

 上面的代码中,由于A中包含了一个B的对象,在进入A构造函数的函数体之前,虽然并没有初始化列表,但是系统还是会自动调用B的默认构造函数,因此运行结果才会打印“创建A的对象前”,

有些情况必须使用初始化列表  常量成员、引用成员、和没有默认构造函数的类成员,

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

分解机226

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

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

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

打赏作者

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

抵扣说明:

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

余额充值