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的内部类
内部类是一个独立的类,不属于外部类,内部类是外部类的友元类,可以看外部类的咪咪(所有成员),但是外部类不是内部类的友元类,真是个聪明的臭弟弟.
就不举例了