类和对象终体验

这里写目录标题

一、构造函数(进阶)

在类实例化对象时,编译器会自动调用该类的构造函数,给对象中的各成员变量一个初始值。

1.1赋初值

class Time{
public:
	Time(int hour,int minute,int second)
	{
		_hour = hour;
		_minute = minute;
		_second = second;
	}
private:
	int _hour;
	int _minute;
	int _second;
};

该构造函数体内只是给各个成员变量赋初值,并不是成员变量的初始化,因为初始化只能有一次,但是赋值该构造函数体内可以多次赋值。

1.2初始化列表

1.2.1初始化列表在哪里

接着我们需要谈谈,成员变量到底在哪里初始化。如下:

class Time{
public:
	Time()
	//成员变量初始化的位置
	{
	}
private:
	int _hour;
	int _minute;
	int _second;
};

1.2.2初始化列表的格式

类和对象终体验
初始化列表:以冒号开始,接着使用逗号分隔各个成员变量,每个成员变量后面的括号中放入初始值。

1.2.3注意事项

1.每个成员变量在初始化列表只能出现一次
2.类中包含自定义/引用/const类型成员变量都必须在初始化列表进行初始化

	Time a;             //自定义类型变量       
	int &_minute;       //引用变量
	const int _second;  //const变量

3.成员变量在类中声明的次序就是其初始化的顺序,与在初始化列表中的初始化顺序无关
类和对象终体验
在初始化_hour时,_minute并没有初始化,所以还是随机值。也就是在_hour初始化阶段将一个随机值赋值给了_hour。

1.3explicit关键字

对于单个参数的构造函数,具有类型转换的能力
类和对象终体验
为了去禁止这种隐式类型转换,这里就有了explicit关键字的应用

	Time(int hour)
		:_hour(hour)
	{}
	explicit Time(int hour)
		:_hour(hour)
	{}

这样就可以禁止Time类对象的单参隐式转换了,这里需要注意的时explicit关键字只能禁止单参构造函数的隐式转换(构造函数的参数大于等于2时,也不会出现隐式转换)

二、类的静态成员函数

2.1static成员

类的静态成员:static修饰的类成员
类的静态函数:static修饰的类的成员函数
类的静态成员变量:static修饰的类的成员变量(需要在类外进行初始化)

class People{
public:
	static void fun()   //静态成员函数
	{
		cout << _age << endl;
	}
private:
	static int _age;   //静态成员变量
};
int People::_age = 0;   //在类外初始化静态成员变量

特性:
1.类的静态成员,被该类所有对象共享。
2.静态成员函数没有this指针
3.类静态成员的访问方式:类名::静态成员或者对象.静态成员(注意访问限定符)
4.非静态成员函数可以调用静态成员函数
5.静态成员函数不能调用非静态成员函数。

2.2成员变量缺省值

C++11支持在类非静态成员变量的声明阶段进行赋值,这里其实是给声明的成员变量缺省值

class People{
public:
private:
	static int _age;   //静态成员变量
	string _name = "coutinho";   //给缺省值
};
int People::_age = 0;   //只能在类外初始化静态成员变量

三、友元与内部类

3.1友元函数

友元函数可以直接访问类的私有成员,它是定义在类外的普通函数,但是要在类内声明,声明是需要用到关键字friend。
重载C++标准输入输出:

class People{
	friend ostream& operator<<(ostream& _cout, const People& data);
	friend istream& operator>>(istream& _cin, People& data);
private:
	int _age; 
	string _name; 
};
ostream& operator<<(ostream& _cout, const People& data){
	_cout << data._age << "-" << data._name;
	return _cout;
}
istream& operator>>(istream& _cin, People& data){
	_cin >> data._age;
	_cin >> data._name;
	return _cin;
}

注意:
1.友元函数可以访问类的所有成员,但是自己不是类的成员函数
2.友元函数可以在类内任意位置声明,不受访问限定符限制
3.一个函数可以实多个类的友元函数

3.2友元类

1.友元关系是单向的,不具有交换性
2.友元关系不能传递
类和对象终体验

3.3内部类

顾名思义,就是在一个类中去定义另一个类。
注意:
1.内部类就是外部类的友元(内部类中可以直接访问外部类的私有成员)
2.内部类是一个独立的类,不能通过外部类对象去调用内部类
3.内部类可以定义在外部类的任意访问限定符之间。
4.外部类的大小与内部类的大小无关
类和对象终体验

上一篇:MySQL使用时间作为判断条件


下一篇:Java 8 日期类的使用