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
    评论
C++中,静态成员函数是属于本身而不是对象的成员函数。静态成员函数在声明时使用了static关键字。静态成员函数在使用时可以直接通过名加作用域解析运算符::调用,而不需要通过对象来调用。 静态成员函数的声明和实现可以分离,意味着可以将静态成员函数的声明和定义放在不同的文件中。这种分离的用途主要有两个方面: 第一,可以将静态成员函数的声明放在的头文件中,将定义放在实现文件中,这样可以提高代码的可读性和可维护性,使得的接口部分和实现部分分离开来。 第二,当多个源文件需要使用同一个静态成员函数时,可以将函数的声明放在一个公共的头文件中,而将函数的定义放在不同的源文件中,然后将这些源文件编译链接在一起。这样可以避免在多个源文件中重复定义静态成员函数,减少了代码的冗余,提高了编译的效率。 需要注意的是,静态成员函数在定义时无法访问的非静态成员变量和非静态成员函数,因为静态成员函数没有this指针。但是静态成员函数可以访问静态成员变量和静态成员函数。 总结起来,静态成员函数声明实现分离可以提高代码的可读性、可维护性和代码复用性。它允许将的接口部分和实现部分分开,并使得多个源文件可以共享同一个静态成员函数而不需要重复定义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值