一个有关静态私有数据成员初始化和输出的问题

xjyr 2007-11-27 10:34:52
# include <iostream>
using namespace std;

class A
{
public:
int a;
static int b;

void show(void)
{
cout<<"a = "<<a<<", b = "<<b<<", c = "<<c<<", d = "<<d
<<endl;
}

private:
int c;
static int d;
};

int A::b = 5; //为何该语句放在主函数内部就会报错?
int A::d = 10; //为何该语句放在主函数内部就会报错? 第22行,本语句是通过类名来对静态私有数据成员初始化,运行结果
//表明该语句被正确执行

int main(void)
{
class A aa;

cout <<A::b<<endl; //奇怪,要是写为cout <<A::b<<A::d<<endl; 就会报错,为什么?既然我们可以通过类名
//对私有成员初始化(参见第22行语句),为什么就不能用cout通过类名对静态私有成员输出
aa.show();

return 0;
}
/*
在Vc++6.0中的输出结果是:
***********************************
5
a = -858993460, b = 5, c = -858993460, d = 10
Press any key to continue
***********************************
*/
...全文
301 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjyr 2007-11-29
  • 打赏
  • 举报
回复
我一直再看 就是不知道什么书上有
有时把人想得头都大了
ckt 2007-11-27
  • 打赏
  • 举报
回复
你还没明白
int A::b = 99; 这句是定义静态数据成员b,并初始化
如果注释掉不仅是没初始化的问题,是b都没有被创建
所以才会报错

你把 int A::b = 99;换成int A::b; 这样才是定义了,没初始化
然后此时b的值是默认的0
xjyr 2007-11-27
  • 打赏
  • 举报
回复
这个程序小弟也有问题

/*
2007年11月27日11:43:24
有关静态数据成员的使用
*/

# include <iostream>
using namespace std;

class A
{
public:

void show(void)
{
cout<<a<<" "<<b<<endl; //注意这里有对私有静态数据成员的输出,如果注释掉第23行,链接时就会显示本行语句出错,如果去掉该语句中的b,即如果写为 cout<<a<<" "<<endl;则在注释掉第23行的情况下仍然可以正确运行,不是说静态私有数据不初始化,其值默认为零么?请诸位高手指点
}

private:
int a;
static int b;
};

int A::b = 99; //第23行 为什么这个语句注释掉时编译就会报错???????

int main(void)
{
class A aa;
aa.show();

return 0;
}
/*
在Vc++6.0中的输出结果是:
***************************
-858993460 99
Press any key to continue
***************************
*/
ckt 2007-11-27
  • 打赏
  • 举报
回复
static int b;
只是声明,并没有定义,
static成员变量的定义是在类外定义的:int A::b = 99;
所以你注释掉这句会出错,
xjyr 2007-11-27
  • 打赏
  • 举报
回复
我还是不太明白,比如:
/*
2007年11月27日11:43:24
有关静态数据成员的使用
*/

# include <iostream>
using namespace std;

class A
{
public:
A(int m=10, int n=10)
{
a = m;
b = n;
}

void show(void)
{
cout<<a<<" "<<b<<endl;
}

private:
int a;
static int b;
};

int A::b = 99; //为什么这个语句注释掉时编译就会报错???????


int main(void)
{
class A aa(1,2);
aa.show();

return 0;
}
/*
在Vc++6.0中的输出结果是:
***************************
1 2
Press any key to continue
***************************
*/
sinux_1983 2007-11-27
  • 打赏
  • 举报
回复

#include<iostream>
using namespace std;

class A
{
public:
int a;
static int b;

void show(void)
{
cout <<"a=" <<a <<", b=" <<b <<",c=" <<c <<",d= " <<d<<endl;
}

private:
int c;
static int d;
};

int A::b = 5; //静态类型
int A::d = 10; //只有静态常量整型数据成员才可以在类中初始化
//本语句是为类中声明的成员提供定义。此时不受访问控制的约束,也就是说无所谓私有公有。

int main(void)
{
class A aa;

cout<<A::b<<endl; //这儿当然不能用cout<<A::d<<endl 了,因为A::d是私有变量
aa.show();
system("pause");
return 0;
}
xjyr 2007-11-27
  • 打赏
  • 举报
回复
我定义了一个类

在这类下面所有的函数内部该类都应该能看到吧?
飞哥 2007-11-27
  • 打赏
  • 举报
回复
放到该类能"看到"的地方
放前面
Wolf_FienD 2007-11-27
  • 打赏
  • 举报
回复
最基本的 类成员 访问 问题

LZ 在看看书
VV123456 2007-11-27
  • 打赏
  • 举报
回复
不光是静态的,你就是非静态也不能在main()内定义,雁南飞大侠说的对啊
xjyr 2007-11-27
  • 打赏
  • 举报
回复
谢谢ckt1120 !
谢谢
我C也懂一些 但很少帮人解决问题 我觉得很惭愧!
谢谢!

64,637

社区成员

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

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