3-C++程序的结构1.2

对象的生存周期

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

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;
}

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

时间: 2024-10-08 10:28:50

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

Java程序基本结构(一)

先来吐槽下,算是空闲时间来继续写博客之旅,记录点点滴滴.说是开始着手写Java系列的文章,可是坑货儿的公司第二天就派我出差了,一搞就一个星期,而且更坑的是出差住的地方竟然是老板在出差地方买的房子,房子装修滴垃圾,而且连热水都没有(因为常年没人在那住),洗澡都是一个问题,最让人受不了的是晚上还要义务的做事,把我自己的时间都给占用(搞到晚上十一点才睡觉),因为老板比较的抠,他和我们(还有一个和我一起出差滴)一起过来滴,是盯着我们啊.fuck,我心里一肚子的火,可是没办法啊,如今常流行说遇到这样的老板

c语言学习之 程序基本结构

一个最基本的C程序由五个部分组成: 头文件 (Preprocessor commands) 函数 (function) 变量 (variable) 语句块 (statement 和 expression) 注释 (comments) 例如: #include <stdio.h> int main(){ /*my first c programming*/ printf("hello,world\n"); return 0; } c语言学习之 程序基本结构,码迷,mamico

一、程序基本结构

#region 导入命名空间 using System; using System.Collections.Generic; using System.Linq; using System.Text; #endregion // 声明命名空间 namespace _1.程序基本结构 {     /// <summary>     /// 声明一个类     /// </summary>     class Program     {         /*           * M

8.15 号 程序 选择结构作业的代码

/* 任意输入三个整数,按从大到小的顺序输出. */ #include <stdio.h> void main() { int num1,num2,num3,tmp; printf("输入任意3个整数:逗号分隔\n"); scanf("%d,%d,%d",&num1,&num2,&num3); if(num1 < num2) { tmp = num1; num1 = num2; num2 = tmp; } if(num1 &

8.15 号 程序 循环结构作业的代码

/*循环结构的演示题*/ #include <stdio.h> void main() { /* int i = 0; while(i < 100) { printf("第%-3d句:I LOVE You!\n",++i); } */ /* int order = 1; while(order != 0) { printf("I Love You!\n"); printf("还要我说一遍吗?(输入0结束)"); scanf(&q

可运行程序的结构

可运行程序的结构: 1.首先, 我们知道编程就是在写数据和处理数据的逻辑 2.一个应用程序编译以后, 得到可运行文件,这个文件就分为: 代码区, 常量区双击这个程序, 在宿主系统上会有一个应用程序载入器的软件.该程序会载入应用程序到内存中.载入内存中的时候, 程序中的全局变量, 常量等数据就開始载入. 3.内存划分为: 代码区(段), 常量区(段), BSS段, 堆区, 栈区 4.代码区存储的是代码相应的机器指令 5.常量区存储的是程序中全部的常量 6.BSS段, 用来存储全局的变量的值 7.堆

seci-log 1.13 发布 简化了安装和程序底层结构做了调整

日志分析软件 seci-log 1.13发布,简化了安装和程序底层结构做了调整.上篇文章1.12,有兴趣可以了解一下.本次升级合并了linux和windows版本.这两个版本都为绿色版本(需要提前安装java 1.7版本),放到任意目录下都可以,如果正式使用建议放到磁盘空间大的磁盘中. 本次升级简化了安装,只依赖java 1.7,日志数据只存储到es中,去掉了mysql数据库,这样就不用安装mysql了,同时得到另外的一个有优势数据占用空间减少了一半多,因为同样一条记录,mysql存储空间要大于

黑马程序员------C 语言学习笔记---程序基本结构

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 第二  程序基本结构 一 分支结构 01 单分支结构 格式: if(表达式) { 语句: } 其中,“表达式”为判断条件,只要表达式的值不为0,就认为条件成立. 02 双分支结构 格式: if(表达式) 语句1: else 语句

c++程序流程结构(顺序、选择、循环)break、continue

程序流程结构分类 从上到下就是顺序结构 选择结构 if语句.if-else语句(三目运算符 a>b?a:b).if -else if-else语句. switch语句 int main() { int a = 10; switch (a) { case 1: cout << "111"; break; case 2: cout << "222"; break; case 3: cout << "333";

Golang学习笔记(1)---go程序一般结构

Go程序是通过 package来组织的(与python的库类似) 只有package名称为main的包可以包涵main函数(同时main函数也是一个程序的入口) 一个可执行程序有且仅有一个main包 通过import关键字来引入其他非main包 通过const关键字来进行常量的定义 通过在函数体外部使用var关键字来进行全局变量的声明与赋值 通过type关键字来进行结构(struct)或接口(interface)的声明----一般(自定义)类型 通过func关键字来进行函数的声明 一般格式为: