`

《C++学习笔记》静态数据成员

    博客分类:
  • C++
阅读更多

===============================================
转载时请表明出处:
《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        */
静态数据成员的说明、定义和初始化:
从上例可以看出,在类体内说明静态数据成员后,在对它进行读、写之前,必须在类体之外进行定义,使其初始化。(如不显式地初始化为一定值,则系统自动将其初始化为零值)。
0
0
分享到:
评论

相关推荐

    c++学习笔记.pdf

    静态成员函数没有this指针,只能访问静态成员。静态全局变量只能在定义它的文件内访问,而不能在其他文件中访问。extern关键字用于声明一个全局变量或函数,表示该变量或函数定义在别的地方。 8. C++的编译过程一般...

    c++学习笔记(个人学习时做的笔记)

    【C++学习笔记概述】 C++是一门强大的编程语言,其在C语言的基础上进行了扩展,引入了许多现代化的特性。这份笔记主要涵盖了C++的基础知识,包括C++11和C++17的新特性,旨在帮助初学者理解C++的核心概念。 ### C++...

    C++学习笔记.docx

    C++学习笔记 本文档提供了C++语言的基础知识,包括输入输出、变量、数据类型、运算符、内存管理、指针、流程控制语句等。 输入输出 C++语言提供了多种输入输出方式,包括使用cin和cout对象。cin对象用于从标准...

    达内学生的C++学习笔记

    《达内学生C++学习笔记》是一份专为初学者设计的C++教程,旨在提供清晰易懂、逐步深入的学习路径。这份笔记涵盖了C++语言的基础到进阶内容,是学习C++的理想辅助资料。 首先,C++是一种静态类型的、编译式的、通用...

    Visual C++学习笔记

    ### Visual C++学习笔记知识点详解 #### 1. Win32API详解 Win32API是微软为其32位平台提供的应用程序编程接口(Application Programming Interface),适用于所有基于Win32平台运行的应用程序。通过调用Win32 API中...

    C++学习笔记.chm

    《C++学习笔记》是一部非常实用的资源,适合那些对C++编程语言有着浓厚兴趣或者正在学习C++的初学者。这份笔记详细介绍了C++语言的基础知识、核心概念以及高级特性,旨在帮助读者掌握C++编程的核心技能。 C++是...

    C++学习笔记- 面向对象 .md

    C++学习笔记,博主个人向。内容是C++面对对象的,目录大致来源于菜鸟文档的C++面向对象,笔记是参考各种文章以及菜鸟文档改编的,内容包含C++类和对象(类定义和对象定义,类成员函数,类访问修饰符,友元函数,内联...

    C++学习笔记

    - 主要是在对象之间复制数据成员。 - 需要注意自我赋值的情况,以及资源管理的问题。 #### 4. **new/delete与new[]/delete[]** **new/delete**: - `new` 用于分配单个对象的内存。 - `delete` 用于释放由 `new` ...

    C++学习笔记共19页.pdf.zip

    【标题】"C++学习笔记共19页.pdf.zip" 提供的是一个关于C++编程语言的学习资料,其中包含了19页的详细笔记。这个压缩文件可能是为了方便学习者们下载和阅读,以便深入理解C++的核心概念和技术。 C++是一种强类型、...

    C++学习笔记_C++_

    总结,C++学习笔记涵盖了从基础到高级的各种主题,包括面向对象编程的精髓、模板和标准库的使用、异常处理和命名空间的管理,以及C++11及后续标准的新特性。通过深入理解和实践这些知识点,开发者能够熟练掌握C++,...

    C++学习笔记,易错点

    ### C++学习笔记:易错点详解 #### 关键字`static`的作用 在C++中,`static`关键字有着非常重要的用途,特别是在处理变量和函数的生命周期、可见性以及存储方面。`static`可以用来定义静态变量和静态函数。 #####...

    c++学习笔记源代码

    【C++学习笔记源代码】是一份集合了多个学习阶段的C++编程实践资料,适合初学者和进阶者深入理解和掌握C++语言。这份压缩包包含了一系列的子文件,如uc1.zip、uc3.zip、day15.zip等,分别对应不同的学习单元或课程...

    千锋C++笔记.zip

    《千锋C++笔记》是一份综合性的学习资料,涵盖了C++编程语言的基础到高级概念。这份笔记由知名教育机构“千锋”提供,旨在帮助初学者和有一定基础的程序员深入理解和掌握C++这一强大的系统级编程语言。下面将详细...

    c++学习总结,在学习c++时做的一些笔记

    在深入探讨C++编程语言的学习经验之前,首先要理解C++是一种多范式、面向对象的编程语言,由Bjarne Stroustrup于1983年在C语言的基础上发展而来。它提供了丰富的特性,包括类、模板、异常处理、命名空间、函数重载等...

    《C++学习笔记》.docx

    《C++学习笔记》 C++是一门强大的编程语言,尤其适合初学者入门。这篇学习笔记将探讨几个关键概念,包括`auto`的使用、类的对象和成员、`static`关键字、访问控制(public/protected/private)、对象类型的转化、...

    C++学习笔记.pdf

    【C++学习笔记】 在C++编程语言的学习中,掌握基础知识是至关重要的。这包括命名空间、注释、程序运行过程、输出流控制以及文件的读写操作。命名空间允许我们为标识符创建不同的上下文,防止命名冲突。注释分为序言...

    C和C++学习笔记

    【C和C++学习笔记】是一份集合了C语言与C++编程基础知识的学习资料,适合初学者进行系统学习。这份笔记可能包含了从基础语法到高级特性的详细讲解,旨在帮助初学者理解这两种语言的核心概念。 C语言是计算机科学中...

    c++学习笔记.zip

    4. **类与对象**:面向对象编程是C++的核心特性,类是对象的蓝图,它定义了对象的状态(成员变量)和行为(成员函数)。对象是类的实例,通过构造函数和析构函数进行生命周期管理。 5. **封装**:通过访问修饰符...

    C++学习笔记.doc

    ### C++ 学习笔记知识点总结 #### 一、C++世界地图 - **平台环境**:介绍 C++ 在不同操作系统中的应用情况,主要提到了 Windows、Linux 和嵌入式系统这三个主流领域。 #### 二、C++旅行世界必备物品 - **1. C++...

Global site tag (gtag.js) - Google Analytics