社区
C++ 语言
帖子详情
为什么要转为一个static函数(static函数是不是指static member function)?
niuniu612
2005-05-10 12:43:00
inside c++ model (中文)184页
“如果函数因其复杂度,或因其建构问题,被判为不可成为inline ,它会被转为一个static函数”
为什么要转为一个static函数(static函数是不是指static member function)?
...全文
270
18
打赏
收藏
为什么要转为一个static函数(static函数是不是指static member function)?
inside c++ model (中文)184页 “如果函数因其复杂度,或因其建构问题,被判为不可成为inline ,它会被转为一个static函数” 为什么要转为一个static函数(static函数是不是指static member function)?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
niuniu612
2005-05-11
打赏
举报
回复
up
Dream_soft
2005-05-11
打赏
举报
回复
这时指得是在类外定义Inline函数的情况吧?这种情况下Inline失败就被标记为static。这里的static指的是文件作用域。
任何函数都只有一份拷贝,类的static和成员函数的区别在于没有隐含传递的this指针。与一般的非成员函数相比,主要在类数据访问权限上有区别。
不过,这种对outlined inline的处理现在已经过时了。具体的情况你可以参考Effective C++ 条款33: 明智地使用内联,我就不多说了。
xuanwenchao
2005-05-11
打赏
举报
回复
inline 指定为编后相当于将函数拷贝一份到调用的位置. 而它还是属于对象级的.
而static不管实例的几个对象它只会有一个,是属于类级别的.
zeeeitch
2005-05-11
打赏
举报
回复
和Dream_soft一个看法:这里的inline是全局(非类成员)函数。失败后标记为static,此static是指“可见性”——“static关键字很容易使人糊涂,因为它有时控制存储分配,而有时控制一个名字的可见性和连接”
dzw2004
2005-05-11
打赏
举报
回复
up~
zhaokugua
2005-05-11
打赏
举报
回复
static属于类而不属于对象
whyglinux
2005-05-11
打赏
举报
回复
>> 如果象你那么说那都具有外部连接就意味着编译器要处理,只把一个弄成可见的,对吗?要不然就连接错误了,这样不合理
是的。如果具有外部连接的inline函数不能进行内联时,编译器要把它作为普通函数对待,同时
1、编译器要进行内部处理,不能因为inline函数具有的多个定义而出现重复定义的错误。
2、编译器要从多个定义中选择一个生成函数的执行代码。至于选择哪一个,应该是实现相关的问题。
cppprogramlover
2005-05-11
打赏
举报
回复
呵呵,多谢指点,也是,不是很好的方法,代码增多了,数据也多了,如果象你那么说那都具有外部连接就意味着编译器要处理,只把一个弄成可见的,对吗?要不然就连接错误了,这样不合理
cppprogramlover
2005-05-11
打赏
举报
回复
而且根本没有提到是成员函数,怎么都猜那个呢,吓猜?
cppprogramlover
2005-05-11
打赏
举报
回复
大家猜得应该都不对,不能是成员函数,为什么这么肯定说呢,因为成员函数(哪怕是类里面定义的)都很有可能inline不了,而一旦这样就改为static函数,显然不能接受(比如一个正方形带内接圆的类,画圆函数如果不能inline那成什么样子了,那就成了正方形了)。
而一般的函数只要是inline 如果你要在别的文件引用 就必须包括其定义以便inline展开,而如果不能inline,那么对这个函数就不能使用inline函数的单一定义规则(可以多个文件出现定义),必然出现链接错误(重复定义函数);而此时解决办法就是使其static化!我觉得设计这个方案很好!
没有看过书,猜得,但是觉得应该是这样,如果我错了,请指教
whyglinux
2005-05-11
打赏
举报
回复
To cppprogramlover(爱相随—)
而一般的函数只要是inline 如果你要在别的文件引用就必须包括其定义以便inline展开,而如果不能inline,那么对这个函数就不能使用inline函数的单一定义规则(可以多个文件出现定义),必然出现链接错误(重复定义函数);而此时解决办法就是使其static化!我觉得设计这个方案很好!
================================
只能说这个static化的设计方案简单解决了inline函数不能内联时出现的重复定义的错误,但是却不能称之为一个好的设计方案。因为函数加上static关键字之后它的连接属性就变为内部连接,这样的话在每一个使用这个函数的编译单位中都会生成一份函数代码,尽管实际上是同一个函数。就如Dream_soft(Dream_soft) 在上面说的,这是一种“过时”的做法。
现在,C++标准规定不加static修饰的inline全局函数(区别于类的成员函数)和非inline全局函数一样具有外部连接属性,这样就保证了inline全局函数在内联不成功时将只有一份函数代码生成。为此目的,上面将函数改为static的简单做法显然就不能胜任了,因此编译器需要做更多的工作以完成这一任务。
healer_kx
2005-05-10
打赏
举报
回复
这书没有看过。。。
niuniu612
2005-05-10
打赏
举报
回复
"static函数只有一份拷贝!不属于一个对象,应该不是成员函数" ----引用 Seu_why
那么这个static函数在调用的与一般的非成员函数有什么区别?
oyljerry
2005-05-10
打赏
举报
回复
静态成员函数属于这个类
Seu_why
2005-05-10
打赏
举报
回复
static函数只有一份拷贝!不属于一个对象,应该不是成员函数.
niuniu612
2005-05-10
打赏
举报
回复
不明白
可能我表达的不清楚,我是想问,inline转为一个static函数,那为什么不转为一个成员函数
还有static函数是指非成员函数吗?非成员函数又是static的先,意味着什么,难理解?
zeeeitch
2005-05-10
打赏
举报
回复
这里所说的函数是否指非成员函数?
the_mask_of_zorro
2005-05-10
打赏
举报
回复
对你的这个问题
可以这样理解
在class内部
不可成为inline ,它会被转为一个static函数
关于C++静态成员
函数
访问非静态成员变量的问题
代码如下:class a{public:
static
Function
A() { menber = 1; } private: int menber;}编译上述代码,出错。原因很简单大家都知道,静态成员
函数
不能访问非静态成员,这是因为静态
函数
属于类而不是属于整个对象...
static
成员
函数
不能调用non-
static
成员
函数
1一般类静态成员
函数
不能调用非静态成员
函数
2
static
成员
函数
可以...由于构造
函数
特殊性,它从无到有构造
一个
对象,因此调用它不需要
一个
instance,也就是不需要this
指
针来调用,所以在
static
函数
中能调用构造...
《c语言深度解析》第3、4章 存储类、生命周期、作用域、链接域,
指
针与
函数
课程内容: 第3章: 存储类与auto、
static
、register关键字
指
令、常量、变量的生命周期 变量与
函数
的作用域 链接域与extern、
static
关键字 声明的意义 第4章: 存储空间、符号、地址 一级
指
针与多级
指
针 野
指
针与段...
出现错误"illegal call of non-
static
member
function
"?
解决方法:原因在于没有经过对象,就调用了非静态成员
函数
,只有静态成员
函数
(
static
相当于全局
函数
)才能直接调用,普通的成员
函数
的调用应该是object.
Member
Function
(),或pObject->
Member
Function
() ...
静态
函数
(
static
)->
static
与 const
静态
函数
(
Static
Function
)是
指
在C++中使用
static
关键字声明的
函数
。:静态
函数
在类的作用域内,但它们不依赖于类的实例,因此可以被类的名称直接调用,而不需要创建类的对象。:静态
函数
不能访问类的非静态成员...
C++ 语言
64,648
社区成员
250,503
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章