关于C++里的静态数据成员……

2024-12-19 05:53:33
推荐回答(2个)
回答1:

*** 我主要说的关键是“静态成员是属于类的”,而不属于任何对象所有 ***

在此对一些内容作详细的解释,其中小部分与楼上有点相同,但我说的关键处,与它不同,并修改一些说法。

首先,我在这里把楼主的“静态成员”和“静态方法”,分别对应下面的“静态数据成员”和“静态成员函数”。并把他们都成为静态成员。(它们实际是同一个概念的不同说法。)

“静态成员是属于类的,由该类的全体对象共享”------就是对是这样的

“无论你建立了多少个该类的对象,静态成员在内存上只有一个”------我要说的是,无论你建多少个该类的对象,所有成员函数在内存上也只有一个

为什么说静态成员是属于类的呢??

因为,
我们假设 class A };并定义对象 A abc;
一般的引用类的成员的方法是通过对象去引用:abc.i; abc.display;。
但可以通过类 A::i来引用i , 通过A::display()来引用display(). 《这里是要特别要注意的!!!》
而普通成员就不行,
虽然不管是静态成员还是普通成员,在内存里只有一个副本。但从这个角度去看,静态成员是属于类的。

对于静态成员函数,我们也许还分不清楚这个问题,但是,
特别是对于静态数据成员,我们就很容易理解了。
如果不定义为静态数据成员,那么每个对象都分别有一个i的副本(拷贝)。但定义为静态数据成员之后,所有的对象共享有一个i的副本,就是说i在内存里就一个副本。
那么,不同对象引用i,对i的改变的话, 其他对象中i的值也会被改变,而且所有对象的值都是相同的。
在引用静态数据成员时,可以不通过对象而通过类,静态数据成员在内存只有一个,而且可以通过类来引用。这是静态数据成员属于类,很明显的。

这是实现不同对象间数据共享的一种方法。

静态成员函数,与静态数据成员类似。就不说,需要注意的是,它在内存里始终只有一个副本(普通成员函数也一样)。

关于静态成员的生命周期,在此就不多说了。

回答2:

楼上的说的好长啊,我简单说两句吧;楼主问为什么去掉int Box::heigth =10;会报错?
首先,我们看下去掉后编译/连接后报的错误吧:
console_project.obj : error LNK2001: unresolved external symbol "public: static int Box::heigth" (?heigth@Box@@2HA)
Debug/console_project.exe : fatal error LNK1120: 1 unresolved externals
这个就是编译/连接后报的错。
其实VC这里已经说的很清楚了,这是一个连接错误,这个错误是出现了一个未解决的外部变量,这个外部变量是public: static int Box::heigth;没错,就是heigth这个静态成员;
它为什么会发生这样的错误呢,原因是,你没有定义public: static int Box::heigth;
哈哈,楼主肯定很困惑我这样的说法。。。你在类里面虽然写了如下两句代码
public:
static int Box::heigth
但是,这个不叫定义,这个叫声明;就如同你在类中声明了函数int volume();一样,你同样在下面还需要定义这个函数:
int Box::volume ()
{
return (heigth*length*width);
}
如果楼主试一下将这4行代码屏蔽掉,一样会出现连接错误,只不过它告诉你未解决的外部变量是public: int __thiscall Box::volume(void)这个了;
你在代码中加入int Box::heigth =10;这句的意义就如同上面那4行代码一样,表示你定义 了Box::heigth ,至于你是否要初始化为10或0都无所谓的,关键是定义这个静态成员;
你可以把int Box::heigth =10;改为int Box::heigth;一样能编译通过;只是没有对heigth做初始化而已;