类中的静态变量可以先使用后定义吗?

AxUxlTl 2007-03-23 01:26:00
在一个教程里看到下面的程序:

#include<iostream.h>
class sample
{
int n;
public:
sample(int i)
{
n=i;
}
void add()
{
s+=n;
}
static int s;
};
int sample::s=0;
void main()
{
sample a(2),b(5),c(8);
a.add();
cout<<"s="<<sample.s<<endl;
b.add();
cout<<"s="<<sample.s<<endl;
c.add();
cout<<"s="<<sample.s<<endl;
}

为什么先有
void add()
{
s+=n;
}
之后再定义
static int s;
在编译的时候不会出错?

另外为什么int sample::s=0;不能写成int sample.s=0;?什么情况下可以用::什么情况下不可以只能用.呢?
...全文
548 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
kaneding 2007-03-25
  • 打赏
  • 举报
回复
Static是表示静态变量,换句话说就是全局变量。在程序编译时,系统将会自动的为static变量分配内存。
Jodiman 2007-03-25
  • 打赏
  • 举报
回复
我问一个程序本身的问题:

运行结果是:
s = 2;
s = 7;
s = 15;

为什么不是 s = 2; s = 5; s = 8;
能解释一下为什么吗?谢谢
lizhendi1021 2007-03-25
  • 打赏
  • 举报
回复
我问一个程序本身的问题:

运行结果是:
s = 2;
s = 7;
s = 15;

为什么不是 s = 2; s = 5; s = 8;
能解释一下为什么吗?谢谢

这个问题看静态变量的知识你就应该懂了,因为s是静态变量,所以只在程序刚开始运行时作一次初始化,以后值都不变,刚开始s=0;
s+=n;
s为2;
而这个值会被保存着.
等到下一次在做s+=n;前,s的值还是2,故之后就边成s=7;同理,再做一次s+=n;s的值就变成15了.
晨星 2007-03-24
  • 打赏
  • 举报
回复
你应该把不同的概念给区分开来:
(1)在类定义的内部,成员变量可以在出现之前被使用,不管是静态成员还是一般成员;
(2)对于静态成员,类里只是声明,只能在类外定义并初始化(除非它同时是const的整数类型)。
——以上两点都很重要,但没有关系。
晨星 2007-03-24
  • 打赏
  • 举报
回复
哦,你是问既使是在类的内部,那个s也是先被使用,后被声明的吗?
这个没关系的,C++语言规定编译器在类定义的内部解析一个名字时,要考虑类定义中所有出现的变量定义或声明,既包括之前的,也包括之后的。(由这个你应该可以想像到:编译器在处理一个类定义时,至少要读两遍)。——这是类域中跟全局域的一个不同之处。

其实应该是你看到static给弄糊涂了,如果不是static,你根本不会奇怪的,比如,最常见的:
class A {
public:
A() { m = 0; }
private:
int m;
};
140355 2007-03-24
  • 打赏
  • 举报
回复
类体内的定义是不分先后的。而且不需要前向声明。比如一般的做法是先定义成员函数,再定义成员变量,如果成员函数是内联的,在其中引用成员变量也不会造成编译错误;再如构造函数,一般出现在最前面,而其不可避免地要访问定义在后面的成员变量
晨星 2007-03-24
  • 打赏
  • 举报
回复
任何变量,只要声明了就可以使用了。
对于定义,不管是先定义还是后定义都无所谓,但必须有定义,否则程序连接时会出现错误。
ccchenwei 2007-03-24
  • 打赏
  • 举报
回复
C++中对于类、结构等,它的编译过程与普通的函数等不同,编译类时,先要将整个类完整读入,再编译。因此,在类中,成员变量(静态,非静态)的顺序无所谓,只要有就行。正因为这个道理,定义声明类时,成员函数和成员变量的顺序和位置没有强制要求。
maplewasp 2007-03-24
  • 打赏
  • 举报
回复
sample是一个类名,即抽象的东东,因此在实例化成对象之前,对静态成员变量或者静态成员函数都只能用::符号。而对于“."只要是公有的成员变量或者成员函数,对象都可以用。不过对象
不能用::符号,也就是说类只可用::,而对象只能用"."
双杯献酒 2007-03-24
  • 打赏
  • 举报
回复
你对先后的理解好象不对吧.
femalelover 2007-03-24
  • 打赏
  • 举报
回复
这确实与static与否无关,俺估计static会更早分配
-------
标准要求一个局部的static必须在使用时才构建, 并且常常通过一个bool值来标示一个static是否已经构建.
flyseahappy 2007-03-24
  • 打赏
  • 举报
回复
这确实与static与否无关,俺估计static会更早分配
banzhiyu 2007-03-24
  • 打赏
  • 举报
回复
同意楼上。
「已注销」 2007-03-23
  • 打赏
  • 举报
回复
啊?还是不明白。。。。。。
y1x12z8 2007-03-23
  • 打赏
  • 举报
回复
静态变量是在程序编译完成后就存在了的,跟运行到哪里没有关系

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