C++——类和对象(二)成员初始化列表、静态成员、友元

接着上一次的类和对象篇,再次了解一些类和对象的知识

类和对象的三大特性:

封装、继承、多态

一.构造函数

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均可)。

发布了58 篇原创文章 · 获赞 43 · 访问量 4409

猜你喜欢

转载自blog.csdn.net/Wz_still_shuai/article/details/90489195
今日推荐