QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4427|回复: 0
打印 上一主题 下一主题

为什么静态成员函数的外部“C”声明是被禁止的

[复制链接]
字体大小: 正常 放大
rashige        

6

主题

3

听众

48

积分

升级  45.26%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2004-4-29 10:06 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

来自:ZDNet

! a3 y4 `9 q% L2 I* L1 e

C++会区分两种类型的成员函数:静态成员函数和非静态成员函数。这两者之间的一个重大区别是,静态成员函数不接受隐含的this自变量。所以,它就无法访问自己类的非静态成员。

% V- G4 e- n7 T3 o9 \0 r6 \6 |

在某些条件下,比如说在使用诸如pthread(它不支持类)此类的多线程库时,就必须使用静态的成员函数,因为其地址同C语言函数的地址兼容。这种铜限制就迫使程序员要利用各种解决办法才能够从静态成员函数访问到非静态数据成员。

3 w$ p: _) X- `6 T, J# X

第一个解决办法是声明类的所有数据成员都是静态的。运用这种方式的话,静态的成员函数就能够直接地访问它们,例如:

5 n" o: c2 ]' y- _: ?

class Singleton: Z% {4 w2 K! Q8 `5 O) m {1 B2 g1 c+ U( r" R: G public:8 G6 `6 |+ z& C! M7 Z static Singleton * instance(); 6 E/ {8 }- N: l$ Oprivate: , u9 i3 l' s* J8 q Singleton * p;# T: w7 w& L% S& P! C static Lock lock;: ?- Z% F0 X/ a( x6 i0 F# y };, u* s4 Y' w9 d1 S. ^ ; _8 G' O! j0 R) M Singleton * Singleton::instance()- `$ a2 ^: @7 U s0 [4 y7 K {3 C# E+ D$ K. i7 p6 R lock.getlock(); // fine, lock is static' D; L7 {# p# J* |/ w5 m- Z4 U" Z* N if (!p)3 B2 A8 q5 I' x: ~* E# g) n p=new Singleton;, w2 Z3 ^' n$ A7 O9 ~; I lock.unlock();! \6 E& Y( |) A9 z. ]2 y return p;+ |3 S' K! H/ R: v p+ ^ }

0 n& M- D# [4 d. A( }

这种解决方法不适用于需要使用非静态数据成员的类。

( }( A6 U% i' d* C* L* h

访问非静态数据成员

* T& [& a Y( X$ z. x6 h

将参照传递给需要考量的对象能够让静态的成员函数访问到对象的非静态数据:

$ I q! a5 B. f2 e

class A3 \9 l+ i% ?! w' O1 M% s. X {( w0 [$ G4 `2 g. f; U; q2 ~5 d+ | public: # r" K2 r0 ~& u! B% w, R static void func(A & obj);5 \- {' B- b9 t# i$ l$ I5 C intgetval() const; //non-static member function " C! P9 ]- H+ G5 B g+ yprivate: ' b5 }, x0 M7 [: i" r intval;! s% P) y: l0 i1 U. M4 u };

. ?5 l6 W7 _! a$ O. |

静态成员函数func()会使用参照obj来访问非静态成员val

' D4 ^7 Z Z4 q! \1 O% Z

voidA::func(A & obj) 3 i0 [/ B! L# T2 ?- [, i{* k ^' o1 Z5 X! Q+ A0 a int n = obj.getval();; ?" W5 b5 o0 u6 z }

6 i' k2 s8 x- t3 M; I# e1 ^; k

将一个参照或者指针作为静态成员函数的自变量传递,就是在模仿自动传递非静态成员函数里this自变量这一行为。

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2025-11-8 10:27 , Processed in 0.395020 second(s), 52 queries .

回顶部