Bootstrap

static函数和友元

目录

static成员

概念:

特性:

判断题目:

面试题:

友元函数

理解一下cout的重载:

注意情况:

友元类

友元缺点:


static成员

概念:

声明为static得类成员是类的静态成员,用static修饰的成员变量,称之为静态成员变量,用static修饰的成员函数被称为静态成员函数,静态成员变量,静态成员变量要在类外面进行初始化。

特性:

1.静态成员为所有的类的对象所共享,不属于摸一个具体的对象,都会存放在静态区,可以去计算类的sizeof去判断,从结果我们可以知道静态成员不在类里面。

2.静态成员变量必须在类的外面进行定义,定义的时候回不需要去添加static关键字,类中只是去声明

3.如果想去访问类的静态成员可以用类名::静态成员或者对象.静态成员去访问

4.静态成员函数没有隐藏的this指针,多以说不能访问非静态的成员。(因为访问静态的成员要通过this指针去访问)、

5.静态成员从某种角度来说是全局的,只是收到了public和protected或者private访问限定符的限制

判断题目:

1.静态成员可以去调用非静态的成员函数(X

2.非静态的成员函数可以去调用类的静态成员函数(V

面试题:

在类里面查看创建出多少个类对象

解决方案:理工函数会构造,我们写一下构造函数,在构造函数里面写上一个变量进行++,这样我们就可以判断这个类里面有多少个成员对象。

友元函数

第一个问题:

如果现在去尝试重载operator<<,然后会发现没有办法去减肥operator<<给重载成成员函数,因为cout的输出流对象和隐函this指针总是回去抢占第一个参数的位置,this指针是默认将第一个参数(也就是左操作符),但是实际使用的cout需要的是第一个形参对象,才可以正常使用,所以要将operator<<重载称为全局函数,但是这样有会导致类的外面没有办法访问成员函数,这个时候就需要友元来解决同理operator也是这样。

加上域限定符值可以访问

理解一下cout的重载:

如果想要访问私有的情况下需要友元,可以在任何位置去声明

友元函数可以直接访问类的私有成员,友元的函数需要定义在类的外部,不属于任何类,但需要在类的内部声明,在声明的前面加上friend就可以了。

注意情况:

1.友元函数不能用const去修饰

2.友元函数可以在类的任何地方去定义,但是不受了类的访问限定符的限制

3.以个函数可以是多个类的友元函数

友元类

友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类的非共有成员

1.友元的关系是单向的,不能具有交换性

2.友元的关系不能传递

3.有元的关系不能继承

友元缺点:

友元虽然十分的便利,但是会增加耦合度,而且会破坏封装,这例面会在多多肽中使用

;