C++ static 函数的问题。

ketao_78 2008-03-06 10:59:24
近日读 C++ primer 中static 一章 , 有这么一句话,

“静态成员函数的声明除了在类体中的函数声明前加上关键字static 以及不能声明为
const 或volatile 之外与非静态成员函数相同出现在类体外的函数定义不能指定关键字
static”

为什么不能在类体外指定关键字static , 这样设计的目的是什么,有什么用处?
...全文
3214 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
foreverhere 2010-10-19
  • 打赏
  • 举报
回复
受益非浅,谢谢。。。
zhfish 2010-09-16
  • 打赏
  • 举报
回复
2楼的一看就明白了...精辟
qinglingzhuren 2010-08-20
  • 打赏
  • 举报
回复
学习了
zhangjia8899 2010-02-21
  • 打赏
  • 举报
回复
怎么看不到2楼的内容.
hohai_wow 2010-02-05
  • 打赏
  • 举报
回复
14楼的没分清楚C的static和C++的static,2楼是正确的。
yinquan8241 2009-06-18
  • 打赏
  • 举报
回复
我很赞同14楼的说法
我也觉那样子更符合编程的思维和习惯
2楼很牛
但我觉得14楼更牛
ughye 2009-05-25
  • 打赏
  • 举报
回复
认真学习
某某9 2009-03-24
  • 打赏
  • 举报
回复
二楼果然很牛
sydii1225 2008-10-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zwspider 的回复:]
怎么说呢, 这是一个作用域的问题!
成员函数的作用域是类域, 而在类体外加上static不是表示静态函数,表示的是函数拥有文件域(file scope)
而类域是小于文件域,强行把类域扩大到文件域,就会出错。
如下代码:
class CA {
public:
static void display(void);
};

static void CA::display(void) { // ERROR!
cout < < "Hello CA!" < < endl;
}

int main(int argc, char* argv[]) {
CA::display…
[/Quote]

虽然很有道理,但我更愿意认为仅仅只是为了编译器实现上的方便而已
否则你的用法就是
class CA {
public:
static void display(void);
};

void CA::display(void) { // ERROR!
cout < < "Hello CA!" < < endl;
}
注意,static没有了
当然这样对编译器来说没有影响,通过CA::它仍能匹配正确的函数声明
问题是,这样不符合程序员正常的思维
正常我声明是static,那么我定义也要把static写出来才比较合理
C#和java都是这么做的
晓岚45 2008-06-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zwspider 的回复:]
怎么说呢, 这是一个作用域的问题!
成员函数的作用域是类域, 而在类体外加上static不是表示静态函数,表示的是函数拥有文件域(file scope)
而类域是小于文件域,强行把类域扩大到文件域,就会出错。
[/Quote]
严重同意
ketao_78 2008-03-24
  • 打赏
  • 举报
回复
To 8 floor,

Just thinking , no other meaning.
onlinelive 2008-03-20
  • 打赏
  • 举报
回复
六楼的,我试了一下你说的内容,发觉有点问题
static const int ival = 5;
这句提示错误为:
error C2258: illegal pure syntax, must be '= 0'
error C2252: 'ival' : pure specifier can only be specified for functions
这个不知道哪儿的问题,我也觉得应该就是这样写的呀,因为有const嘛。这个提示信息不知道啥意思

另外:
CTest::int num = 10;
应该写成 int CTest::num=10;
zwspider 2008-03-09
  • 打赏
  • 举报
回复
vs 2005
hityct1 2008-03-09
  • 打赏
  • 举报
回复
我看只是规定。
luolai 2008-03-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Supper_Jerry 的回复:]
楼上精辟。
[/Quote]
GCC 4.0
arong1234 2008-03-09
  • 打赏
  • 举报
回复
只是语法规定而已,为什么一定要找一个“为什么”呢?你在类声明中已经声明过static,因此不必要在类外再声明一次,我想这也时个理由吧?只要你愿意,你可以给它找很多“合理”得理由,但是哪个才是真得理由呢?

还是放弃吧,这个有啥意义,这只是规定
舉杯邀明月 2008-03-09
  • 打赏
  • 举报
回复
2楼的解释应该比较合理吧 ^_^
HengStar 2008-03-09
  • 打赏
  • 举报
回复
所谓静态的,意为在程序执行过程中始终会存在的一类变量或函数
在类外定义的函数本来也就是属于全局性的函数,也是会一直在程序运行过程中存在的对象
而在类中定义静态函数或变量和在类外就是两回事了,因为一个类必须实例化为对象后才可以使用其函数或变量,但是在类中的并使用static修饰过的变量和函数及时你不实例化这个类,也可以使用这个变量或函数

例如:
class CTest
{
public:
static void Print();
....
static const int ival = 5;
static int num;
};

此时要使用CTest中的Print()和ival可以直接通过CTest::Print()和CTest::ival调用它们而无需先实例化(比如CTest test;test.Print(); /*这样是不对的,因为静态变量不属于某个类,但它在某个类里面被声明则可以使用该类的成员*/
但记住,带const的静态变量可以在类声明中同时赋值,但非const的不能直接在类声明式中赋值,必须单独给出定义式
例如:上面的static int num;的定义式在类外写出:
CTest::int num = 10;
Supper_Jerry 2008-03-06
  • 打赏
  • 举报
回复
楼上精辟。
zwspider 2008-03-06
  • 打赏
  • 举报
回复
怎么说呢, 这是一个作用域的问题!
成员函数的作用域是类域, 而在类体外加上static不是表示静态函数,表示的是函数拥有文件域(file scope)
而类域是小于文件域,强行把类域扩大到文件域,就会出错。
如下代码:
class CA {
public:
static void display(void);
};

static void CA::display(void) { // ERROR!
cout << "Hello CA!" << endl;
}

int main(int argc, char* argv[]) {
CA::display();
}

// error C2724: 'CA::display' : 'static' should not be used on member functions defined at file scope
加载更多回复(2)

64,675

社区成员

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

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