类和对象的下篇

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary_walk

      ⸝⋆   ━━━┓
     - 个性标签 - :来于“云”的“羽球人”。 Talk is cheap. Show me the code
┗━━━━━━━  ➴ ⷯ

本人座右铭 :   欲达高峰,必忍其痛;欲戴王冠,必承其重。

👑💎💎👑💎💎👑 
💎💎💎自💎💎💎
💎💎💎信💎💎💎
👑💎💎 💎💎👑    希望在看完我的此篇博客后可以对你有帮助哟

👑👑💎💎💎👑👑   此外,希望各位大佬们在看完后,可以互相支持,蟹蟹!
👑👑👑💎👑👑👑 

 目录:
一:构造函数的补充
二:static修饰的变量以及函数
三:友元
四:内部类
五:匿名对象
六:拷贝对象的一些优化
七:深度理解封装

1:构造函数的补充
1.1初始化列表

类的成员里面有const 修饰的时候,我们在定义构造函数的时候,是有问题的,若不对当前const 修饰的变量进行初始化

const 修饰的变量必须在进行声明的时候就进行初始化

为解决这一问题,引出了初始化列表这个概念

对于自定义类型的成员,引用类型的成员并且对应的改类没有默认构造函数的,也需要借助 初始化列表来进行完成

1.2 注意:

     1:每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
     2: 类中包含一些特殊的成员,必须放在初始化列表位置进行初始化

     3:不管是否显示在初始化列表中进行初始化,编译器都会默认在初始化列表中对所有是类的变量进行初始化

   4:初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。

   5:当定义的对象给出了初始化的值,在调用初始化列表的时候就会以给出的参数进行初始化,若是没有给出参数,就看看是否有缺省值,有的话使用缺省值,若是2个都没有编译器就会使用随机值

栗子见下:

 6:关于在初始化列表里面对类的成员进行初始化的先后顺序问题:是以类的成员定义的先后顺序进行初始化的

栗子见下:

 1.3 explicit关键字

对于自定义类型与内内置类型之间的转换的理解:

当我们不想让自定义类型与内置类型之间进行转换 的时候可以使用关键字 explicit

2:static修饰的变量以及函数
2.1概念

类的成员在生命的时候使用关键字static进行修饰,称之为类的静态成员

static修饰的函数称之为静态成员函数

注意对静态成员变量一定要在类的外面进行初始化

 2.2应用

 

 2.3 static 的特性

1.静态成员为所有的类对象共享,不属于某一个对象,是放在静态区的

2.静态成员变量必须在类外进行定义,定义时不能加关键字 static

3. 类的静态成员的访问:类名 :: 静态成员变量名字 或者对象.静态成员变量

4.静态成员函数是没有隐藏的this指针

5.静态成员也是类的成员,也受到访问限定符的限制

6. 静态成员函数可以调用静态成员变量

7.静态成员函数可以调用静态成员函数

8.非静态成员函数可以调用静态成员函数

3:友元
3.1概念

友元其实是打破了对类的封装:当我们对类的成员属性设置为private或者protected的时候,在类是不能直接进行访问的,这个时候借助友元函数或者友元类进OK

3.2友元类

友元类是单向的,不能双向互相访问

代码:

class Time
{
private:
	int _hour;
	int _min;
	int _sec;
public:
	friend class Date;//声明日期为时间的友元类(也就是Date里面可以访问Timel里面的私有成员)
	Time(int hour = 0,int min = 0,int sec = 0)
		:_hour(hour)
		,_min(min)
		,_sec(sec)
	{}
};
class Date
{
public:
	void Print()
	{
		cout << _year << '/' << _month << '/' << _day << endl;
		cout << _t._hour << ':' << _t._min<< ':' << _t._sec << endl;
	}
	Date(int year = 2024, int month = 4, int day = 2)//初始化列表
		:_year(year)
		, _month(month)
		, _day(day)
	{
		cout << "Date()" << endl;
	}
	void SetTimeOfDate(int hour, int min, int sec)
	{
		_t._hour = hour;
		_t._min = min;
		_t._sec = sec;
	}
private:
	int _year;
	int _month;
	int _day;
	Time _t;//自定义类型
};
int main()
{
	Date d(2024, 4, 3);
	d.SetTimeOfDate(21, 31, 42);
	d.Print();
	return 0;
}

运行结果:

 

