c++ static 类成员

一.什么是static类成员

对于特定类类型的全体对象而言, 访问一个全局对象有时是必要的. 然后,全局对象会破坏封装: 对象需要支持特定类抽象的实现. 如果对象是全局的, 一般的用户代码就可以修改这个值. 类可以定义类静态成员,而不是定义一个可普遍访问的全局对象. 通常, 非static数据成员存在于类类型的每个对象中. 不像普通的数据成员, static数据成员独立于该类的任意对象而存在, 每个static数据成员是与类关联的对象,
并不与该类的对象相关联.

类也可以定义static成员函数. static成员函数没有this形参 (static成员是类的组成部分但不是任何对象的组成部分)  , 它可以直接访问所属类的static成员, 但不能直接使用非static成员.

二.使用类的static成员的优点

1)static成员的名字是在类的作用域中, 因此可以避免与其他类的成员或全局对象名字冲突.

2)可以实施封装.static成员可以是私有成员,而全局对象不可以.

3)通过阅读程序容易看出static成员是与特定类关联的.这种可见性可清晰地显示程序员的意图.

三.定义static成员

在成员声明前加上关键字static将成员设为static. static成员遵循正常的公有/私有访问规则.

<span style="font-size:14px;">class A
{
   public:
     static int Getval() { return value;}
     static void Setval( int );
  private:
    static int value;
}
 int A::value=0; //初始化</span>

四.使用类的static成员

可以通过作用域操作符从类直接调用static成员, 或者通过对象,引用,或指向该类类型的对象的指针间接调用.

A pg;

A *pg1=&pg;

int B;

B=pg.Getval();

B=pg1->Getval();

B=A::Getval();

五.类的成员函数

当static成员函数定义在类的外部时, 无须重复指定static关键字, 该保留字只出现在类定义内部的声明处:

void A:: Setval( int newVal)

{

value=newVal;

}

static成员不是任何对象的组成部分, 所以static成员函数不能声明为const, 毕竟, 将成员函数声明为const就是承诺不会修改该函数所属的对象. static成员函数也不能声明为虚函数.

六.static数据成员

static数据成员可以声明为任意类型: 常量, 引用, 数组, 类类型, 等等.

static数据成员必须在类定义的外部定义(正好一次),
不像普通数据成员, static成员不是通过类构造函数进行初始化, 而是应该在定义时进行初始化.

定义方式如下:

先指定类型名, 接着是成员的完全限定名

int A::value=0; //初始化

1)特殊的整型const static 成员

一般而言static成员像普通数据成员一样不能在类的定义体中初始化. 但有一个例外, 那就是只要初始化是一个常量表达式, 整型const static 数据成员就可以在类的定义体中进行初始化:

<span style="font-size:14px;">class A
{
   public:
     static int Getval() { return value;}
     static void Setval( int );
  private:
    static const int num = 10;
    int Sz[num];
    static int value;
}
 int A::value=0; //初始化</span>
<span style="font-size:14px;"> const int A:: num;</span>

const static 数据成员在类的定义体中初始化时,  该数据成员仍必须在类的定义体之外进行定义.

2) static 成员不是类对象的组成部分

static 成员独立于任何对象而存在, 不是类类型对象的组成部分.  它们的使用方式对于非static数据成员而言是不合法的.

例如static 数据成员的类型可以是该成员所属的类类型.  而非static成员被限定声明为其自身类对象的指针或引用.

class C

{

private:

static C tmp;   //ok

C tmp; //wrong

};

除了static数据成员还有一个比较特殊的是mutable成员, mutable成员的用法也是在类型名前面加上mutable, mutable成员永远不能为const, 它的值可以在const成员函数中修改.

时间: 2024-08-26 21:06:12

c++ static 类成员的相关文章

C++中static类成员

static局部变量 static局部变量确保不迟于在程序执行流程第一次经过该对象的定义语句时进行初始化 这种对象一旦被创建,在程序结束前不会被撤销.在该函数被多次调用的过程中,静态局部对象会持续存在并保存它的值. #include<iostream> #include<string> #include<assert.h> using namespace std; size_t count_calls() { static size_t ctr=0; return ++

static类成员

static成员函数不能被声明为const: stati数据成员必须在类定义体的外部定义.不像普通数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义的时候进行初始化. ps:特殊的整型 const static 成员 一般而言,类的static成员,像普通数据成员一样,不能再类的定义体种初始化.相反,static数据成员通常在定义体中进行初始化. 只要初始化式是一个常量表达式,整型congst static 数据成员就可以在类的定义体中进行定义.

[C++ primer]类成员指针

1.声明成员指针 有时我们希望直接获取成员的指针,然后从一个对象或别的对象获得该成员,这时就需要用到成员指针.成员指针,包含类的类型以及成员的类型. 成员指针只针对类的非static成员.static类成员不是任何对象的组成部分,所以不需要特殊语法来指向static成员,static成员指针是普通指针. 注:它指向的是一个类的特定成员,而不是指向一个特定对象里的特定成员. 成员指针的定义格式:成员类型 类名::*指针名=&类名::成员名; 成员函数指针的定义格式: 成员函数返回类型 类名::*指

类成员的指针

ps:const对象只能调用const函数!!非const对象随便!! 成员指针只应用于类的非 static 成员.static 类成员不是任何对象的组成部分,所以不需要特殊语法来指向 static 成员,static 成员指针是普通指针. int *p = &Screen::total;    (total 是 static int total;) 例子: #include<iostream> using namespace std; class Screen{ public: st

类内const static(static const)成员变量初始化问题

在查找const相关资料的过程中,又遇到了另外一个问题,就是C++类中const static(或者static const)成员变量应当如何初始化的问题. 查阅了许多资料,发现VC环境下,只允许const static成员变量在类外初始化,这个应该是编译器遗留下的bug(你也可以说是要求严格). 在其他编译器下,整型以及枚举类型的const static成员变量是允许在声明的同时进行初始的,其中整型包括int.short.long.char等,非整型是指浮点型 包括float.double等.

C++类中的static数据成员,static成员函数

C++类中谈到static,我们可以在类中定义static成员,static成员函数!C++primer里面讲过:static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联!这句话可能比较拗口,其实可以这么理解:每个static数据成员可以看成是类的一个对象,而不与该类定义的对象有任何关系!下面我们就来具体看看类中的static数据成员! 谈到数据成员,我们最先想到的应该是怎么去定义一个static数据成

变量,final常量,类成员变量,static关键字,实例变量,静态变量,局部变量

1.常量:又称为final变量,在整个程序中仅能被赋值一次 final int num = 1215; num = 1216; // 错误,仅能赋值一次 2.类成员变量:不在方法中定义的变量即为成员变量,在方法体内定义的变量则为局部变量 成员变量含义:对象的属性 public class Book{ int id; string name; //两个成员变量 public String getName(){ int id = 0;  //局部变量,必须进行赋值或初始化 } } 3.static关

类成员(static)和final修饰符

在Java类里只能包含成员变量.方法.构造器.初始化块.内部类(包括接口.枚举)5种成员,类成员是用static来修饰的,其属于整个类. 当使用实例来访问类成员时,实际上依然是委托给该类来访问类成员,因此即使某个实例为null,它也可以访问它所属类的类成员. public class NullAcessStatic { public static void test() { System.out.println("static修饰的类方法"); } public static void

类成员变量初始化的问题

class window{ window(int maker){ System.out.println("window"+maker); } } class House{ window w1 ;//new window(1); window w3 = new window(3); House(){ System.out.print("House"); w3 = new window(33); } window w4 = new window(4); } class