C++学习之静态成员

一、静态数据成员

  C++允许将类的数据成员定义为静态成员。静态数据成员是属于类的,整个类只有一个备份,相当于类的全局变量,能够被该类的所有对象共用。

  1.静态成员的声明

  在类数据成员的声明前加上关键字static,就将该成员指定成了静态数据成员。静态数据成员遵守public、private、protected访问权限的限定规则。如:

 1 class Account
 2 {
 3    public:
 4             Account();  //构造函数
 5             ~Account();  //析构函数
 6     //.....................
 7    private:
 8            static int number;  //静态数据成员声明
 9     //.....................
10 }    

  2.静态数据成员的定义

  在类的声明中将数据成员指定为静态成员,只是一种声明,并不会为该成员分配内存空间,在使用之前应该对他进行定义。静态数据成员常常在类外进行定义,与类成员函数的定义方法一样。定义形式如:  

1 //类型  类名::静态成员名;
2 //类型 类名::静态成员名 = 初始值
3 int Account::number;  //定义静态成员并初始化为0

  注意:(1)在类外定义静态数据成员时,不能加上static限定词

     (2)在定义静态数据成员时可以指定他的初始值,若定义是没有指定初始值,系统将会自动赋上默认值

  3.静态数据成员的访问

  静态成员属于整个类,如果将他定义为类的公有成员,在类外可有两种方式访问。

  a)通过类名访问

    类名::静态成员名

  b)通过对象访问

    对象名.静态成员名

  4.静态数据成员与非静态数据成员的区别

  (1)非静态数据成员与对象关联,每个对象拥有独立的数据成员备份。静态数据成员与类关联,整个类只有一份静态数据成员备份,由全类所有对象共用。(C++会为对象的非静态数据成员分配独立的内存空间,而静态数据成员在内存中则只分配一次)

  (2)非静态数据成员只有在定义了对象之后才存在(也就是分配内存空间)。静态数据成员不属于单个对象,即使没有定义他所属类的任何对象时,就已经存在了。

  (3)非静态数据成员的作用域限定在定义对象的块作用域内,静态数据成员自他的定义开始到程序结束之前有效。

二、静态成员函数

  在类成员函数的原型前面加上static就将他定义成了静态成员函数。静态成员函数属于整个类,他只能访问该类的静态成员(包括静态数据成员和静态成员函数),不能访问非静态成员(包括非静态数据成员和非静态成员函数)。

  1.静态成员函数的声明定义

 1 class Account
 2  {
 3     public:
 4              Account();  //构造函数
 5              ~Account();  //析构函数       
 6      //.....................
 7          static int getNumber()  //定义静态成员函数
 8        {
 9           return number; //访问静态数据成员
10        }
11
12      private:
13             static int number;  //静态数据成员声明
14      //.....................
15  }    

  2.调用方式

  静态成员函数的调用方式有两种:

  a)类调用方式

    类名::静态成员函数名(参数表);

  b)对象调用

    对象名.静态成员函数名(参数表);

  3.特别注意

  (1)和普通成员函数一样,静态成员函数也可以在类内或类外定义,还可以定义成内联函数

  (2)静态函数只能访问静态成员(包括静态数据成员和静态成员函数),不能访问非静态成员(包括非静态数据成员和非静态成员函数)

  (3)在类外定义静态成员函数时,不能加上static限定词

  (4)静态成员函数可以在定义类的任何对象之前被调用,非静态成员只有在定义对象后,通过对象才能访问

ps:如果有什么不对的地方,希望各位前辈同行能够批评指出,本人将感激不尽!!!!

时间: 2024-10-27 03:48:17

C++学习之静态成员的相关文章

C#学习之泛型继承和静态成员

想要理解这里有必要先将泛型类学习充分.这里讲解的是泛型类继承类的类型和静态成员. 在前面C#学习之泛型中,创建的LinkList<T>类实现了IEnumerable<T>接口. 即泛型类也可以实现泛型的接口,也可派生自一个类.泛型类也可以派生自泛型基类. public class Base<T> { } public class Derived<T>:Base<T> { } 也可以指定基类的类型,可以执行某些特定操作 public class D

C++ Primer Plus学习笔记之静态成员

