C++中这样的静态对象成员是否可以访问,请给出一个例子说明!

ep2980 2009-01-10 11:35:54
在一个类中,有一个私的静态对态的话,这个对象怎么被访问呢?
比如,
class lei
{
public:
~~~~~
~~~~~
private:
static lei A;
~~~~~~~~
~~~~~~~~
};

在类里我就是这样定义的一个私有的静态对象(static lei A;)为什么不可以访问呢,难道说在函数里也不能被访问吗?
像什么静态的成员函数等等各种方法我都用过了,还是访用不了,在C++ primer中有这个语法啊,我实在是想不通,为什么C++不这样的语法,我们却不可以使用呢?
...全文
154 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yutaooo 2009-01-13
  • 打赏
  • 举报
回复

LZ 你要凌驾语法之上,态度上应该是我想用语言表达什么,而不是被语法牵着走。C++ 能够表现的东西对我们来说不应该是平坦的。其中,某些是一等公民需要善加利用;某些是坏人,就是要限制。

私有静态数据成员的用法常见的就2个。

1. 单间模式的一种实现。楼上已经说了。
2. 预先设定的常量。比如,内部数组的初始大小。
ep2980 2009-01-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lann64 的回复:]
C/C++ code#include <iostream>

using namespace std;
class lei
{
public:
lei():i(0) {}
lei(int ii):i(ii){}
void prt(){cout<<"i="<<i<<endl;}
private:
int i;
friend int main(); //设成友元
static lei A;
};
lei lei::A(10);

int main()
{
lei la;
la.prt();
la.A.prt(); //这样可以访问
return 0;
}
[/Quote]


你态有才了!
不过这样是不是破坏了
封装呢?
lann64 2009-01-10
  • 打赏
  • 举报
回复
#include <iostream>

using namespace std;
class lei
{
public:
lei():i(0) {}
lei(int ii):i(ii){}
void prt(){cout<<"i="<<i<<endl;}
private:
int i;
friend int main(); //设成友元
static lei A;
};
lei lei::A(10);

int main()
{
lei la;
la.prt();
la.A.prt(); //这样可以访问
return 0;
}
jstar920 2009-01-10
  • 打赏
  • 举报
回复
不要意思,我想多了:(
ep2980 2009-01-10
  • 打赏
  • 举报
回复
我感觉对象调用函数,是可以访问自己的成员变量的,也可以访问其它对象的成员变量,所以我就有了这种想法,说真的我真的不知道它可行还是不可行!
不过我怎么也访问不了!
jstar920 2009-01-10
  • 打赏
  • 举报
回复
静态成员变量应该要声明的, 楼主不妨在对应的CPP文件中试试加一句话:lei lei::A; 对A进行了声明
(当然也可以这样lei lei::A = lei();)

原因是,静态成员变量是在类对象构建之前就必须存在了,如果不在类定义外再声明一下,那就好想这个变量没有被定义一样,(非静态的成员变量都是在类对象构建时被实例化);

比如:
A{
 int a;
 int b;
 static int c;
public:
static int& GetC(){return c};
};
只有当 A x; 即用类A构建了对象x时,a,b才会被分配空间实例化; 而c不同,它在A x语句之前就应该已经存在,即使我不定义x, 我也可以利用A::c来使用c(c为public时,);或者通过GetC来访问c(c为私用时);

为了不误导楼主,再补充一点:
  静态成员函数只能操作静态成员变量,但静态成员变量可以让任何成员函数操作。
zhouqing19871024 2009-01-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ep2980 的回复:]
您所写的代码是可以正常的运行的,自己调用函数来访问自己当然是没有问题的了对吧哥哥!不过我的是意思是,在主函数中定义一个对象,然后在用这个对象来访问那么静态的成员对象中的东东!
[/Quote]
静态数据成员一般是用来被静态成员函数调用的,一般不提倡直接定义类对象来调用静态数据成员,再说了,你这里把静态数据成员定义为私有的,外界当然访问不了啦!
ep2980 2009-01-10
  • 打赏
  • 举报
回复
您所写的代码是可以正常的运行的,自己调用函数来访问自己当然是没有问题的了对吧哥哥!不过我的是意思是,在主函数中定义一个对象,然后在用这个对象来访问那么静态的成员对象中的东东!
ep2980 2009-01-10
  • 打赏
  • 举报
回复
谢谢了,不过实践出真知,关键还得试一试!
疾似云流 2009-01-10
  • 打赏
  • 举报
回复
这个主要用来控制类的对象数量吧,<More Effective C++>有讲到
Vegertar 2009-01-10
  • 打赏
  • 举报
回复
随手写的,楼主看看吧

#include <iostream>

class HW {
static const HW hw;

HW() {}
HW(const HW&);
HW& operator= (const HW&);

public:
void print() const {
std::cout << "hello world!" << std::endl;
}

static const HW& ref() {
return hw;
}
};

const HW HW::hw;

int main() {
HW::ref().print();
}

65,211

社区成员

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

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