C++类的静态成员和this指针

静态成员:

概述:C++类中的静态成员一共有两种,静态成员变量和静态成员函数,被关键字 static 声明为静态的,称为静态成员。 不管这个类创建了多少个对象,静态成员只 有一个拷贝,这个拷贝被所有属于这个类的对象共享。
静态成员变量
在一个类中,若将一个成员变量声明为 static,这种成员称为静态成员变量。与一 般的数据成员不同,无论建立了多少个对象,都只有一个静态数据的拷贝。静态成 员变量,属于某个类,所有对象共享。 静态变量,是在编译阶段就分配空间,对 象还没有创建时,就已经分配空间。 静态成员变量必须在类中声明,在类外定义。 静态数据成员不属于某个对象,在 为对象分配空间中不包括静态成员所占空间。 静态数据成员可以通过类名或者对 象名来引用。
静态成员函数
在类定义中,前面有 static 说明的成员函数称为静态成员函数。静态成员函数使用 方式和静态变量一样,同样在对象没有创建前,即可通过类名调用。静态成员函数 主要为了访问静态变量,但是,不能访问普通成员变量。 静态成员函数的意义, 不在于信息共享,数据沟通,而在于管理静态数据成员,完成对静态数据成员的封 装。静态成员函数只能访问静态变量,不能访问普通成员变量 静态成员函数的使用和 静态成员变量一样 静态成员函数也有访问权限 普通成员函数可访问静态成员变 量、也可以访问非静态成员变量。
静态成员形式如下:

class Person
{
public:
	int a;/*普通成员变量*/
	static int  b;/*静态成员变量声明*/
private:
	void test_fun()/*普通成员函数的定义*/
	{
		cout << "C++的普通成员函数"<<endl;
	}
	static void test_s_fun();/*静态成员函数的声明*/
};
/*静态成员变量的定义*/
int b = 10;
/*静态成员函数的定义*/
void test_s_fun()
{
	cout << "C++类的静态成员函数"<<endl;
}

注:静态成员函数和静态成员变量也是有访问权限的,类外不能访问privateprotect权限的静态成员。

C++成员变量和函数存储

C++成员变量和函数分开存储的基础概念:
C++中类的成员函数和成员变量的存储方式是不一样的。比如定义对象是系统会为对象分配存储空间,其中只为成员变量分配了存储空间,而成员函数则存放在公共的代码段中。
**所以每个对象占用的存储空间只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分)所占用的存储空间,而不包括成员函数所占用的存储。

C++存储分布:
C++程序的内存格局通常分为四个区:全局数据区(data area)代码区(code area)栈区(stack area)堆区(heap area)(即自由存储区)

全局数据区存放全局变量,静态数据和常量;
所有类成员函数和非成员函数代码存放在代码区;
为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放在栈区;
余下的空间都被称为堆区。
由此,我们可以得知在类的定义时,类成员函数是被放在代码区,而类的静态成员变量在类定义时就已经在全局数据区分配了内存,因而它是属于类的。对于非静态成员变量,我们是在类的实例化过程中(构造对象)才在栈区或者堆区为其分配内存,是为每个对象生成一个拷贝,所以它是属于对象的。

C++中的this指针

this 是 C++ 中的一个关键字,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。
所谓当前对象,是指正在使用的对象。例如对于stu.test();,test就是当前对象,this 就指向 stu。
友元函数没有 this 指针,因为友元不是类的成员。只有成员函数才有 this 指针。

#include <iostream>
#include <string>

using namespace std;

class Person
{
		public:
				Person(int age,string name)
				{
					this->age = age;
					this->name = name;
				}
		public:

				int age;
				string name;

};


void test01()
{
	Person p1(10,"test");
	cout << "age:   "<<p1.age << endl;
	cout << "name:  " << p1.name << endl;

}
int main()
{
	test01();


	return 0;
}

如上述代码,在构造函数采用了和成员变量名相同的形参,如果不用this指针就不能使用和成员参数相同的形参(在初始化的时候会出现二义性)
运行结果:
在这里插入图片描述
注意,this 是一个指针,要用->来访问成员变量或成员函数。

this 虽然用在类的内部,但是只有在对象被创建以后才会给 this 赋值,并且这个赋值的过程是编译器自动完成的,不需要用户干预,用户也不能显式地给 this 赋值。本例中,this 的值和 pstu 的值是相同的。
this指针需要注意的几点:

  • this 是 const 指针,它的值是不能被修改的,一切企图修改该指针的操作,如赋值、递增、递减等都是不允许的。
  • this 只能在成员函数内部使用,用在其他地方没有意义,也是非法的。
  • 只有当对象被创建后 this 才有意义,因此不能在 static 成员函数中使用
    this的本质:
  • this 实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给 this。不过 this 这个形参是隐式的,它并不出现在代码中,而是在编译阶段由编译器默默地将它添加到参数列表中。
  • this 作为隐式形参,本质上是成员函数的局部变量,所以只能用在成员函数的内部,并且只有在通过对象调用成员函数时才给 this 赋值。
  • 成员函数最终被编译成与对象无关的普通函数,除了成员变量,会丢失所有信息,所以编译时要在成员函数中添加一个额外的参数,把当前对象的首地址传入,以此来关联成员函数和成员变量。这个额外的参数,实际上就是 this,它是成员函数和成员变量关联的桥梁。
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值