C++静态成员

本文地址:http://www.cnblogs.com/archimedes/p/cpp-static2.html,转载请注明源地址

静态数据成员

定义:

以关键字static声明的数据成员

class Box
{
public:
    int volume() const;
private:
    int iwitch;
    int length;
    int heigth;
    static int count;
};

初始化:

静态数据成员必须初始化且只能在类外初始化,初始化时不能加static,格式:

类型 类名::静态数据成员名 [= 初值];

class Box
{
public:
    int volume() const;
private:
    int iwitch;
    int length;
    int heigth;
    static int count;
};
int Box::count; //必须在类外初始化

注意:不能通过构造函数初始化、不能通过初始化列表初始化

访问:

静态数据成员属于类而不属于具体的对象,为不同对象共有。因此,公有静态数据成员在类外的访问方式有两种

类名::公有静态数据成员

对象名.公有静态数据成员

静态数据成员可被其所在类的任何成员函数直接引用

void Box::display()const
{
     cout << Box:: s_iCount << " ";
     cout << s_iCount << " ";
}

存储:

静态数据成员编译时开辟内存单元,占据全局区类的对象创建前就能使用。

静态数据成员的内存单元独立开辟,不属于具体的某个对象,为不同的对象共有。

为什么要引入静态数据成员?

各对象之间的数据有了沟通的渠道,实现了数据的共享,C++中涉及到对象之间的数据共享时应使用静态数据成员,而不要使用全局变量,因为全局变量不能体现封装特性。

#include <iostream>
using namespace std;
class Type
{
public:
    Type(int ax=0);
    static int s_value;
    void print();
private:
    int m_value;
};
int Type::s_value;
Type::Type(int ax)
{
    m_value=ax;
}
void Type::print()
{
    cout<<"m_value="
        <<++m_value
        <<endl;
    cout<<"s_value="
        <<++s_value
        <<endl;
}
int main()
{
    Type::s_value=90;
    Type c1,c2;
    c1.print();
    c2.print();
    system("PAUSE");
    return 0;
}

应用举例:统计创建对象的个数

#include <iostream>
#include <string>
using namespace std;
class student
{
public:
    student(string aName="codingwu")
    {
        strName=aName;
        count++;
        cout << "Cons"<<" "<<strName <<endl;
    }
    ~student()
    {
        count--;
        cout<< "Des"<<" "<<strName<<endl;
    }
    void printCount()const
    {
        cout<<"COUNT = "<<count<<endl;
    }
private:
    static int count;
    string strName;
};
int student::count;
int main()
{
    student stu("li");
    student stu1("zhang");
    student *p=new student[5];
    delete []p;
    student("hahahaha");
    stu.printCount();
    system("PAUSE");
    return 0;
}

运行结果:

静态成员函数

1、概念:

用static声明的成员函数

2、访问方式:
      属于类类型的而不属于具体对象

3、特点

①静态成员函数专门用于访问静态成员(包括数据成员和成员函数)

②是属于类的而不属于具体对象,因此既可以通过类名访问,也可以通过对象名引用

③其实静态成员函数就是在类内的全局函数

④静态成员函数没有this指针

#include <iostream>
using namespace std;

class Type
{
public:
    static void print();
    Type(int aValue = 0);
private:
    int m_iValue;
    static int s_iValue;
};
int Type::s_iValue;

Type::Type(int aValue)
{
    m_iValue = aValue;
    s_iValue++;
}
void Type::print()
{
    //cout << ++m_iValue;//Error
    cout << s_iValue << endl;
}
int main()
{
    Type::print();
    Type c1,c2;
    c1.print();
    c2.print();
    return 0;
}

注意:

非静态成员函数可以访问本类中的任何成员

静态成员函数专门用于访问静态成员,不能直接访问非静态成员。

#include <iostream>
#include <string>
using namespace std;

class Student
{
public:
    Student(int aNum=0,int aAge=0,double aScore=0);
    void total();
    static double s_average();
    double m_iScore;
private:
    static int s_iCount;//对象个数
    static double s_iSum;//总成绩
    int m_iNum;
    int m_iAge;
};
double Student::s_iSum;
int Student::s_iCount;

Student::Student(int aNum,int aAge,double aScore):m_iNum(aNum),m_iAge(aAge),m_iScore(aScore)
{
}
void Student::total()
{
    s_iSum += m_iScore;
    s_iCount++;
}
double Student::s_average()
{
    return s_iSum/s_iCount;
}
int main()
{
    Student stud[3] =
    {
        Student(1001,18,60),
        Student(1002,19,90),
        Student(1005,20,0),
    };
    for(int i = 0;i<3;i++)
        stud[i].total();
    cout << Student::s_average()<<endl;
    system("PAUSE");
    return 0;
}
时间: 2024-10-06 20:49:31

C++静态成员的相关文章

类静态成员(难点)

