关于静态数据成员的简单却容易出错的小程序

 1 #include "iostream"
 2 using namespace std;
 3 class complex   //声明complex类
 4 {
 5 public:
 6     complex();
 7     void  display();
 8 private:
 9     static int r; //声明数据成员r是静态的
10     static int i;
11 };
12 int complex::r=0; //为静态数据成员r赋初始值
13 int complex::i=1;
14 complex::complex( )
15 {
16     r++;
17     i++;
18     cout<<"from constructure: r="<<r<<"  i="<<i<<endl;
19 }
20 void complex::display( )
21 {
22     cout<<"from display: r="<<r<<"  i="<<i<<endl;
23 }
24 int main()
25 {
26     complex *p[3];  //声明一个指针数组,该数组中含有3个指向complex类对象的指针。
27     complex b[3];
28     for(int i=0;i<3;i++)
29     {
30       p[i]=&b[i];
31       p[i]->display();
32     }
33 return 0;
34 }

运行结果:

from constructure: r=1 i=2
from constructure: r=2 i=3
from constructure: r=3 i=4

from display: r=3 i=4
from display: r=3 i=4
from display: r=3 i=4
Press any key to continue................

简单来看这个小程序,超级简单无比。直接看到运行结果的话,也觉得顺理成章,不存在任何问题。

对于静态数据成员,类的所有对象共用相同的存储区,即整个类的所有对象共享静态数据成员。

可是,为什么很多同学还是信心十足地喊出如下运行结果:

from constructure: r=1 i=2
from constructure: r=2 i=3
from constructure: r=3 i=4

from display: r=1 i=2
from display: r=2 i=3
from display: r=3 i=4
Press any key to continue................

此外,从运行结果还可以看出如下结论:

(1)第26行在声明对象指针时并没有创建对象,因此也就谈不上去调用构造函数;

(2)第26行并不是简单的声明对象,而是创建了对象,所以调用了构造函数才有"from constructure"内容的输出。

时间: 2024-10-12 17:10:07

关于静态数据成员的简单却容易出错的小程序的相关文章

转:C语言中的static变量和C++静态数据成员(static member)

转自:C语言中的static变量和C++静态数据成员(static member) C语言中static的变量:1).static局部变量        a.静态局部变量在函数内定义,生存期为整个程序运行期间,但作用域与自动变量相同,只能在定义该变量的函数内使用.退出该函数后, 尽管该变量还继续存在,但不能使用它.        b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值.而对自动变量不赋初值,则其值是不定的.2).static全局变量        全局变量本身就是静

Cocos2d-x 3.1.1 学习日志3--C++ 初始化类的常量数据成员、静态数据成员、常量静态数据成员

有关const成员.static成员.const static成员的初始化: 1.const成员:只能在构造函数后的初始化列表中初始化 2.static成员:初始化在类外,且不加static修饰 3.const static成员:类只有唯一一份拷贝,且数值不能改变.因此,可以在类中声明处初始化,也可以像static在类外初始化 #include <iostream> using std::cout; using std::endl; class base { public: base(int

C++类中常量数据成员和静态数据成员初始化

常量数据成员初始化原则: 在每一个构造函数的初始化列表中初始化 静态数据成员初始化原则: 类内声明,类外初始化(因为它是属于类的,不能每构造一个对象就初始化一次) // test_max.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include <iostream> #include <vector> using namespace std; class A { public: A(int i):a(0) {} A():

c++:静态数据成员

一 . 静态数据成员 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员.和其它数据成员一样,静态数据成员也遵守public/protected/private访问规则.同时,静态成员还具有以下特点: 1. 静态数据成员的定义. 静态数据成员实际上是类域中的全局变量.所以,静态数据成员的定义不应该被放在头文件中.静态数据成员初始化时不受private和protected访问限制. 注意:不要试图在头文件中定义静态数据成员.在大多数情况下,这样做会引起重复定义这样

静态数据成员与静态成员函数

静态属性不是类中每个对象拥有的,而是共有的.由于静态成员逃离了对象而存在的性质,所以该实体应该在所有对象产生之前产生,更适合的时机是在程序启动的时候做初始化.初始化时候不可重复上static,但是要加上类名空间.该实体在程序中的唯一性,要求他不可以和类的定义放在头文件中,但是它确实是类的成员,所以放在类实现中最合适.如下: //--------------------Student.h ---类定义的文件 class Student{ private: static int num; } //-

C++静态成员函数和静态数据成员

当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享.各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关.静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关. 静态数据成员的用途之一是统计有多少个对象实际存在. 静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的.也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建一

static静态数据成员

类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员.和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则.同时,静态数据成员还具有以下特点: 1.C++静态数据成员的定义. 静态数据成员实际上是类域中的全局变量.所以,静态数据成员的定义(初始化)不应该被放在头文件中. 其定义方式与全局变量相同.举例如下: xxx.h文件 1. class base{      2. private:      3. static con

指针指向类的静态数据成员

1. 代码 1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 class Point 5 { 6 public: 7 Point(int x=0,int y=0):x(x),y(y) 8 { 9 count++; 10 } 11 Point(const Point &p):x(p.x),y(p.y) 12 { 13 count++; 14 } 15 ~Point(){ count--;} 16

静态数据成员和函数

静态数据成员 类是类型而不是具体的数据对象,类的对象都是该类的实例,每个类对象都具有自己的数据成员,而且是相互独立,各占内存空间.然而,程序中往往需要让类的所有对象在类的范围内共享某个数据.声明为static的类成员能够在类的范围中共享,称之为静态成员. 一.全局变量与静态数据成员 希望在同类的多个对象之间实现数据共享,可以用静态的数据成员实现. 使用静态数据成员不会破坏隐藏的原则,即保证了安全性. 二.静态数据成员特点 在每个类中只有一个拷贝,由该类的所有对象共同维护和使用静态数据成员的值对每