对象的生存周期

可以分为静态生存周期和动态生存周期

1、静态生存周期

如果对象的生存期与程序的运行期相同,我们称它具有静态生存期。在文件作用域中声明的对象都具有静态生存期的。如果要在函数的块中声明具有静态生存期的对象,则要使用关键字static。

2、动态生存期

除了上述两种情况,其余的对象都具有动态生存期。动态生存期对象诞生于声明点,结束于该标示符作用域结束处。

类的静态成员

在结构化的程序设计中程序模块的基本单位是函数,那么模块间对内存中数据的共享是通过函数与函数之间的数据共享来实现的,包括参数传递和全局变量。

静态成员是解决同一个类的不同对象之间数据和函数共享问题的。如,把某公司的全体雇员抽象如下,

class employee

{

  private:

    int EmpNo;

    int ID;

    char *name;

    //...

}

这时,如果需要统计全体员工的总数,该怎么处理呢,如果直接加上一个变量到类里面,势必会造成每个对象都会包含此变量,而且容易造成不一致,比较理想的方案是类的所有对象共同拥有一个用于存放总数的数据成员,这就是需要借助静态数据成员。

1、静态数据成员

我们说“一个类的所有对象具有相同的属性”,是指属性的个数、名称、数据类型相同,各个对象的属性值则可以不相同,这样的属性在面向对象方法中称为“实例属性”。在c++程序中以类的非静态数据成员表示。

面向对象方法中还有“类属性”的概念。如果某个属性为整个类所共有,不属于任何一个具体对象,则采用static关键字来声明静态成员。静态成员在每一个类只有一个拷贝,由该类的所有对象共同维护和使用,从而实现了同一类的不同对象之间的数据共享。类属性是描述类的所有对象共同特征的一个数据项,对于任何对象实例,它的属性是相同的。

静态数据成员具有静态生存周期。它只能通过类名进行访问,一般的用法是“类名::标识符”。在类的定义中仅仅对静态数据成员进行声明,必须在文件作用域的某个地方使用类名限定对静态数据成员进行定义,这时也可以进行初始化。

2、静态函数成员

所谓静态成员函数就是使用static关键字声明的函数成员,同静态数据成员一样,静态成员函数页属于整个类,由同一个类的所有对象共同拥有,为这些对象所共享。

作为成员函数,它的访问属性可以受到类的严格控制,对于公有的静态成员函数,可以通过类名或对象名来调用,而一般的非静态成员函数只能通过对象名来调用。

静态成员函数可以直接访问类的静态数据和函数成员。而访问非静态数据成员必须通过参数传递方式得到对象名,然后通过对象名来访问。如,

class A

{

  public:

    static void f(A a);

  private:

    int x;

};

void A::f(A a)

{

  cout<<x;//对x的引用时错误的

  cout<<a.x;//正确

}

可以看到,通过静态函数成员访问非静态成员是相当麻烦的,一般情况下,它主要用来访问同一类中的静态数据成员,维护对象之间共享的数据。

#include<iostream>
using namespace std;
class Point //Point类定义
{
public:
Point(int xx=0,int yy=0){X=xx;Y=yy;countP++;} //构造函数
Point(Point &p); //拷贝构造函数
~Point(){countP--;}
int GetX(){return X;}
int GetY(){return Y;}
static void GetC(){cout<<"Object id="<<countP<<endl;}

private:
int X,Y;
static int countP;

};
Point::Point(Point &p)
{
X=p.X;
Y=p.Y;
countP++;
}
int Point::countP=0; //静态数据成员定义及初始化,初始化使用类名限定
int main()
{
Point A(4,5);
cout<<"Point A,"<<A.GetX()<<","<<A.GetY();
A.GetC();
Point B(A);
cout<<"Point B,"<<B.GetX()<<","<<B.GetY();
Point::GetC();
return 0;
}

使用静态数据成员时还应该注意:如果要通过非静态函数来访问静态数据成员,应该使用非内联函数,而且访问静态数据成员的函数,其函数体的定义应该与静态成员额初始化写在同一个文件中。

