【C++】类与对象补充博(初始化列表+static+友元)

一.初始化列表

对于对象创建,可以通过构造函数/拷贝构造函数对成员变量赋初值,也可以通过初始化列表为初始化成员变量。

  • 构造函数是给成员变量赋值,可以赋值多次。
  • 初始化列表为初始化成员函数。

初始化列表:在构造函数/拷贝构造函数定义参数列表后,以:开始,用,隔开成员变量。如下例。

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;
};
发布了53 篇原创文章 · 获赞 49 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43550839/article/details/101474394
今日推荐