一.类静态数据成员 静态成员的提出是为了解决数据共享的问题.实现共享有许多方法,如:设置全局性的变量或对象是一种方法.但是,全局变量或对象是有局限性的.这里主要讨论用类的静态成员来实现对象间的数据的共享. 静态数据成员的使用方法和注意事项如下: 1.静态数据成员在定义或说明时前面加关键字static. 2.静态成员初始化与一般数据成员初始化不同.静态数据成员初始化的格式如下: <数据类型><类名>::<静态数据成员名>=<值> 3.静态数据成员是静态存储的,

C++静态成员变量需注意的问题

1.在类的内部仅仅进行声明 为什么? 因为如果这样的话,每构造一个对象就要进行一次初始化,而这样就不能达到类共享的目的. 2.在类的外部要进行初始化 为什么? 因为在类的仅仅进行了声明(编译器会这样认为),没有分配存储空间,在类外进行初始化话,是为了分配存储空间. 3.初始化时不加static 示例 #include "stdafx.h" #include <iostream> using namespace std; class A { public: static in

C++程序设计方法3:类中的静态成员

在类型前面加static修饰的数据成员,是隶属于类的,成为类的静态数据成员,也称为"类的变量" 静态数据成员被该类的所有对象共享(即所有对象中的这个数据域实际上处于同一个内存位置) 静态数据要在实现文件中赋初值,格式为: Type ClassName::static_var = Value; 返回值类型前面加static修饰的成员函数,称为静态成员函数,它们不能调用非静态成员函数: 类的静态成员(数据,函数)既可以通过对象来访问,也可以通过类名字类访问: #include <io

成员函数指针和指向静态成员函数的指针

#include <iostream> using namespace std; class Student{ public:     Student(const string& name):m_name(name){}     void who(void){         cout << m_name << endl;     }     string m_name;     static int s_add(int a,int b){         re

C++中类的静态成员初始化

静态成员的初始化: 与全局对象一样对于静态数据成员在程序中也只能提供一个定义,这意味着静态数据成员的初始化不应该被放在头文件中而应该放在含有类的非inline函数定义的文件中. 转自:http://blog.csdn.net/veryday_code/article/details/7921833 能在类中初始化的成员只有一种,那就是静态常量成员. class A { private: static const int count = 0; // 静态常量成员可以在类内初始化 }; 结论: 静态

c++静态成员与静态函数

1 静态成员的定义 1 静态变量 c++在类里面进行的仅是引用性声明,不会为之分配内存,要求必须单独对静态数据成员进行定义性的声明.形式为: 类型 类名::静态数据成员名: 此时的定义需要再加关键字static,并且可以在定义时初始化. c++要求类中成员变量不可以直接初始化,可以采用定义函数方法时后挂变量方式初始化. 这与Java不同. 2 静态函数 定义方式与静态变量同.函数的定义可以在类内也可以在类外. class A { public: A(int y) { a=y; cout<<a+

静态成员函数不能采用const修饰的原因

静态成员函数不能用const修饰 ,也不能存取nonstatic数据 C++中静态成员函数不能用const修饰的原因: static在c++中的第五种含义:用static修饰不访问非静态数据成员的类成员函数.这意味着一个静态成员函数只能访问它的参数.类的静态数据成员和全局变量. 不能用const的原因:一个静态成员函数访问的值是其参数.静态数据成员和全局变量,而这些数据都不是对象状态的一部分.而对成员函数中使用关键字const是表明:函数不会修改该函数访问的目标对象的数据成员.既然一个静态成员函

C++里的静态成员函数不能用const的原因

From http://blog.csdn.net/freeboy1015/article/details/7634950 static在c++中的第五种含义:用static修饰不访问非静态数据成员的类成员函数.这意味着一个静态成员函数只能访问它的参数.类的静态数据成员和全局变量. 不能用const的原因: 这是C++的规则,const修饰符用于表示函数不能修改成员变量的值,该函数必须是含有this指针的类成员函数,函数调用方式为thiscall,而类中的static函数本质上是全局函数,调用规

C++模板 静态成员 定义(实例化)

问一个问题: 考虑一个模板: template <typename T> class Test{ public: static std::string info; }; 对于下面若干种定义方式.哪些是对的(通过编译)? template <> string Test<int>::info("123"); template <typename T> string Test<T>::info("123"); t

回调函数中调用类中的非静态成员变量或非静态成员函数

有关这方面的问题,首先说一点: 回调函数必须是静态成员函数或者全局函数来实现回调函数,大概原因是普通的C++成员函数都隐含了一个函数参数,即this指针,C++通过传递this指针给成员函数从而实现函数可以访问类的特定对象的数据成员.由于this指针的原因,使得一个普通成员函数作为回调函数时就会因为隐含的this指针问题使得函数参数个数不匹配,从而导致回调函数编译失败. 基于上面的理论,如何在类中封装回调函数呢? 回调函数只能是全局函数或者静态成员函数,但是由于全局函数会破坏封装性,所以只能用静