1.初始化列表
1.来源
c++类中的构造函数,可以在实例化对象时初始化对象的成员变量的值,实际上它的初始化过程是在对象定义出来后,再进行的赋值。就类似于这样
int i;
i = 1;
而初始化列表是这样的效果
int i = 1;
显然初始化列表才能真正意义上称之为初始化。
2.概念
以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。
class Date
{
public:
Date(int year, int month, int day)
//初始化列表
:_year(year)
,_month(month)
,_day(day)
{}
private:
int _year;
int _month;
int _day;
};
3.为什么要有初始化列表
c++中有些变量在定义是必须要初始化:
1.引用型
2.const修饰的
这些成员变量必须使用初始化列表。
不带默认构造函数自定义类型最好使用初始化列表。
2.explicit作用
禁止单参数的构造函数隐式转换.
3.static关键字
1.static修饰成员变量
用static修饰的成员变量,该变量定义在静态区,为所有类对象共享。但需要在类外定义和初始化。
访问该变量时需要用类名+域作用限定符来访问或对象+.来访问
Date::_a;
或
Date d1(2000, 1, 1, 0, 0, 0);
d1._a;
2.static修饰成员函数
静态成员函数没有隐含的this指针,不能访问类的非静态成员。
4.友元
可以在类一中声明类二或另一个函数为友元。作用:该类二和函数可以访问类一的私有成员。
class B
{
public:
B()
{
}
private:
int _b;
}
int GetA(const Date& d)
{
return d._a;
}
class A
{
friend int GetA(const Date& d); //声明为友元函数。
friend class
public:
A()
{
}
private:
int _a;
}
5.内部类
类B声明在类A的内部。此时B是A的友元,B可以访问A的任意成员。但是A不是B的友元。
class A
{
public:
A()
{
}
class B
{
public:
B()
{
A a;
cout << a._a << endl;
}
};
private:
int _a;
};
特性:
- 内部类可以定义在外部类的public、protected、private都是可以的。
- 注意内部类可以直接访问外部类中的static、枚举成员,不需要外部类的对象/类名。
- sizeof(外部类)=外部类,和内部类没有任何关系。