[015]staic成员及staic成员函数

C++primer里面讲过:static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联!这句话可能比较拗口,其实可以这么理解:每个static数据成员可以看成是类的一个对象,而不与该类定义的对象有任何关系.

谈到数据成员,我们最先想到的应该是怎么去定义一个static数据成员,static数据成员是存储在程序的静态存储区,而并不是在栈空间上。既然是static数据成员,所以关键字static是必不可少的,例如:

class Sum {
public:
    Sum() {num++; sum+=num;}
    static void Reset() {num = 0; sum = 0;}
    static int GetSum() {return sum;}
private:
    static int num;
    static int sum;
};

需要特别注意的是:

在类中不能对static数据成员进行初始化,要初始化的话必须在类外进行定义!

而且static数据成员不是通过类构造函数进行初始化的,它的成员初始化的次序是按照static数据成员在类中的声明次序进行初始化的,初始化了之后,就可以使用static数据成员了

int Sum::num = 0;
int Sum::sum = 0;

我们甚至可以这样使用:

int SS(int i) {
    Sum::Reset();           // 没有实例对象,却可以在这里使用
    Sum *p = new Sum[i];
    delete []p;
    p = NULL;

    return Sum::GetSum();   // 没有实例对象,却可以在这里使用
}

说到static数据成员,有一种情况不得不提,那就是特殊的const static成员。

如上面所述,类的static成员,像普通数据成员一样,不能在类的定义体中进行初始化。只能在类外进行初始化。const int 型的static成员便可以在类定义体内部进行初始化。记住一定只能是const int或者const char型的,换成const string ,double都不行。

class Sum {
public:
    Sum() {num++; sum+=num;}
    static void Reset() {num = 0; sum = 0;}
    static int GetSum() {return sum;}
private:
    static int num;
    static int sum;
    static const int i = 10;        // ok
    static const char i = 10;       // ok
    static const double i = 10;     //Error
    static const string i = 10;     //Error
};

在C++Primer里面有一段注解:const static数据成员在类的定义体中进行了初始化后,还必须在类的定义体之外进行定义。其实这是可要可不要的。

说完了static成员后,我们再来看看static成员函数,static成员是类的组成部分并不是任何对象的组成部分,因此,static成员函数没有this指针。

class Sum {
public:
    Sum() {num++; sum+=num;}
    static void Reset() {num = 0; sum = 0;}
    static int GetSum() {
        return sum;          // OK 因为是static成员
        return i;            // Error 因为非static
    }
private:
    static int num;
    static int sum;
    int i;
};
时间: 2024-12-14 20:51:23

[015]staic成员及staic成员函数的相关文章

【好程序员训练营】Objective-C学习笔记----------成员变量和成员函数的封装

<A href="http://www.goodprogrammer.org/" target="blank">ios培训</A>------我的OC语言笔记,期待与您交流! 前言--在我们开发项目的过程中,很多时候我们不想程序里面的成员变量或者成员函数暴露出来,我们只希望别人通过一些方法来调用这些变量或者函数, 这时就需要用到成员变量和成员函数的封装 一.成员变量的封装 @interface Person:NSObject{ @privat

C++的类成员和类成员函数指针

类成员函数指针: 用于访问类成员函数,和一般函数指针有区别. 类成员函数处理的是类数据成员,声明类成员函数指针的同时,还要指出具体是哪个类的函数指针才可以.调用时也要通过对象调用. 而对于类的静态成员函数,它是类对象共享的,且只能处理静态数据成员,所以它的函数指针可以类似一般函数指针一样使用. 1 class Test 2 { 3 public: 4 void fun(int); 5 void fun(int) const; //重载函数,加一个const限制 6 static void fun

2.2 C++类的成员变量和成员函数

参考:http://www.weixueyuan.net/view/6334.html 总结: 类成员的声明和定义: 类成员函数的定义分类内定义(内联)和类外定义(可用 inline 关键字 强制转换为内联函数). 类是一种数据类型,该类型类似于普通的数据类型,但是又有别于普通的数据类型.类这种数据类型是一个包含成员变量和成员函数的一个集合.下面是student类的定义. [例1] 类可以包含成员变量和成员函数: class student { char name[20]; //姓名 int i

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

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

类数据成员和类成员函数

一.类成员: 1.数据成员和成员函数都是属于对象的. 2.C++支持另外一种类型的成员,这种成员属于类本身,而不属于类对象,我们称之为类成员. 3.使用关键字static可以创建一个类成员. 4.在类声明内部声明的static数据成员必须在任何程序块之外定义. 5.static数据成员不影响类与类对象的sizeof. 二.类成员函数 1.static静态成员函数只可以访问其他的static数据成员和成员函数. 2.非static成员函数既可以访问static数据成员,也可以访问非static数据

5.this调用成员变量、成员函数、构造函数

this的两种用法: 1.this调用成员变量和成员函数    System.out.println("my name is "+this.name) this代表调用这个函数的对象. 可以用来区分成员变量和参数,必须加this 2.使用this调用构造函数 person(Sting name,int age,String address) { this.name=name; this.age=age; this.address=address;//前面是成员变量,后面是参数 } th

【转】C++ const成员变量和成员函数(常成员函数)

转:http://c.biancheng.net/view/2230.html 在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只需要在声明时加上 const 关键字.初始化 const 成员变量只有一种方法,就是通过构造函数的初始化列表,这点在前面已经讲到了,请猛击<C++初始化列表>回顾. const成员函数(常成员函数) const 成员函

C++ const成员变量、成员函数和对象

const成员变量 const成员变量和const普通变量用法相似.初始化const成员变量只有一种方法,就是通过构造函数的初始化列表. const成员函数 const成员函数可以使用类中的所有成员变量,但是不能修改它们的值. 注意:const成员函数需要在声明和定义的时候在函数头部的结尾加上const关键字 函数开头的const用来修饰函数的返回值,表示返回值是const类型,也就是不能被修改. 函数头部的结尾加上const表示常成员函数,这种函数只能读取成员变量的值,而不能修改成员变量的值.

类成员和对象成员

3.7   类数据成员和类成员函数 到目前为止,我们所看到的数据成员和成员函数都是属于对象的.比方说,我们在3.6节定义了Task类,如果我们用Task类定义如下两个对象: 那么,这两个对象都拥有各自的id.st.ft和logFile数据成员.C++还支持另外一种类型的成员,这种成员属于类本身,而不属于类的对象,我们称之为类成员(class member),而将属于对象的成员称为对象成员(object member)或实例成员(instance member).使用关键字static就可以创建一

面向对象的JavaScript(3):私有成员和公开成员

在小项目中对于JavaScript使用,只要写几个function就行了.但在大型项目中,尤其是在开发追求 良好的用户体验的网站中,如SNS,就会 用到大量的JavaScrpt,有时JavaScript的工作量胜过了C#,这时写一堆function,就会显得很乱,杂乱无章,甚至会出现命名冲突,管理和维 护起来都很麻烦.对于这种情况我们就需要使用面向对象的思想来开发JavaScript.那我们就这样作罢: 这节来说下JavaScript的私有成员和公开成员,虽然JavaScript没有privat