c++中的静态类和非静态类有何不同??

解决方案 »

  1.   

    在C++中好像没有听过静态类的概念.
    只有static变量一说.对类中的static变量或者函数来说,它们的使用只需要使用类名进行限定就可以了,不需要有具体的类实例.
    我不知道你所说的静态类是什么意思,能详细说说吗?
      

  2.   

    对啊,还真没听过静态类。2.2 C++类中的静态成员在C语言中,声明一个数据为静态类型,意味着该变量的生存周期是静态的,即在程序的开始时即分配,到程序终止时才释放。但在C++中,声明一个类中的成员为静态类型,则意味着该类的所有实例只有该成员的一个拷贝。也就是说,不管应用程序中创建了这个类的多少个对象,其静态成员只有一个副本,该副本为这个类的所有对象实例所共享,而对于非静态成员,每个类对象实例都有自己的拷贝。例如:class CPerson{public:    CString szName;    static CString szCompanyName;    CPerson();    virtual ~CPerson();};    接着用该类声明一个实例 CPerson me;    对于同一家公司员工,每个人都有不同的姓名,但是他们的公司名字是一样的,所以就可以用一个静态类型来保存,这样所有的员工都共享这个公司名称,只要一位员工更新了公司名称,则所有员工的公司名称就被更新了。静态成员被当作该类类型的全局对象,可以把一个静态数据成员和静态成员函数当成全局变量和函数那样去存储和访问,但又被隐藏在类的内部,并且清楚地与这个类相联系但又不是全局对象,同全局对象相比,使用静态成员有两个优势:    (1) 静态成员没有进入程序的全局名字空间,它属于类,它的名字只在类的范围内有效,因此不存在与程序中其他全局名字冲突的可能性。    (2) 可以实现信息隐藏,并可以保持类的完整性,可以是private(私有的)成员、public(公有的)成员或者protected(保护的)成员,而全局对象不能。2.2.1 静态数据成员使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,就可以保证所有对象都能够访问到被更新后的值,这样可以提高效率和节省内存空间。在类中将一个成员变量声明为静态的,与声明普通变量的唯一区别就是在其定义前加一个static。象上面的例子中那样声明:static CString szCompanyName。静态数据成员显式初始化与一般数据成员初始化不同。静态数据成员显式初始化的格式如下:  <数据类型><类名>::<静态数据成员名>=<值>对于上面的例子这样初始化:CString CPerson::szCommpanyName = "网进科技",这表明:  (1) 初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。  (2) 初始化时不加该成员的访问权限控制符private,public等。(3) 初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。    在类的成员函数中可以直接引用该类的静态数据成员,而不必使用成员访问操作符。但是在非成员函数中,我们必须一两种方式之一访问静态数据成员。(1) 使用成员访问操作符。例如:me是CPerson的一个实例,在非成员函数中可以这样应用其中的静态数据成员:CString TheCommpanyName = me.CommpanyName。(2) 因为类静态数据成员只有一个拷贝,所以它不一定要通过对象或者指针来访问。方法二就是用被类名限定修饰的名字直接访问它。当我们不通过类的成员访问操作符访问静态数据成员时,必须指定类名以及紧跟其后的域操作符,因为静态成员不是全局对象,所以我们不能在全局域中找到它。如:CString TheCommpanyName = CPerson::CommpanyName。    顺便说一句静态数据成员还有两个特点:    (1) 静态数据成员的类型可以是其所属类,而非静态数据成员只能被声明为该类的对象的指针或引用。    (2) 静态数据成员可以被作为类成员函数的缺省实参,而非静态成员不能。2.2.1 静态成员函数    静态成员函数的声明与普通函数的唯一区别就是在前面加一个static。    通常,当前对象的地址(this)是被隐含地传递到被调用的非静态成员函数的。静态成员函数具有类的范围,同非静态成员函数相比,静态成员函数没有this参数,因此它不能访问一般的数据成员,而只能访问静态数据成员、枚举或嵌套类型和其他的静态成员函数。这样使用静态成员函数在速度上可以比全局函数有少许的增长,它不仅没有传递this指针所需的额外的花费,而且还有使函数在类内的好处。如果静态成员函数中要引用非静态成员时,可通过对象来引用。    我们可以用成员访问操作符点(.)和箭头(->)为一个类对象或指向类对象的指针访问静态成员函数,也可以用限定修饰名直接访问静态成员函数,而无需声明类对象。静态成员函数遵循约束:(1) 不能用成员选择符(.或->)访问非静态成员。(2) 不能说明为虚函数。(3) 不能与有相同参数类型的非静态成员函同名。(4) 不能声明为const或volatile。(5) 出现在类体外的函数定义不指定关键字static
      

  3.   

    一个简单的回答是,静态类只有一份副本,而非静态类,生成一个对象有一个副本。你可以这样理解,类A有两个变量B、和C,其中B是静态变量,C为非静态变量,那么你现在这样
     A testClass;
     testClass.B =....;
      testClass.C =....;  A  testClass2;
      你可以在testClass2中访问B和C,这时你就能发现B中的值和testClass中的B的值是一至的,而C是没有初始化的。