一.初始化列表
对于对象创建,可以通过构造函数/拷贝构造函数对成员变量赋初值,也可以通过初始化列表为初始化成员变量。
- 构造函数是给成员变量赋值,可以赋值多次。
- 初始化列表为初始化成员函数。
初始化列表:在构造函数/拷贝构造函数定义参数列表后,以:开始,用,隔开成员变量。如下例。
class date {
public:
date(int year, int mouth, int day)
:_year(year) //初始化列表
,_mouth(mouth)
,_day(day)
{}
private:
int _year;
int _mouth;
int _day;
};
注意:
- 每个成员变量只可以初始化一次。
- 以下成员变量必须在初始化列表位置进行初始化。
引用类型成员变量/const成员变量/类类型成员变量(没有默认构造函数) - this指针不可以出现在初始化列表
- 如果没有显式初始化列表,则调用默认初始化列表,成员变量为随机值。
- 初始化列表顺序最好与成员变量定义顺序一致。(初始化顺序与后者一致。)
例2:
class A {
public:
A(int a1,int b)
:_a(a1)
,_b(b)
{}
private:
int _a;
int _b;
};
class B {
public:
B(int a1, int a2, int b,int c)
:_a(a1, a2)
,_b(b)
,_c(c)
{}
private:
A _a;
int& _b;
const int _c;
};
二.初始化补充
可以给(非静态)成员变量设置缺省值
class A {
private:
int a = 10;
char b = '1';
};
三.static成员
1.static静态成员变量:即此变量属于所有对象共享,而不属于某个对象。
- 声明在类中,定义在类外。
- 存储于静态区。
class A {
private:
static int _c; //声明
};
int A::_c = 0;//定义,不需要加static。需要加作用域操作符。
- 可以通过 类名::静态成员变量/对象.静态成员变量调用
- 静态成员变量也有访问限定符修饰。
2.static静态成员函数:用于访问调用静态成员变量。
class A {
public:
static int visit() {
return _c;
}
private:
static int _c;
};
int A::_c = 0;
- 只能访问静态成员变量,不能访问普通成员变量
- 可以通过 类名::静态成员函数/对象.静态成员函数调用
- 静态成员函数没有this指针。
- 静态成员函数不能用const修饰。
四.友元
- 友元分为友元函数和友元类
1.友元函数:定义在类外的普通函数可以直接调用类内成员。但需要类的内部声明(friend关键字)。
class date {
public:
friend ostream& operator<<(ostream& _cout, const date& d);
date(int year, int mouth, int day)
:_year(year)
, _mouth(mouth)
, _day(day)
{}
private:
int _year;
int _mouth;
int _day;
};
//ostream是c++中的输出流(cout),是一个定义输出到显示(输出)设备上的类
ostream& operator<<(ostream& _cout,const date& d) {
_cout <<d._year << d._mouth <<d._day; //一般不要加换行,因为不知道外部需求
return _cout; //用于连续输出
}
注意:
- 友元函数不能用const修饰。
- 友元函数可以在类任何地方声明,不受访问限定符限制。
- 友元函数调用方式与普通函数相同。
2.友元类
- 友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的私有成员变量。
- 友元关系是单向的,不具有交换性。
- 友元关系不能传递。
例: time类是date类的友元类,date类可以调用访问time类的私有成员变量。
class time {
friend class date1;
public:
time(int hour, int minute, int second)
:_hour(hour)
,_minute(minute)
,_second(second)
{}
private:
int _hour;
int _minute;
int _second;
};
class date1 {
public:
bool settimeofdate(time& t1,time& t2) {
if (t1._hour < t2._hour)
return true;
return false;
}
private:
int _year;
int _mouth;
int _day;
};
五.内部类
内部类就是定义在一个类内部的类,不属于外部类,也不能通过外部类调用内部类。是一个独立的类。
- 内部类与外部类唯一关系:内部类是外部类的友元类。所以内部类可通过外部类参数对象访问外部类的所有成员变量。
- 内部类可定义在外部类任意位置。
class time {
class date1 {
public:
bool settimeofdate(time& t1, time& t2) {
if (t1._hour < t2._hour)
return true;
return false;
}
private:
int _year;
int _mouth;
int _day;
};
public:
time(int hour, int minute, int second)
:_hour(hour)
,_minute(minute)
,_second(second)
{}
private:
int _hour;
int _minute;
int _second;
};