===============================================
转载时请表明出处:
《C++学习笔记》静态数据成员
http://www.cofftech.com/thread-1403-1-1.html
欢迎大家跟帖讨论哈~~~~~
===============================================
各函数之间数据共享的一种方法是使用全局变量。但按照软件工程的观点,这不安全,应尽量少用。
如果只在同一类的多个对象之间实现数据共享,则可使用该类的静态数据成员,即由同一类的各对象共享该类的静态数据成员。这样的做法可避免使用全局变量所带来的危险。
类的静态成员分为静态数据成员和静态成员函数两种。在编译过程中,在给出类定义后,即使该类没有建立任何对象,其静态数据成员也已经存在,并被分配在数据区内。这是与非静态数据成员的一个不同点。
静态数据成员属于一个类而不属于该类的任何对象,它由该类中的所有对象所共享。静态数据成员的生命周期是整个程序,而其作用域是它被定义时所在的类的所有对象。
既然静态数据成员是一个类中所有对象所共享的,因此它不存放在栈区内各对象的各内存栈区空间中,而是存放在数据区内。同时它只有一份。这个类的任何对象都能访问它、将它更新。何以见得?且看以下各例。
先看各种成员的地址。
[例1]读取非静态数据、静态数据和主程序的地址
#include <iostream.h>
class base
{
public:
int i;
static int s;
};
int base::s = 23; // this should not be omitted,
// otherwise there will be error LNK2001:
// unresolved external symbol "public: static int base::s"
void main()
{
base bb;
cout<<"static member bb.s="<<bb.s<<endl;
cout<<"address of static member bb.s="<<&bb.s<<endl;
cout<<"address of non-static member bb.i="<<&bb.i<<endl;
cout<<"code address of main( )="<<main<<endl; //or &main
}
/* Results:
static member bb.s=23
address of static member bb.s=0x00428D64
address of non-static member bb.i=0x0012FF7C
code address of main( )=0x00401023
*/
[例2]四个对象共享一个静态数据
#include <iostream.h>
class counter
{
static int count; //用于表示已建立的对象数目
int objnum; //用于表示对象序号
public:
counter ( )
{ count++; //每建立一个对象就加一
objnum = count; //为当前对象序号赋值
}
void show( )
{ cout<<"obj"<<objnum<<" created"<<endl;
cout<<"totally "<<count<<" object(s)"<<endl;
}
};
int counter::count; //自动初始化为零
// this should not be omitted,
// otherwise there will be error LNK2001:
// unresolved external symbol "public: static int counter::count"
void main()
{
counter obj1;
obj1.show( );
counter obj2;
obj2.show( );
counter obj3;
obj3.show( );
counter obj4;
obj4.show( );
}
/* Results:
obj1 created
totally 1 object(s)
obj2 created
totally 2 object(s)
obj3 created
totally 3 object(s)
obj4 created
totally 4 object(s)
*/
[例3]以上例2也可用另一种形式表达,使用指针调用运算符new,如下:
#include <iostream.h>
class counter
{
static int count; //用于表示已建立的对象数
int objnum; //用于表示对象序号
public:
counter ( )
{ count++; //每建立一个对象就加一
objnum = count; //为当前对象序号赋值
}
void show( )
{ cout<<"obj"<<objnum<<" created"<<endl;
cout<<"totally "<<count<<" object(s)"<<endl;
}
};
int counter::count; // this should not be omitted,
// otherwise there will be error LNK2001:
// unresolved external symbol "public: static int counter::count"
void main()
{
counter *ptr1 = new counter;
ptr1->show( );
counter *ptr2 = new counter;
ptr2->show( );
delete ptr1;
delete ptr2;
}
/* Results:
obj1 created
totally 1 object(s)
obj2 created
totally 2 object(s)
*/
[例4]同一类的两个对象共享静态数据成员
#include <iostream.h>
class Myclass
{
int x, y;
static int Sum;
public:
Myclass (int a, int b);
int GetSum ( );
};
int Myclass::Sum; // Type name "int" must be used.
// Objects not created yet.
// If this datum is to be used, this statememt should not be omitted,
// or there will be fatal linking error:
// unresolved external symbol "private: static int
// Myclass::Sum"
Myclass::Myclass(int a, int b)
{
cout<<(x = a)<<";"<<(y = b)<<endl;
Sum += x+y; //Sum = Sum + x + y;
}
int Myclass::GetSum( )
{
return Sum;
}
void main()
{
Myclass obj1(1,5);
cout<<"sum="<<obj1.GetSum( )<<endl;
Myclass obj2(3,6);
cout<<"sum="<<obj2.GetSum( )<<endl;
}
/* Results:
1;5
sum=6
3;6
sum=15 */
静态数据成员的说明、定义和初始化:
从上例可以看出,在类体内说明静态数据成员后,在对它进行读、写之前,必须在类体之外进行定义,使其初始化。(如不显式地初始化为一定值,则系统自动将其初始化为零值)。
发表评论
-
C++主流预处理,编译和链接过程
2011-09-11 13:26 10587在C++的程序的编写过程 ... -
c++ 一个简单的链表
2011-09-11 13:13 99541 #include <stdio.h> 2 # ... -
【2011.8.2】<C++学习笔记>预处理功能
2011-08-03 12:18 1491预处理功能介绍 ... -
C++经典电子资料下载合集
2011-07-11 11:43 36491.C++ 逆向工程 pdf高清下 ... -
《C++学习笔记》不同数据类型对象的构造函数和析构函数的调用顺序
2011-05-19 01:34 1348=============================== ... -
《C++学习笔记》子对象构造函数和析构函数的调用顺序
2011-05-19 01:34 1509=============================== ... -
《C++学习笔记》子对象的初始化
2011-05-19 01:33 1729=============================== ... -
《C++学习笔记》特定类型数据成员的初始化
2011-05-17 10:56 1289========== ... -
《C++学习笔记》析构函数(destructor)
2011-05-17 10:55 1143=============================== ... -
《C++学习笔记》对象间非静态数据成员的复制
2011-05-16 12:04 1006=============================== ... -
《C++学习笔记》带缺省参数的构造函数(constructor with default arguments)
2011-05-16 12:03 2694=============================== ... -
《C++学习笔记》构造函数及特点
2011-05-16 12:02 1303========== ... -
《C++学习笔记》【封装性】类的接口部分与实现部分的分离
2011-05-16 11:41 1625========== ... -
《C++学习笔记》【封装性】对象及其内存存储内容
2011-05-16 11:40 831========== ... -
《C++学习笔记》【封装性】成员函数的说明和定义
2011-05-16 11:37 948成员函数可在类体之内、也可在类体之外被定义。规范的做法是将成员 ... -
《C++学习笔记》【封装】封装性
2011-05-16 11:35 711以下程序依靠封装,能 ...
相关推荐
静态成员函数没有this指针,只能访问静态成员。静态全局变量只能在定义它的文件内访问,而不能在其他文件中访问。extern关键字用于声明一个全局变量或函数,表示该变量或函数定义在别的地方。 8. C++的编译过程一般...
【C++学习笔记概述】 C++是一门强大的编程语言,其在C语言的基础上进行了扩展,引入了许多现代化的特性。这份笔记主要涵盖了C++的基础知识,包括C++11和C++17的新特性,旨在帮助初学者理解C++的核心概念。 ### C++...
C++学习笔记 本文档提供了C++语言的基础知识,包括输入输出、变量、数据类型、运算符、内存管理、指针、流程控制语句等。 输入输出 C++语言提供了多种输入输出方式,包括使用cin和cout对象。cin对象用于从标准...
《达内学生C++学习笔记》是一份专为初学者设计的C++教程,旨在提供清晰易懂、逐步深入的学习路径。这份笔记涵盖了C++语言的基础到进阶内容,是学习C++的理想辅助资料。 首先,C++是一种静态类型的、编译式的、通用...
### Visual C++学习笔记知识点详解 #### 1. Win32API详解 Win32API是微软为其32位平台提供的应用程序编程接口(Application Programming Interface),适用于所有基于Win32平台运行的应用程序。通过调用Win32 API中...
《C++学习笔记》是一部非常实用的资源,适合那些对C++编程语言有着浓厚兴趣或者正在学习C++的初学者。这份笔记详细介绍了C++语言的基础知识、核心概念以及高级特性,旨在帮助读者掌握C++编程的核心技能。 C++是...
C++学习笔记,博主个人向。内容是C++面对对象的,目录大致来源于菜鸟文档的C++面向对象,笔记是参考各种文章以及菜鸟文档改编的,内容包含C++类和对象(类定义和对象定义,类成员函数,类访问修饰符,友元函数,内联...
- 主要是在对象之间复制数据成员。 - 需要注意自我赋值的情况,以及资源管理的问题。 #### 4. **new/delete与new[]/delete[]** **new/delete**: - `new` 用于分配单个对象的内存。 - `delete` 用于释放由 `new` ...
【标题】"C++学习笔记共19页.pdf.zip" 提供的是一个关于C++编程语言的学习资料,其中包含了19页的详细笔记。这个压缩文件可能是为了方便学习者们下载和阅读,以便深入理解C++的核心概念和技术。 C++是一种强类型、...
总结,C++学习笔记涵盖了从基础到高级的各种主题,包括面向对象编程的精髓、模板和标准库的使用、异常处理和命名空间的管理,以及C++11及后续标准的新特性。通过深入理解和实践这些知识点,开发者能够熟练掌握C++,...
### C++学习笔记:易错点详解 #### 关键字`static`的作用 在C++中,`static`关键字有着非常重要的用途,特别是在处理变量和函数的生命周期、可见性以及存储方面。`static`可以用来定义静态变量和静态函数。 #####...
【C++学习笔记源代码】是一份集合了多个学习阶段的C++编程实践资料,适合初学者和进阶者深入理解和掌握C++语言。这份压缩包包含了一系列的子文件,如uc1.zip、uc3.zip、day15.zip等,分别对应不同的学习单元或课程...
《千锋C++笔记》是一份综合性的学习资料,涵盖了C++编程语言的基础到高级概念。这份笔记由知名教育机构“千锋”提供,旨在帮助初学者和有一定基础的程序员深入理解和掌握C++这一强大的系统级编程语言。下面将详细...
在深入探讨C++编程语言的学习经验之前,首先要理解C++是一种多范式、面向对象的编程语言,由Bjarne Stroustrup于1983年在C语言的基础上发展而来。它提供了丰富的特性,包括类、模板、异常处理、命名空间、函数重载等...
《C++学习笔记》 C++是一门强大的编程语言,尤其适合初学者入门。这篇学习笔记将探讨几个关键概念,包括`auto`的使用、类的对象和成员、`static`关键字、访问控制(public/protected/private)、对象类型的转化、...
【C++学习笔记】 在C++编程语言的学习中,掌握基础知识是至关重要的。这包括命名空间、注释、程序运行过程、输出流控制以及文件的读写操作。命名空间允许我们为标识符创建不同的上下文,防止命名冲突。注释分为序言...
【C和C++学习笔记】是一份集合了C语言与C++编程基础知识的学习资料,适合初学者进行系统学习。这份笔记可能包含了从基础语法到高级特性的详细讲解,旨在帮助初学者理解这两种语言的核心概念。 C语言是计算机科学中...
4. **类与对象**:面向对象编程是C++的核心特性,类是对象的蓝图,它定义了对象的状态(成员变量)和行为(成员函数)。对象是类的实例,通过构造函数和析构函数进行生命周期管理。 5. **封装**:通过访问修饰符...
### C++ 学习笔记知识点总结 #### 一、C++世界地图 - **平台环境**:介绍 C++ 在不同操作系统中的应用情况,主要提到了 Windows、Linux 和嵌入式系统这三个主流领域。 #### 二、C++旅行世界必备物品 - **1. C++...