zoukankan      html  css  js  c++  java
  • 关于c++静态类的说法

    看了网上的观点,大致有这几种比较好的。

    观点一:根据现代的C++观点,静态类没有必要存在于C++中。

    一个类是对一个概念的描述,类的本质是它维护了一个不变式,也就是说它有一个状态,它所有的接口都是为了访问或者获取这个状态以及跟状态相关的操作。一个静态类没有状态,因此就没有必要成为一个类。在C++中静态方法不如非静态非类的成员方法好,尤其是使用了模板的情况下。

    我的疑问:如果只声明类起显示作用呢?

    观点二:C++里不可能有静态类的说法,相反,在Java里倒是有这么一说。
    C++由于具有传值、传址、哑元功能,使用静态类不仅多余而且也完全没有必要,相反,对Java、C#之类“改进型语言”来说,由于为避免指针,防止过多的产生对象实例,就必须额外的引入一些新的“先进性”的东西,比如静态类。然而,静态类本身是一个半成品(或是终极产品),由于其无法继承,静态类的产品化会因为不便升级而成为一种垃圾。
    同样,即便是在Java里,静态类的作用也仅相当于包含静态实例的C++类型定义,然而从语义上还没有C++定义的直观,为了对付一个小小的指针,避免伪引用,有必要做这么大的动作吗?我对此感到不值。

    观点三:C#或Java的
    类可以声明为 static 的,以指示它仅包含静态成员。不能使用 new 关键字创建静态类的实例。静态类在加载包含该类的程序或命名空间时由 .NET Framework 公共语言运行库 (CLR;特指:C#语言) 自动加载。 
    静态类只用于包含静态成员的类型,它既不能实例化,静态类的特性是防止继承,防止外部来NEW。
    所以C++中不存在静态类
    观点四:使用静态类来包含不与特定对象关联的方法。
    例如,创建一组不操作实例数据并且不与代码中的特定对象关联方法是很常见的要求。您应该使用静态类来包含那些方法。
    静态类的主要功能如下:
        它们仅包含静态成员。(仅包含静态成员不是上面说的包含不操作实例数据,不与对象关联矛盾吗?)
        它们不能被实例化。
        它们是密封的。
        它们不能包含实例构造函数(C# 编程指南)。
        静态类不能使用abstract或sealed修饰符。
        静态类默认继承自System.Object根类,不能显式指定任何其他基类。
        静态类不能指定任何接口实现(不能有接口实现,那起什么作用)。
        静态类的成员不能有protected或protected internal访问保护修饰符。

    观点五:

    静态类和静态类成员(C# 编程指南)

    静态类和类成员用于创建无需创建类的实例就能够访问的数据和函数。静态类成员可用于分离独立于任何对象标识的数据和行为:无论对象发生什么更改,这些数据和函数都不会随之变化。当类中没有依赖对象标识的数据或行为时,就可以使用静态类。

    结论:

    当一个类完全脱离实例数据和对象时可以使用静态类。

    静态类可以有自己的成员变量和成员函数,但都必须是静态的。对静态成员变量只能是程序运行开始时初始化,不能在类内初始化。

    静态类没有基类。



    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Effective Java 第三版——26. 不要使用原始类型
    Effective Java 第三版——25. 将源文件限制为单个顶级类
    Effective Java 第三版——24. 优先考虑静态成员类
    Effective Java 第三版——23. 优先使用类层次而不是标签类
    Effective Java 第三版——22. 接口仅用来定义类型
    Effective Java 第三版——21. 为后代设计接口
    Effective Java 第三版——20. 接口优于抽象类
    Effective Java 第三版——19. 如果使用继承则设计,并文档说明,否则不该使用
    Effective Java 第三版——18. 组合优于继承
    Effective Java 第三版——17. 最小化可变性
  • 原文地址:https://www.cnblogs.com/x739400043/p/4732196.html
Copyright © 2011-2022 走看看