对象的生存周期

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

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. PA-RISC

    http://baike.baidu.com/view/167703.htm PA-RISC处理器 编辑   HP(惠普)公司的RISC芯片PA-RISC于1986年问世. 第一款芯片的型号为PA-8 ...

  2. 《好好说话》zz

    最近,<奇葩说>闹出来了一些不愉快. 在半决赛中,姜思达惜败,愤怒的粉丝把矛头指向那场比赛的其他人.最终,马薇薇.黄执中和网友们吵起来了. 这件事本不算大事,毕竟娱乐业就是这个样子.刚刚好 ...

  3. Android下强制显示ActionBar的overflowbutton

    因为手机硬件情况的不同,在没有物理Menu键的手机上.ActionBar的overflowbutton会有显示不出来的情况,能够通过反射的方式改动ViewConfiguration类中的sHasPer ...

  4. Java解析Property文件

    在Java项目中一些配置參数保存在Property文件里,这样能保证不改动原代码直接改动Property文件. PropertyParser.java package com.discover.par ...

  5. Java Base64加密、解密原理Java代码(转载)

    博客来源:http://blog.csdn.net/songylwq/article/details/7578905 Base64是什么: Base64是网络上最常见的用于传输8Bit字节代码的编码方 ...

  6. 为自己编写的windows应用程序制作安装包

    1 写好了一个windows程序之后如何制作安装包 这个在vs中就可以直接发布了,可以制作msi的安装包和exe的安装包. 2 window应用程序安装包做了哪些事情 rpm安装包的话,只是把相应的文 ...

  7. arm处理器的历史及现状

    1 arm处理器的发展历史 arm1 arm2 arm3 arm6 arm7 arm9 arm11 arm cortex 2 arm处理器现状 arm cortex A a即application,即 ...

  8. 使用注解来构造IoC容器-转

    新手,对于一些觉得有用的东西,直接转过来用了,自己理解的比较肤浅 使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<co ...

  9. UI 自动化测试工具BackstopJS简介(1)

    BackstopJS源码地址 https://github.com/garris/BackstopJS 我写了一个DEMO放到github上面,https://github.com/shenggen1 ...

  10. github多用户提交错误Permission to repo denied to

    背景:同一台电脑的public key同时添加到了github的两个账户,导致user1的仓库没法正常提交. 解决办法:为两个账户分别配置ssh key,配置~/.ssh/config文件(windo ...