一、整体代码
CountedObject.h
#ifndef _COUNTED_OBJECT_H_
#define _COUNTED_OBJECT_H_
class CountedObject
{
public:
CountedObject();
~CountedObject();
public:
static int GetCount();
private:
static int count_; // 静态成员的引用性声明
};
#endif // _COUNTED_OBJECT_H_
CountedObject.cpp
#include "CountedObject.h"
int CountedObject::count_ = 0; // 静态成员的定义性声明
CountedObject::CountedObject()
{
++count_;
}
CountedObject::~CountedObject()
{
--count_;
}
int CountedObject::GetCount()
{
return count_;
}
01.cpp
#include "CountedObject.h"
#include <iostream>
using namespace std;
int main(void)
{
//cout<<CountedObject::count_<<endl;
cout<<CountedObject::GetCount()<<endl;
CountedObject co1;
//cout<<CountedObject::count_<<endl;
cout<<CountedObject::GetCount()<<endl;
CountedObject* co2 = new CountedObject;
//cout<<CountedObject::count_<<endl;
cout<<CountedObject::GetCount()<<endl;
delete co2;
//cout<<CountedObject::count_<<endl;
cout<<CountedObject::GetCount()<<endl;
}
other.cpp
#include <iostream>
using namespace std;
class Test
{
public:
Test(int y) : y_(y)
{
}
~Test()
{
}
void TestFun()
{
cout<<"x="<<x_<<endl; //OK,非静态成员函数可以访问静态成员
TestStaticFun();
}
static void TestStaticFun()
{
cout<<"TestStaticFun ..."<<endl;
//TestFun(); Error,静态成员函数不能调用非静态成员函数
//cout<<"y="<<y_<<endl; Error,静态成员函数不能访问非静态成员
}
static int x_; // 静态成员的引用性说明
int y_;
};
int Test::x_ = 100; // 静态成员的定义性说明
int main(void)
{
cout<<sizeof(Test)<<endl;
}
二、运行结果
0 1 2 1
4(int占4个字节)
三、解释
1、静态变量被所有对象共享,没有对象时候就有静态的变量和方法。所以静态的函数不能调用非静态的变量和方法。反之,可以。
2、先有静态成员的引用性声明,但不能赋值。然后在静态成员的定义性声明中赋值。
3、static const int可以只在引用性声明中赋值。
4、类大小计算遵循前面学过的结构体对齐原则
类的大小与数据成员有关
与成员函数无关
类的大小与静态数据成员无关
虚函数对类的大小的影响
虚继承对类的大小的影响
空类长度为1