对于初始化列表的一些理解,以及一些小的知识点

class Date
 {
 public:
 	Date(int year, int month, int day)
 		: _year(year)
		, _month(month)
		, _day(day)
 		, _a(year)
		, _c(year)
 	{
		//函数体中是赋值,赋值可以赋值多次
 		_year = year;
	_month = month;
		_day = day;
		//_a = year; 不是初始化是赋值
 	}

 private:
 	int _year;
 	int _month;
	int _day;
 	int& _a;
 	const int _c;

初始化列表初始化类中成员变量.赋值可以多次,但是初始化只能有一次

并且,类中的成员变量在初始化列表的位置只能出现一次

如果用户没有显式给出,那么编译器会自动完成初始化列表的工作,成员变量被初始化为随机值
成员变量在构造函数中时,时按照成员变量在类中的声明顺序来初始化的,所以成员变量最好按照其在类中声明的顺序来初始化

有三种类型的成员变量是必须在初始化列表初始化的
1.引用成员变量
2.const成员变量
3.类类型成员变量,并且类类型成员变量没有默认的构造函数

explicit
单参的构造函数有类型转换的作用,explicit可以限制单参构造函数进行类型转化
来个类

class Date
{
public:
	 Date(int year)
	 :_year(year)
	 {}
private:
	 int _year;
	 int _month:
	 int _day;
};

在主函数中

void TestDate()
{
 Date d1(2018);
 d1 = 2019;
}

因为是单参函数,在用2019给对象d1赋值时,编译器会使用Data的构造函数把2019转换为无名日期类型对象,然后使用无名对象给d1赋值,为了不隐式转化,可以加explicit

class Date
{
public:
	explicit Date(int year)
	 :_year(year)
	 {}
private:
	 int _year;
	 int _month:
	 int _day;
};

友元
友元有 友元函数和友元类
友元函数是定义在类外部的普通函数,在类内声明时需要加上firend关键字,这样这个友元函数就可以访问类内的私有成员了,相当于类把他的咪咪 秘密告诉了朋友. 友元函数可以在一定程度上突破封装,提供了便利,但是破坏了安全性

友元什么时候使用呢

我学习了一种情景,类内部不能重载’<<’ ‘>>’ 这两个输入输出运算符,因为,就以’<<'举例解释, '<<'的第一个参数必须是ostream对象,在重载时,他的第一个参数就成为了隐藏的this指针,后果就导致打印的对象和常规的是相反的
这时候就要用到友元函数了

class Date
{
friend ostream& operator<<(ostream& _cout, const Date& d);

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

prvate:
	 int _year;
	 int _month;
	 int _day
};
ostream& operator<<(ostream& _cout, const Date& d)
{
 	_cout<<d._year<<"-"<<d._month<<"-"<<d._day;

	 return _cout;
}
int main()
{
 Date d;
 cout<<d<<endl;
 return 0;
}

把重载函数写在外面,在内部加上firend,就可以访问私有变量了

要注意,友元函数不是类成员函数,而且一个函数可以做多个类的友元函数.

友元类
友元类的所有成员函数都可以是另一个类的友元函数,访问非共有成员

内部类
A类定义在B类内,A类就是B的内部类
内部类是一个独立的类,不属于外部类,内部类是外部类的友元类,可以看外部类的咪咪(所有成员),但是外部类不是内部类的友元类,真是个聪明的臭弟弟.
就不举例了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值