《Visual C++ 2010入门经典》(第五版)-第七章 自定义数据类型

来源:互联网 发布:八字不合怎么办知乎 编辑:程序博客网 时间:2024/06/06 20:11

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

主要原因是为了取代全局变量,让类的所有对象共享数据


7.9类的静态成员

7.9.1 类的静态数据成员

当将类的某个数据成员声明 为static时,将只能定义一次静态数据成员,而且要被同类的所有对象所共享。各个对象都拥有类中每一个普通成员变量的副本,但每个静态数据成员只有一个实例存在,与定义了多少类对象无关。


class CBox

{

public:

    CBox();

     ~CBox();

     static int objectCount;


private:

      double length;

       double width;

       double height;

}


静态数据成员的用途之一是统计实际存在多少个对象;

不能在类定义中初始化静态数据成员,类定义只是描述对象的蓝图,不允许在其中指定初始值。我们也不想在构造函数中初始化该成员,因为我们的意图是每当调用构造函数时候就使其递增,以便累计已创建的对象数量。

不能在另一个成员函数中初始化,因为成员函数与对象相关,我们希望在创建任何对象之前初始化该成员。答案是用下面这条语句,在类定义外面进行静态数据尘缘的初始化:

int CBox::objectCount=0;

注意:

这里没有static关键字,不过,确实需要使用类名和作用域解析运算符来限定成员名,以使编译器理解我们在引用类的静态成员。不然,编译器以为我们只是在创建一个与类毫不相干的全局变量而已。

实际编程出的问题分析:

1.创建一个控制台的空项目;

2.创建一个类CBox,文件对应Box.cpp和Box.h

Box.h内容如下:

#pragma once


class CBox
{
public:
static int objectCount;
CBox(void)
{
objectCount++;
}
~CBox(void);






private:
int a;
int b;
int c;




};

int CBox::objectCount = 0;// 类的静态数据成员变量初始化


Box.cpp内容如下:

CBox::~CBox(void)
{
}


main.cpp文件内容如下:



#include "iostream"
#include "Box.h"
int main()
{
CBox temp;
int iCount = temp.objectCount;
std::cout<<iCount;


  return 0;
}


程序编译出错,提示如下:

1>main.obj : error LNK2005: "public: static int CBox::objectCount" (?objectCount@CBox@@2HA) 已经在 Box.obj 中定义
1>C:\Users\a\Desktop\testCountObject\Debug\testCountObject.exe : fatal error LNK1169: 找到一个或多个多重定义的符号


原因:类的静态数据成员在类内声明以后,需要立即在类外进行初始化;mail.cpp中包含了#include "Box.h",本身Box.h中也包含了

int CBox::objectCount = 0;,结果导致obj里面重复定义,解决办法:将静态成员变量的初始化放到.cpp文件中



7.9.2类的静态函数成员


通过将某个函数成员声明为static,将使该函数独立于本类的任何具体对象。从静态函数内部引用类成员,必须使用限定名进行(就像使用普通全局函数访问公有数据成员那样)。

静态成员函数的优点是:即使本类的任何对象都不存在,它们也能存在并被调用。这种情况下,静态成员函数只能使用静态数据成员,因为后者是唯一存在的数据成员。因此,即使不能肯定是否有类对象存在,也可以调用类的静态函数成员来检查静态数据成员。这样,即可使用静态成员函数来确定是否已经创建本类的对象,或者实际创建的数量。





阅读全文
0 0
原创粉丝点击