3-C++程序的结构1.2的更多相关文章

  1. ELF Format 笔记(十一)—— 程序头结构

    ilocker:关注 Android 安全(新手) QQ: 2597294287 程序头表 (program header table) 是一个结构体数组,数组中的每个结构体元素是一个程序头 (pro ...

  2. 黑马程序员——JAVA基础之程序控制流结构之判断结构,选择结构

    ------- android培训.java培训.期待与您交流! ---------- 程序控制流结构:顺序结构:判断结构:选择结构:循环结构. 判断结构:条件表达式无论写成什么样子,只看最终的结构是 ...

  3. Delphi XE5教程5:程序的结构和语法

    内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者 ...

  4. 【Xamarin挖墙脚系列:Xamarin.IOS的程序的结构】

    原文:[Xamarin挖墙脚系列:Xamarin.IOS的程序的结构] 开始熟悉Xamarin在开发IOS的结构!!!!!!! 先看官方 这个是以一个单页面的程序进行讲述的. 1 程序引用的程序集,核 ...

  5. 【Xamarin挖墙脚系列:典型的业务程序的结构搭建】

    原文:[Xamarin挖墙脚系列:典型的业务程序的结构搭建] 其实app就是客户端.在现代的程序中,都是典型的C/S结构.当然,一些离线的小游戏,功能性应用除外,如:电话本,通信录,短信查看等等 这个 ...

  6. 微信小程序开发01 --- 微信小程序项目结构介绍

    一.微信小程序简单介绍: 微信官方介绍微信小程序是一个不需要下载安装就可使用(呵呵,JS代码不用下载吗?展示的UI不用下载吗?)的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用. ...

  7. 毕业设计预习:VHDL入门知识学习(一) VHDL程序基本结构

    VHDL入门知识学习(一) VHDL程序基本结构 简介 VHDL程序基本结构 简介 概念: HDL-Hardware Description Language-硬件描述语言-描述硬件电路的功能.信号连 ...

  8. Java程序的结构和执行

    目录 Java程序的结构 Java程序的执行 source code -- compiler -- class file -- JVM compiler JVM Java语法 数据类型 数据的存储 堆 ...

  9. Android应用程序项目结构

    Android应用程序项目结构 [src]:JAVA源代码目录 [gen]:由系统自动生成的JAVA源码文件,不可修改,只可查看和使用 加载的和依赖的类库 [assets]:本地存储文件的一个文件夹 ...

  10. C语言基础知识-程序流程结构

    C语言基础知识-程序流程结构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.概述 C语言支持最基本的三种程序运行结构:顺序结构,选择结构,循环结构. 顺序结构:程序按顺序执行, ...

随机推荐

  1. 【每日Scrum】第七天(4.28)Sprint2总结性会议

    本次会议主要是演示了一下本组项目的各项功能,每个人负责那一块儿功能由本人来负责说明和演示,确定alpha版本的发布时间,并且分派了各组员的文档负责情况,上图是会议记录,下面我详细介绍一下我组分派情况: ...

  2. PCIE、UART、I2C、SMBUS、SPI、eSPI、USB、PS2、CAN、SDIO等数据传输协议

    M.2 wife一般支持USB.SDIO.PCIE三种传输

  3. SQL查询刚開始学习的人指南读书笔记(三)值表达式

    CHAPTER 5 Getting More Than Simple Columns Intro Value  expression,it contains column names, literal ...

  4. javaScript和jQuery自动加载方法

    一.JavaScript自动加载 ①在文本中用onload: 当页面中所有内容(包括图片)加载完后再执行onload,如下: <body onload="alert(1)"& ...

  5. return和exit的差别

    #include<stdio.h> #include<sys/types.h> #include<sys/wait.h> #include<unistd.h& ...

  6. 有趣的Ruby-学习笔记3

    Ruby方法 方法名要以小写字母开头.假设用大写字母开头会被作为常量 (这点非常奇怪) 定义一个无參的方法 def method_name expr.. end 定义一个有參的方法 def metho ...

  7. [工具]利用EasyRTSPClient工具检查摄像机RTSP流不能播放原因以及排查音视频数据无法播放问题

    出现问题 我们在做流媒体开发的过程中,进程会出现摄像机RTSP流莫名其妙无法播放的问题,而我们常用的vlc经常是直接弹出一个无法播放的提示框就完事了,没有说明出错的原因,或者在vlc的消息里面能看到日 ...

  8. EasyDarwin流媒体服务器实现关键帧推送功能

    -本篇由团队成员Fantasy供稿! 功能背景 随着社会进步,人们对产品体验要求越来越高.EasyDarwin也不例外.为了能满足用户对链接服 后看到画面时间(也就是我们经常看到的起播时间)短的要求, ...

  9. appium(10)-iOS predictate

    iOS predictate It is worth looking at ’-ios uiautomation’ search strategy with Predicates. UIAutomat ...

  10. SPOJ7258

    传送门 这题可以参考平衡树求第k大的过程,需要预处理一下从当前节点往下走能走出多少个子串. 原本准备存个图用反向的topsort,发现极为麻烦,看了别人的代码后发现,他们按step大小用了基排,省了很 ...