静态类和静态成员

前言


c++文章连载:
1.C++基础
  1.C++基础
  2.C++新增和有变化的关键字
  3.C++的内存管理
2.面向对象
  1.C++的封装和访问权限
  2.C++继承和多态特性
  3.C++的运算符重载
  4.C++静态类和静态成员
  5.C++的友元函数和友元类
3.模板编程和STL
  1.C++模板编程入门
  2.STL的容器类和迭代器
  3.STL的泛型算法
  4.模板特化与类型萃取
  5.STL的其他容器讲解
  6.智能指针与STL查漏补缺
4.杂项
  1.c++各种流操作
  2.依赖,关联,聚合,组合,继承
  3.一些技巧性的代码设计
  
  


1.类的静态成员

1.1、static关键字
(1)static,C语言中有2种用法:static修饰局部变量和全局变量,含义完全不同
(2)static,C++中扩展了第3种用法:静态类、静态成员,含义和前2种完全不同
1.2、什么是静态成员
(1)用static修饰成员变量,即为静态成员变量;用static修饰成员方法,即为静态成员方法

(2)静态成员属于class本身,而不属于对象
1.3、静态成员的特征和实践验证
(1)静态成员变量在类的多个对象中均可访问,且是同一个实体,被多个对象“共享”。实验验证
(2)静态成员变量和方法可以用对象调用,也可以根本不产生对象而用类本身来调用。实验验证Person::height = 25;(注意不是Person.height = 25;)
(3)静态成员
函数
在类外实现时只需在类内声明时加static,类外实体无须加static关键字,否则是错误的(思考下为什么?)。因为如果在类外添加static关键字,编译器会将其当作第二种理解,也就是全局静态函数。

2.静态成员的深度理解

2.1、静态数据成员的使用
(1)静态数据成员不能在类中初始化,因为类定义实际只是模型,本身并没有和变量/对象实体去关联
(2)静态数据成员不能在类的构造函数中初始化,因为构造函数是用来构造具体单个对象的,而静态成员属于类(或者说类和他的所有对象共享),如果在构造函数中允许对静态成员初始化或赋值,就会每多创建一个对象,原有对象中该静态成员的值莫名其妙变了,不合理
(3)静态数据成员不能用初始化列表方式来初始化
(4)静态数据成员如果不初始化则值默认为0
(5)静态成员仍然遵循public,private,protected访问准则。
2.2、静态成员和普通成员的互相调用规则
(1)普通成员函数中可以调用静态成员变量和方法,调用方法有3种:直接访问、this指针访问、类名::func()方式访问

Person::height = 333;		// 非静态普通方法内调用静态成员,方式1
height = 333;				//方式2
this->height = 333;		//方式3

(2)静态方法中只能访问静态成员变量和方法,不能访问任何非静态的东西
(3)静态方法中如果确实需要访问非静态成员,应该通过函数传参方式

2.3、从内存角度出发
(1)class定义时只是定义类型,并不定义变量和对象,静态成员变量真正定义是在外部,类似于全局变量
(2)静态成员变量在编译链接时分配,程序加载时被落实到内存中,程序结束时死亡,等同于全局变量
(3)静态成员函数在编译链接时分配,程序加载时被落实到内存中,程序结束时死亡,等同全局函数
(4)普通成员和对象绑定,随对象的创建和释放而生死(不管在栈里还是堆里),类似于局部变量和malloc堆内存
(5)静态成员变量在对象中不占用存储空间

3.静态成员的用途

3.1、用途举例
(1)静态数据成员的用途之一是统计有多少个对象实际存在,比如声明一个学生类,其中一个成员为学生总数,则这个变量就应当声明为静态变量,应该根据实际需求来设置成员变量。代码实战
(2)静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关
3.2、静态成员与面向对象
(1)静态成员仍然在class内,仍可通过对象调用,因此表面上遵守面向对象规则。
(2)静态成员一定程度上破坏了面向对象,因为没有对象直接用class名也可以调用静态成员。
(3)静态成员可被看做是类外部的全局变量和全局函数被封装到了类的内部
(4)一个类的静态成员和非静态成员是完全不同的,两者唯一的关联可能就是隶属于同一个class的作用域内。

4.静态类的扩展讲解

4.1、什么是静态类
(1)class声明时使用static,整个类是个静态类
(2)静态类内部全是静态成员,没有非静态成员
(3)静态类不能被实例化
(4)静态类是密封(sealed)的。(不能拿来做父类的类)
(5)静态类不包括构造函数
(6)静态类不能指定任何接口实现,不能有任何实例成员
(7)静态类的成员不能有protected或protected internal访问保护修饰符。
(8)静态类不能包含构造函数,但仍可声明静态构造函数以分配初始值或设置某个静态状态。
4.2、静态类的优势
(1)编译器能够执行检查以确保不致偶然地添加实例成员。编译器将保证不会创建此类的实例。
(2)静态类是密封的,因此不可被继承。
4.3、C++不支持静态类
(1)Java/C#等高级语言支持静态类,而C++并不支持。
(2)C++中创建静态类与创建仅包含静态成员和私有构造函数的类大致一样。私有构造函数阻止类被实例化。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值