c++学习笔记(8.类的静态成员)

本节知识点:

1.静态成员:
   a.静态成员变量的意义:普通成员变量只属于类的一个对象,不能在类的多个对象之间共享,所以就产生了静态成员变量。
    b.静态成员: 静态成员属于整个类所有,不需要依赖任何对象。可以通过类名直接访问public的静态成员,也可以通过对象名访问public的静态成员。静态成员函数可以直接访问静态成员变量。
   c.静态成员变量的定义:在定义时直接通过static关键字修饰, 静态成员变量不依赖于任何对象,需要在类外单独分配空间,语法:Type ClassName :: VarName; 或者是用对象名来访问(用这个类的任何一个对象名来访问都行)
   d.静态成员函数的定义:在定义时直接通过static关键字修饰, 函数中不能使用类中的普通成员变量(原因是没有this指针),只能使用类中的静态成员变量或是全局变量!!!
代码示例(计算程序中一共有几个这个类的对象):
#include <stdio.h>

class test
{
private:
	static int num;
public:
	test()
	{
		num++;
	}
	static void getnum()//类中的静态成员函数 只能使用静态成员变量,不能使用普通变量 
	{
		printf("num is %d\n",num); 
	}
	~test()
	{
		num--;
	} 
};

int test::num = 0; //因为静态成员变量不属于任何对象 其实是一个存在于全局区的变量 所以要在外面声明 
void fun()
{
	test t[100];
	test::getnum();
}
int main()
{
	test t1;
	fun();
	t1.getnum();  //test::getnum(); 
	return 0;
}

2.普通成员与静态成员的区别:
   a.普遍成员变量与静态成员变量的区别:
      第一:如果对象是全局属性,则对象中的普通成员变量也是全局属性,如果对象是局部属性,则对象中的普通成员变量也是局部属性。 但是静态成员变量都是全局属性的,都是存放在全局变量区的。
      第二:静态成员只是类名这个命名空间中的全局变量和全局函数。但是它又与仅仅在命名空间中的全局变量和函数有一个巨大的区别,就是类可以对静态成员进行访问权限的限制。所以说应该尽量避免使用全局变量,通过静态成员变量来替代全局变量,因为静态成员变量的安全性更高!(其实全局变量就等价于一个public属性的静态成员变量,对于函数也一样)
    注意:这里有一个问题就是类名不能再定义为命名空间的名字了~~~~不知道为什么,只要类名和命名空间的名字相同就会报错!!!
   b.对象模型的分析:
      第一:c++类对象中的成员变量和成员函数时分开存储的。成员变量, 普通成员变量,存储在对象中,与struct变量有相同的内存对齐和字节对齐方式静态成员变量,存储于全局数据区中成员函数存放在程序段中
       第二:c++中的class是从面向对象理论出发的,将变量和函数集中定义在一起,用于描述现实世界中的类。从计算机理论的角度,程序依然是由数据段和代码段构成的,那c++编译器是如何完成面向对象理论到计算机程序的转化的?如下图:

                   
   c.普通成员函数与静态成员函数的区别:
      第一: 静态成员函数不包括指向具体对象的this指针(因为它不属于任何对象),普通成员函数包含一个指向具体对象的this指针。c++中类的普通成员函数隐式包含一个指向当前对象的this指针作为参数(就是上图中的&a)。
      第二: 对于public属性的成员函数(包括静态成员和普通成员),通过上图的变化,这些类中的函数就变成了跟在命名空间中(在类外面定义的)函数一样了。但是对于private属性的成员函数,再通过上图的变化,就不能说跟类外面的函数一样了,因为使用空间不同,被private限定在类中了!
      第三: 普通成员函数可以访问类中的任何成员变量。静态成员函数只能访问类中的静态成员变量,不能访问类中的普通成员变量(因为没有this指针)。
示例代码(测试一下this指针):
#include <stdio.h>

class test
{
private:
	int a;
	int b;
	static int c;
public:
	test(int a, int b, int c)
	{
		this->a = a;
		this->b = b;
		this->c = c;
	} 
	void pfun()
	{
		printf("this %p\n",this);
		printf("a %p\n",&a);
		printf("b %p\n",&b);
		printf("c %p\n",&c);
	}
};
int test::c; 
int main()
{
	test t1(1,2,3);
	printf("t1 %p\n",&t1);
	t1.pfun();
	return 0;	
}
注意:this指针一般的用途:
           第一:如上代码,在函数参数与类中成员变量重名的时候,使用this指针来访问成员变量。
           第二:当你想通过函数返回本对象或者保存本对象的时候,就要使用*this来访问本对象。




  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
静态成员遵循的其他成员所遵循的访问限制,除了 D. 静态数据成员初始化。静态成员是指在中用 static 关键字声明的成员,包括静态数据成员和静态成员函数。静态数据成员是所有对象共享的,只有一份拷贝,静态成员函数不依赖于任何对象,可以直接使用名调用。 静态成员的访问权限与普通成员一样,遵循的访问限制。例如,私有静态数据成员和私有静态成员函数只能在内部访问,公有静态数据成员和公有静态成员函数可以在的任何地方访问。例如: ```c++ class MyClass { public: // 公有静态数据成员和静态成员函数 static int count; static void printCount() { cout << "count = " << count << endl; } private: // 私有静态数据成员和静态成员函数 static int num; static void printNum() { cout << "num = " << num << endl; } }; int MyClass::count = 0; // 静态数据成员初始化,可以在外部进行 int MyClass::num = 0; // 静态数据成员初始化,可以在外部进行 int main() { MyClass::count++; // 使用名访问公有静态数据成员 MyClass::printCount(); // 使用名调用公有静态成员函数 // MyClass::num++; // 错误:不能访问私有静态数据成员 // MyClass::printNum(); // 错误:不能调用私有静态成员函数 return 0; } ``` 在上面的例子中,定义了一个 `MyClass` ,包括公有静态数据成员和静态成员函数、私有静态数据成员和静态成员函数。公有静态数据成员和静态成员函数可以在的任何地方访问,私有静态数据成员和静态成员函数只能在内部访问。静态数据成员的初始化可以在外部进行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值