社区
C++ 语言
帖子详情
C++ static 函数的问题。
ketao_78
2008-03-06 10:59:24
近日读 C++ primer 中static 一章 , 有这么一句话,
“静态成员函数的声明除了在类体中的函数声明前加上关键字static 以及不能声明为
const 或volatile 之外与非静态成员函数相同出现在类体外的函数定义不能指定关键字
static”
为什么不能在类体外指定关键字static , 这样设计的目的是什么,有什么用处?
...全文
3268
22
打赏
收藏
C++ static 函数的问题。
近日读 C++ primer 中static 一章 , 有这么一句话, “静态成员函数的声明除了在类体中的函数声明前加上关键字static 以及不能声明为 const 或volatile 之外与非静态成员函数相同出现在类体外的函数定义不能指定关键字 static” 为什么不能在类体外指定关键字static , 这样设计的目的是什么,有什么用处?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
c++
中
static
函数
静态成员
函数
不依赖于类的任何实例,也就是说,它们可以在没有任何对象实例化的情况下被调用。静态
函数
可以访问类的静态成员变量,但不能访问类的非静态成员变量。它们不依赖于类的任何实例,并且可以访问类的静态成员变量,但不能访问非静态成员变量。使用静态
函数
可以在不需要实例化对象的情况下调用该
函数
,这在某些情况下非常有用。在上面的示例中,静态
函数
static
Func()可以在没有任何对象实例化的情况下被调用。在这个
函数
中,我们可以看到它可以访问类的静态成员变量x,但不能访问非静态成员变量。
C++
static
静态成员静态
函数
,语法+示例,超详细!!
C++
static
静态成员静态
函数
,语法+示例,超详细!!
c与
c++
static
函数
的区别
c与
c++
static
函数
的区别
C++
static
函数
继承
问题
今天在论坛上看了些关于
C++
中
static
函数
继承的
问题
,顺便弄个小程序试了试。。
#include
using namespace std;
class base {
public:
static
int statFun(){cout << "in class base"<
//......
};
class
c++
static
静态变量、静态
函数
static
变量在静态区,不管是局部静态还是全局静态,其生命周期与程序相同。从作用域和生命周期考虑
问题
分析。在内存分区的全局数据区分配内存,用时可以改变其值。
static
静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的
函数
调用不再进行初始化; 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用...
C++ 语言
65,178
社区成员
250,527
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章