3.3友元函数
lass Date
{
public:
	//friend ostream& operator << (ostream& _cout, Date& d);//err
	friend ostream& operator<< (ostream& _cout,const  Date& d);
	friend istream& operator>> (istream& _cin,  Date& d);


	Date(int year, int month, int day)//初始化列表
		:_year(year)
		, _month(month)
		,_day(day)
	{}
	void Print()
	{
		cout << _year << '/' << _month << '/' << _day << endl;
	}
	/*ostream& operator << (ostream& _cout)
	{
		_cout << _year << '/' << _month << '/' << _day << endl;
		return _cout;
	}*/
private:
	int _year;
	int _month;
	int _day;

};
ostream& operator<< (ostream& _cout,const Date& d)
{
	_cout << d._year << '/' << d._month << '/' << d._day << endl;
	return _cout;
}
istream& operator>> (istream& _cin, Date& d)//注意第二个参数不能用const 修饰
{
	//一开始是不能对类外私有成员进行访问的,可以借助友元函数进行操作
	_cin >> d._year >>d._month>>d._day;
	return _cin;
}
int main()
{
	Date d1(2024, 4, 2);
	//cout << d1 << endl;//err 此时this 指针和_cout这个参数都进行抢占第一个参数的位置
	cin >> d1;
	cout << d1 << endl;
	return 0;
}

 

注意:

  1.友元函数不是类的成员,不属于任何类
  2.友元函数不属于该类的成员函数,它是定义在类外的普通函数,只是类中声明该函数可以直接访问类中的private或者protected成员  

  3.友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有声明。
  4.友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有声明。

4:内部类
概念: 如果一个类定义在另一个类的内部,这个内部类就叫做内部类 。内部类是一个独立的类,
它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越
的访问权限。
注意: 内部类是外部类的友元,但是外部类不一定就是内部类的友元 (看外部类是否进行友元的声明)

内部类的特点:

     1. 内部类可以定义在外部类的public、protected、private都是可以的。
    2. 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象 / 类名。
    3. sizeof(外部类) = 外部类,和内部类没有任何关系。 

     4. 内部类在空间上是与外部类相互独立的但是受到外部类的类域的限制

5:匿名对象

书写形式:类名 ()

6:拷贝对象的一些优化
在传参和传返回值的过程中,一般编译器会做一些优化, 减少对象的拷贝 ,以此提高效率

栗子见下:

7:深度理解封装
在类和对象阶段,大家一定要体会到,类是对某一类实体(对象)来进行描述的,描述该对象具有那的属性,以及方法,描述完成后就形成了一种新的自定义类型,才用该自定义类型就可以实例化   具体的对象。
结语:

以上就是今日的share,对于类和对象下期的理解还是比较好容易的(当然是建立在前期:对类和对象上,中期的理解),希望各位老铁们可以有所收获!

相关推荐

  1. 对象下篇

    2024-04-03 08:58:02       21 阅读

最近更新

  1. vue2 mixins混入

    2024-04-03 08:58:02       0 阅读
  2. HashTable和ConcurrentHashMap的区别

    2024-04-03 08:58:02       0 阅读
  3. 前端错误监控的方法有哪些

    2024-04-03 08:58:02       0 阅读
  4. numpy

    2024-04-03 08:58:02       0 阅读
  5. C# 接口

    2024-04-03 08:58:02       0 阅读
  6. ubuntu在线安装mysql数据库

    2024-04-03 08:58:02       0 阅读
  7. 十分钟Nginx优化速成课

    2024-04-03 08:58:02       0 阅读
  8. 浅理解vue2中的模板编译

    2024-04-03 08:58:02       0 阅读
  9. H3C交换机FTP与TFTP

    2024-04-03 08:58:02       0 阅读

热门阅读

  1. openmmlab系列框架多GPU训练

    2024-04-03 08:58:02       5 阅读
  2. 练气第六天

    2024-04-03 08:58:02       4 阅读
  3. openGauss 分布式分析能力

    2024-04-03 08:58:02       9 阅读
  4. PostCSS安装与使用技术详解

    2024-04-03 08:58:02       4 阅读
  5. CSS总结

    2024-04-03 08:58:02       6 阅读
  6. 拒绝服务攻击(Dos)与Tomcat的解决方法

    2024-04-03 08:58:02       6 阅读
  7. 读《C Primer Plus》

    2024-04-03 08:58:02       5 阅读