《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,将使该函数独立于本类的任何具体对象。从静态函数内部引用类成员,必须使用限定名进行(就像使用普通全局函数访问公有数据成员那样)。
静态成员函数的优点是:即使本类的任何对象都不存在,它们也能存在并被调用。这种情况下,静态成员函数只能使用静态数据成员,因为后者是唯一存在的数据成员。因此,即使不能肯定是否有类对象存在,也可以调用类的静态函数成员来检查静态数据成员。这样,即可使用静态成员函数来确定是否已经创建本类的对象,或者实际创建的数量。
- 《Visual C++ 2010入门经典》(第五版)-第七章 自定义数据类型
- 《Visual C++ 2010入门经典》(第五版)-第五章 程序结构1 5.3函数中的静态变量
- visual c++ 2012入门经典 练习(第五章)
- 学习c++(c+primer第五版第七章)
- Visual Basic 2008入门经典(第五版)(奋斗的小鸟)_PDF 电子书
- 第七章笔记——C++primary(第五版)
- c++primer第五版第七章练习
- 算法入门经典(第七章)
- 第七章用户自定义数据类型
- C#入门经典(第4版)第五章习题
- C#入门经典(第五版)
- C#入门经典第七章
- XML入门经典(第五版)
- C#入门经典第五章
- C++学习笔记(第七章 自定义数据类型 枚举 之一)
- C++Primer第五版【笔记】——第七章 类
- C primer plus(第五版)编程练习第七章
- c++.primer.plus第五版第七章编程练习答案
- HDU 2444 The Accomodation of Students【二分图染色+匹配*好题】
- 1188计算工资
- 用Allegro导出DXF/DWG格式文件
- mathtype小窍门
- 方法传入参数(来自成员变量),在方法中修改参数,退出方法后,是否会改变参数值呢?
- 《Visual C++ 2010入门经典》(第五版)-第七章 自定义数据类型
- 浅析Python中的struct模块
- SSP P2821 I Like Matrix!
- pageScope、requestScope、sessionScope、applicationScope的区别
- tinyxml使用笔记
- 微信小程序ajax请求分页加载数据
- 创业和创业团队的感想感悟
- 开博随笔
- android手把手教你开发launcher(二)——列出安装的应用程序