接着上一次的类和对象篇,再次了解一些类和对象的知识
类和对象的三大特性:
封装、继承、多态
一.构造函数
1.成员初始化列表
构造函数的作用就是用来为类的对象进行初始化的。
之前,进行初始化是在构造函数内部为成员变量进行赋值;现在使用成员初始化列表来进行初始化。
例:
//在构造函数内部进行赋值操作
Date(int year = 1999, int month = 1, int day = 1) {
_year = year;
_month = month;
_day = day;
}
//使用成员初始化列表
Date(int year=1999, int month=1, int day=1)
:_year(year), _month(month), _day(day)
{
}
注意:
1.每个成员变量只能在初始化列表出现一次。
2.类中的以下成员,必须在初始化列表进行初始化
①引用
②const成员
③类类型(自定义类型,并且该类没有默认构造函数)
3.编译器会先用初始化列表进行初始化,再进入构造函数内部。
并且,自定义类型的初始化是一定会先通过成员初始化列表来初始化的。
执行结果:
4.成员变量在类中的声明顺序就是其在初始化列表中的初始化顺序,与其在初始化列表中先后次序无关。
5.隐式类型转换
Date d1(2019, 1, 1); //这个是构造
Date d2 = { 2000,1,1 }; //这个其实完成了三步,
//1.Date tmp (2000,1,1);
//2.Date d2=tmp
//3.优化 (简化了步骤,不创建临时变量)
6.explicit关键字(加在构造函数名前),用于消除隐式类型转换。即加上该关键字后,上述第二行代码会报错。
二.静态成员变量
1.定义格式:
static 类型 变量名
注意:静态成员变量必须初始化,而且得在类外初始化。
在类外初始化的格式:
类型 类名::变量名=初始值
2.例:
class A {
private:
int _data;
public:
A(int data) :_data(data) {
}
static int k;
};
int A::k = 0;
3.访问方式
静态成员变量不属于某一个特定的对象,它属于该类的全体对象,即它属于整个类。
①通过对象
②通过类名
int main() {
A a1 = 10;
a1.k++;
A a2;
a2.k++;
cout << A::k << endl;
system("pause");
return 0;
}
执行结果:2
三.静态成员函数
1.定义格式:
函数名前加static关键字即可
2.例:
static int Print() {
cout << k;
return k;
}
静态成员函数没有this指针,故不能访问非静态成员,它属于整个类。
总结一下Static的作用
1.修饰局部变量,改变其生命周期到程序结束
2.修饰全局变量、全局函数,改变其链接属性
3.修饰成员函数,则该成员函数没有this指针,使其属于整个类,而非某个对象。
4.修饰成员变量,使其属于整个类。
四.友元函数
1.友元函数的意义:当一个函数被声明为一个类的友元函数时,该函数可以忽略访问限定符的限制去访问类的成员变量。
2.例:
class A {
private:
int _data;
public:
A(int data=20) :_data(data) {
}
static int k;
static int Print() {
cout << k;
return k;
}
friend int Friend();
};
int Friend() {
A a;
a._data = 100;
cout << a._data << endl;
}
注意:类的友元函数不是类的成员函数,故在类外定义时,不要加作用域限定符。
典型实例:用友元函数重载输出运算符
//在类内的声明
friend ostream& operator<<(ostream& _cout, A a);
//在类外的定义,由于不是成员函数,所以不要加类的作用域限定符
ostream& operator<<(ostream& _cout, A a) {
_cout << a._data << endl;
return _cout;
}
五.友元类
1.定义格式:
类前加friend关键字修饰
友元类可以访问源类中的私有成员而不受访问限定符的限制。
2.例:
class B {
public:
int k;
};
class A {
private:
int _data;
friend B;
public:
A(int data=20) :_data(data) {
}
friend ostream& operator<<(ostream& _cout,A a);
};
注意:
友元类可以声明在源类的任何位置(public、private、protected均可)。