类和对象及其友元函数和static成员

一、构造函数
构造函数体中的语句只能将其称作为赋初值,而不能称为初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值
初始化列表:存在于函数名和函数体的中间。以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个“成员变量”后面跟一个放在括号的初始值或表达式。

class A
{
public:
	A(int a)
		:_a(a)
	{}
private:
	int _a;
};
class B
{
public:
	B(int a, int ref)
		:_obj(a)
		, _ref(ref)
		, _n(10)
	{}
private:
	A _obj;//没有默认构造函数
	int &_ref;//引用
	const int _n;//const
};

注意:
1,每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
2,类中包含一下成员,必须放在初始化列表位置进行初始化。
引用成员变量
const成员变量
类类型成员(该类没有默认构造函数)

class Time
{
public:
	Time(int hour = 0)
		:_hour(hour)
	{

	}
private:
	int _hour;
};
class Date
{
public:
	Date(int day)
	{}
private:
	int _day;
	Time _t;
};

3,对与自定义类型成员变量,一定会先使用初始化列表初始化。
4、在初始化列表中,声明什么顺序,就初始化什么顺序。
5、explicit关键字作用,用explicit修饰构造函数,将会禁止单参构造函数的隐式转换。
二、static成员
1、静态的成员变量一定要在类外进行初始化。
特性:1、静态成员为所有类对象所共享,不属于某个具体的实例。
2、静态成员变量必须在类外定义,定义时不添加static关键字。
3、类静态成员即可用类名::静态成员或者对象.静态成员来访问。
4、静态成员函数没有隐藏的this指针,不能访问任何非静态成员。
静态成员函数不可以调用非静态成员函数,非静态成员函数可以调用类的静态成员函数。
5、静态成员和类的普通成员一样,也有public,protected,private3种访问级别,也可以具有返回值,const修饰等参数。
三、C++11的成员初始化新玩法。
C++11支持非静态成员变量在声明时,直接初始化。
四、友元
友元分为友元函数和友元类:友元提供了一种突破封装的方式,有时提供了便利但是友元会增加耦合度,破坏了封装,所有友元不宜多用。
1、友元函数:友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。
(1)友元函数可访问类的私有成员,但不是类的成员函数。
(2)友元函数不能用const修饰。因为const用来修饰成员函数的this指针,而友元函数中没有this指针。
(3)友元函数可以在类定义的任何地方声明,不受类访问限定符限制。
(4)一个函数可以是多个类的友元函数
(5)友元函数的调用与普通函数的调用和原理相同。
2、友元类:友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
(1)友元关系是单向的,不具有交换性。
(2)友元关系不能传递
五、内部类
概念:内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去调用内部类。外部类对内部类没有任何优越的访问权限。
内部类就是外部类的友元类。内部类可以通过外部类的对象参数来访问外部类中的所有成员,但是外部类不是内部类的友元。
特点:
(1)内部类可以定义在外部类的public,private,protected都是可以的
(2)注意内部类可以直接访问外部类中的static、枚举成员,不需要外部类的对象/类名。 这也是和友元函数的区别
(3)sizeof(外部类)=外部类,和内部类没有任何关系。

猜你喜欢

转载自blog.csdn.net/weixin_43198968/article/details/89285908
今日推荐