目录
如果不想发生类型的转换,我们可以用explicit的函数卸载构造的前面
如果想在类的外面去访问类里面的成员变量和成员函数可以在类的前面加上friend
friend ostream& operator<<(ostream& out, const Data& d);
friend istream& operator>>(istream& in, Data& d);
初始化列表:
以一个冒号开始,接着是一个以逗号分隔的数据的成员列表,,每一个成员变量后面有一个括号,括号里面有一个初始值或者表达式,这里面甚至可以有malloc,因为是可以是一个表达式
Data(int year, int month, int day)
:_year(year)
, _month(month)
, _day(day)
, _n(1)
{
}
注意:
1.每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次),后面就没有机会了
2.类中的2以下成员必须放在初始化列表去初始化:
first:引用成员变量
second:const成员变量
third:当自定义成员变量没有默认构造的时候
当然我们要尽量使用初始化列表去初始化,因为自定义类型的成员变量会优先去使用初始化列表去初始化
class Time
{
public:
Time(int hour = 1 )
:_hour(hour)
//a是啥东西
{
cout << "Time()" << endl;
}
private:
int _hour;
};
这里面的hour如果不去初始化,没有默认构造就跑不过,那么这里面我们就传一个1,这是一个自定义类型,加上了就可以跑过了
声明顺序和初始化顺序:
成员标量的声明次序就是在初始化列表中的初始化顺序,与其在列表中的先后顺序无关
这个是一个伪代码
class A
{
public:
A(int a)
:_a1(a)
,_a2(a1)//也就是说我们会先去初始化这个
{}
private:
int _a2;//我们是按照这个顺序去初始化,也就是说我们会先去初始化a2
int _a1(_a1);
};
三个易错点:
1.没有合适的默认构造函数可用
2.必须初始化引用
3.必须初始化常量限定的对象=
当然函数体和初始化列表可以混着使用
着里面提醒一下定义就是开空间,在private里面是有值还是声明,这里面c++11打了一个补丁,如果在初始化列表没有写的时候就用缺省值,这外立面弥补了内置类型忘记了初始化的缺陷】出++可以将初始化放在private里面
底下的是函数体
类型的转换:
A aa2 = 2;
这是隐式类型转换,当然不是任何类型都支持
隐式类型转换
我们先去用2构造一个临时变量,再去拷贝构造aa2
int i = 1;
double d = i;
当然不是任何类型都支持,在类型转化的时候中间量会有常属性,所以说在传的对象或者参数面要加const
int i = 1;
double d = i;
const double& rd = i;
权限的放大与缩小
很多情况下会有权限的放大与缩小,但是只会在指针和引用中出现
多参数的玩法:
A aa5 = 1, 2;
这样是不可以的
SLPush({2,3,4});
但是你这样就可以了
单参数可以相当于你内置类型的转换为自定义类型
多参数的话我们可以去传一个{},在里面写