C++ Primer Plus学习笔记之静态成员 关键字static可以用来说明一个类的成员(包括数据成员和成员函数),这样的成员被称为静态成员: 1,静态数据成员 在一个类中,若将一个数据说明前加上static,则该数据成为静态数据,静态数据成员被该类的所有对象共享.无论建立多少个该类的对象,都只有一个静态数据存储空间: 具体语法如下: 类型名 类名::静态数据成员[=常量表达式] 其中,常量表达式用于初始化类的静态数据成员: 静态数据成员属于类,而不属于对象,因为静态成员的存在是不依赖于某个

C# 静态成员和方法的学习小结

数据成员:数据成员可以分静态变量.实例变量两种.静态成员:静态成员变量是和类相关联的,可以作为类中"共"有的变量(是一个共性的表现),他不依赖特定对象的存在,访问的时候通过类名加点操作符加变量名来访问. 实例成员:实例成员变量是和对象相关联的,访问实例成员变量依赖于实例的存在. 函数成员:方法可以主要分为静态方法,实例方法 静态方法:静态方法是不属于特定对象的方法,静态方法可以访问静态成员变量,静态方法不可以直接访问实例变量,可以在实例函数调用的情况下,实例变 量做为参数传给静态方法.

C++学习10 static静态成员变量和静态成员函数

一般情况下,如果有N个同类的对象,那么每一个对象都分别有自己的成员变量,不同对象的成员变量各自有值,互不相干.但是有时我们希望有某一个或几个成员变量为所有对象共有,这样可以实现数据共享. 可以使用全局变量来达到共享数据的目的.例如在一个程序文件中有多个函数,每一个函数都可以改变全局变量的值,全局变量的值为各函数共享.但是用全局变量的安全性得不到保证,由于在各处都可以自由地修改全局变量的值,很有可能偶然失误,全局变量的值就被修改,导致程序的失败.因此在实际开发中很少使用全局变量. 如果想在同类的多

C++面向对象学习-类的静态成员

1 静态数据成员 2 1,sizeof 运算符不会计算静态成员. 3 4 2,对静态成员数据初始化的顺序为它们在类体外声明的顺序. 5 6 3,静态数据成员被类的所有对象所共享,包括该类的派生类对象. 7 8 4,静态成员数据也可以分为公有的.私有的和受保护的静态成员. 9 对公有静态成员,即可以通过类的对象进行访问,也可以通过类名直接访问. 10 私有的和保护的静态成员数据则只能被该类的公有成员函数访问. 11 12 5,在创建任何对象之前,类的静态成员数据已经存在并可以引用. 13 14 6

面向对象课后深入学习(C++ 类的静态成员详细讲解)

今天在刚申请了博客,一下午都在写那个随笔,所以说好的来看c++的也放在了最后,下星期就考试了,这个类的静态成员是我不是很懂的,在网上 看到一片很详细的博客考下来回去慢慢看. 在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存. 静态成员的定义或声明要加个关键static.静态成员可以通过双冒号来使用即<类名>::<静态成员名>.

C# 学习之 类的静态成员

我们可以使用 static 关键字把类成员定义为静态的.当我们声明一个类成员为静态时,意味着无论有多少个类的对象被创建,只会有一个该静态成员的副本. 关键字 static 意味着类中只有一个该成员的实例. 静态变量用于定义常量,因为它们的值可以通过直接调用类而不需要创建类的实例来获取. 静态变量可在成员函数或类的定义外部进行初始化.你也可以在类的定义内部初始化静态变量. ---------------------------------------------------------------

Java学习---静态成员变量和一般成员变量的区别

public class AccessProperty { int i=47;//改变加static int i=47; public void call(){ System.out.println("调用call()方法"); for(int i=0;i<3;i++){ System.out.println(i+""); if(i==2){ System.out.println("\n"); } } } public AccessProp

微软CodeDom模型学习笔记(全)

要点1 CodeDomProvider MSDN描述 CodeDomProvider可用于创建和检索代码生成器和代码编译器的实例.代码生成器可用于以特定的语言生成代码,而代码编译器可用于将代码编译为程序集. 注意:在 .NET Framework 2.0版中,在代码生成器和代码编译器中可用的方法可直接从代码提供程序获得.您不需要调用CreateGenerator 或CreateCompiler 来访问这些方法,这些方法被标记为已过时.这适用于预先存在的以及新的代码提供程序实现. CodeDomP