首页 > 编程语言 > 详细

C++中的构造函数

时间:2021-06-14 17:35:05      阅读:17      评论:0      收藏:0      [点我收藏+]

1.构造函数

1.1.概念:构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。
1.2.特性:
构造函数是特殊的成员函数,需要注意的是,构造函数的虽然名称叫构造,但是需要注意的是构造函数的主 要任务并不是开空间创建对象,而是初始化对象。
构造函数:是一个特殊的成员函数;
1.名字必须和类名相同
2.没有返回值类型,注意:返回值类型位置什么都不写
3.编译器自动调用
4.在整个对象的声明周期内只调用一次
5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定 义编译器将不再生成。
6. 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。
2.3.调用场景:
关于编译器生成的默认成员函数,很多童鞋会有疑惑:在我们不实现构造函数的情况下,编译器会生成 默认的构造函数。但是看起来默认构造函数又没什么用?
class Time
{
public:
 Time()
 {
 cout << "Time()" << endl;
_hour = 0;
 _minute = 0;
 _second = 0;
 }
private:
 int _hour;
 int _minute;
 int _second;
};

class Date
{
private:
 // 基本类型(内置类型)
 int _year;
 int _month;
 int _day;
 // 自定义类型
 Time _t;
};
int main()
{
 Date d;
 return 0;
}
当我们给d对象初始化时,会调用d的默认构造函数,初始化_year,_month,_day,虽然_t时d的成员变量,但又是类对象,对于自定义类型_t,编译器会调用它自身的默认构造函数。

再谈构造函数

1.

class Date
{
public:
 Date(int year, int month, int day)
 {
 _year = year;
 _month = month;
 _day = day;
 }

private:
 int _year;
 int _month;
 int _day;
};
虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称作为类对象成员的初始化,构造 函数体中的语句只能将其称作为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内 可以多次赋值。
这里要用到初始化列表进行初始化:(初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。)
注意:
类中包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员(该类没有默认构造函数)
上面前两个比较容易理解,这里来讲一个第三个;
比如:
 Date(int year, int month, int day) //普通构造函数      
 {
 _year = year;
 _month = month;
 _day = day;
 }
 Date()  //默认构造函数
 {
 _year = 1;
 _month =6;
 _day = 0;
 }
///////////////////////////////////////////////////////////////////
class Time
{
private:
 // 基本类型(内置类型)
 int _year;
 int _month;
 int _day;
 // 自定义类型
 Date _t;
};
对于time对象初始化时调用构造函数,而对于自定义类型_t类对象,它也要调用构造函数,而且是默认的构造函数,给出的普通的构造函数不行,因为,给出的普通类型构造函数要在对象初始化时传参,所以初始化时编译器根本不知道传什么参数,所以对于第三条一定要在初始化列表中初始化。
?
2.成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关
3.构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用。
比如:
class Date
{

public:

	//单参类型的构造函数
	Date(int year)
		: _year(year)
	{
			cout << this << "Date(int)" << endl;
	}
	Date& operator=(const Date& d)
	{
		cout << this<<"=" << &d << endl;
		if (this != &d)
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}
		return *this;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1(2021);

	d1 = 2022;
	return 0;
}
为什么2022能赋值给d1这个对象,其实编译器在内部借助单参的构造函数创建了匿名对象,然后使用匿名对象给d1赋值,第三步销毁匿名对象,所以单参的构造函数具有类型转换的作用。
但是这种代码的可读性差,为了避免这种单参发生类型转换,用explicit修饰构造函数,将会禁止单参构造函数的隐式转换。

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

C++中的构造函数

原文:https://blog.51cto.com/u_15152976/2901747

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!