文章目录

  • 1. this指针
  • 2. 静态成员
  • 3. 友元函数友元类



1. this指针

在上篇讲C++中类,对象,封装,继承(派生),多态的时候,this指针出现在成员函数中,并使用->成员提取符操作成员变量。

在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址,this 指针是所有成员函数的隐含参数,实际上成员函数默认第一个参数为T* const register this,this指针在成员函数的开始执行前构造的,在成员的执行结束后清除。

例如我们自定义一个print函数

class Animal
{
	String name;
	void print()
	{
		cout<<this->name;
	}
}

但是在编译器看来,它的原型是这样的:

class Animal
{
	String name;
	void print(T* const register this)
	{
		cout<<this->name;
	}
}

因此,在成员函数内部,它可以用来指向调用对象,并且只可以在成员函数中调用,对于全局函数,静态函数,友元函数,都不能使用this指针。

一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。


2. 静态成员

在变量或者函数前面加上关键字:static,它就变了一个静态变量或者静态函数,当static出现在类中被修饰成员中,被成为静态成员。

我以前问过老师一个很逗比的问题,给大家分享一下,代码简化一下就是这样的:

class Animal
{
public:
	static int age;
}

Animal an[10];
for (int i = 0; i < 10; i++)
{
	aa[i].age = i;
}

当我输出这10个对象的age的时候,我懵了,10个age都是同一个值,且是最后一个数的值,为什么,就是static这个关键字搞的鬼。

static这个关键字将成员变量age设定为静态变量。

什么是静态变量,static 修饰的静态局部变量只执行初始化一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。

也就是说在函数体内,静态变量具有“记忆”功能,即一个被声明为静态的变量在这一函数被调用的过程中其值维持不变,每个对象有各自的成员变量,但是他们共享静态变量。所以静态变量相当于是大家的共有资源。

所以this指针不能在静态函数中使用,静态函数如同静态变量一样,他不属于具体的哪一个对象,静态函数表示了整个类范围意义上的信息,而this指针却实实在在的对应一个对象,所以this指针不能被静态函数使用,在静态函数里面,不可以直接访问非静态成员。

静态数据成员和普通数据成员一样遵从public,protected,private访问规则。

相对于类的成员,必须在构造对象以后才会分配内存空间,只能通过对象名访问。而静态成员在无需构造对象情况下,可以使用类名访问。

全局变量和静态变量的区别:

对于定义在函数外面的变量被成为全局变量(或者叫外部变量),它的作用域是整个工程,比如我在A.cpp中定义了一个全局变量 :int A;
那么如果我想在B.cpp中使用这个变量,我就可以在B.cpp中使用extern关键字来使用变量A :extern A;

静态变量包括静态全局变量和静态局部变量

和全局变量相比,静态全局变量的作用域是定义它的这个cpp文件,如果一个项目只有这一个cpp,那么在作用域来说,它与全局变量没有区别,如果是多个cpp,在另一个cpp中使用extern也无济于事。

而静态局部变量只在定义它的函数里面起作用,与普通局部变量相比,当函数返回后,静态局部变量并不会消失,而普通局部变量会消失。

静态变量和全局变量的值在未初始化,都会被设定为0,而其他变量的值设定随机。


3. 友元函数友元类

所谓友元函数,就是在类中,用friend关键字声明一个函数,这个函数的声明在类中,但不作为类的成员函数,虽然友元函数不属于成员函数,却可以访问类中的成员,不论成员是public,pirvate还是protected。

对于友元函数,放在public和private,或者是protected,都是可以的。

class Animal
{
private:
	string name;
	friend void getName();
};

void getName()
{
	//业务逻辑
}

为什么要引入友元函数:在实现类之间数据共享时,减少系统开销,提高效率,具体来说:为了使其他类的成员函数直接访问该类的私有变量,同时也破坏了类的封装性,所以不到万不得已,还是不要用友元函数。

因为是需要友元来共享数据,那么大多数情况,友元函数都是有参数的, 因为友元函数没有this指针,则参数要有三种情况:

要访问非static成员时,需要对象做参数;

要访问static成员或全局变量时,则不需要对象做参数

如果做参数的对象是全局对象,则不需要对象做参数

至于友元类,也是一样。