From f1e2b3fbef84caa6943cde627e1fd101d8741e25 Mon Sep 17 00:00:00 2001 From: light-city <455954986@qq.com> Date: Tue, 6 Aug 2019 15:30:17 +0800 Subject: [PATCH] update dir --- README.md | 1 + explicit/README.md | 2 +- friend/README.md | 101 ++++++++++++++++++++++++++++++++++++++++ friend/friend_class | Bin 0 -> 9344 bytes friend/friend_class.cpp | 28 +++++++++++ friend/friend_func | Bin 0 -> 9336 bytes friend/friend_func.cpp | 33 +++++++++++++ 7 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 friend/README.md create mode 100755 friend/friend_class create mode 100644 friend/friend_class.cpp create mode 100755 friend/friend_func create mode 100644 friend/friend_func.cpp diff --git a/README.md b/README.md index 64156ea..b70efaf 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ - [x] [union那些事](./union) - [x] [c实现c++多态那些事](./c_poly) - [x] [explicit那些事](./explicit) +- [x] [friend那些事](./friend) 代码运行: 全部在linux下用vim编写,使用gcc/g++调试!全部可正常运行! diff --git a/explicit/README.md b/explicit/README.md index 8fbe13f..05dda6f 100644 --- a/explicit/README.md +++ b/explicit/README.md @@ -4,7 +4,7 @@ - explicit 修饰转换函数时,可以防止隐式转换,但按语境转换除外 -代码参见:[./explict.cpp](./explicit.cpp) +代码参见:[.explicit.cpp](./explicit.cpp) 参考链接: > https://stackoverflow.com/questions/4600295/what-is-the-meaning-of-operator-bool-const diff --git a/friend/README.md b/friend/README.md new file mode 100644 index 0000000..768b95c --- /dev/null +++ b/friend/README.md @@ -0,0 +1,101 @@ +# 友元函数与友元类 +## 0.概述 + +友元提供了一种 普通函数或者类成员函数 访问另一个类中的私有或保护成员 的机制。也就是说有两种形式的友元: + +(1)友元函数:普通函数对一个访问某个类中的私有或保护成员。 + +(2)友元类:类A中的成员函数访问类B中的私有或保护成员 + +优点:提高了程序的运行效率。 + +缺点:破坏了类的封装性和数据的透明性。 + +## 1.友元函数 + +在类声明的任何区域中声明,而定义则在类的外部。 + +``` +friend <类型><友元函数名>(<参数表>); +``` + +注意,友元函数只是一个普通函数,并不是该类的类成员函数,它可以在任何地方调用,友元函数中通过对象名来访问该类的私有或保护成员。 + +具体代码见:[friend_func.cpp](friend_func.cpp) + +```c++ +#include + +using namespace std; + +class A +{ +public: + A(int _a):a(_a){}; + friend int geta(A &ca); ///< 友元函数 +private: + int a; +}; + +int geta(A &ca) +{ + return ca.a; +} + +int main() +{ + A a(3); + cout<; +``` + +类B是类A的友元,那么类B可以直接访问A的私有成员。 + +具体代码见:[friend_class.cpp](friend_class.cpp) +```c++ +#include + +using namespace std; + +class A +{ +public: + A(int _a):a(_a){}; + friend class B; +private: + int a; +}; + +class B +{ +public: + int getb(A ca) { + return ca.a; + }; +}; + +int main() +{ + A a(3); + B b; + cout<^kdV@LLN z*H&u@N~y5Ag2(ow8%$K%hcsy#V?QP|ZEdQu7Jf`CLhxhbM}`VY_!t37l})AI^PYQN z`}*415YztgM)$twecq4ranCvTp4WLe)Ya*9I0TbZ+$%^bEDT7|Ee=xLTbi(CQ4x0&}j8Ik%8F)mNr~Dw_NcOH7fu z5MBw8AGLMvIw^whl?CQwsvW1OVUoP^PB8g3x}^xdR~DF0sfID<{!!oP>Qiz1oB>EA z2Z)Idc`tLaCF*|Dh*A0SA}N9gWPy2~2@B@z_jUMDJ3lRXlwpsmZ@zJ9Q0-@~x+^v% z6N4?yo074O$wVr5VB>+-mW?gVzHHjJS@xUalkN7M{jw$=M=vC5^GaMa)TDoK+rLCEVMsqwBONOJphTk6@iDYym6G<4^a5NO^0k#DZ5>Y*!H8SzYXt+=B zYtlo#Eog0Z9qncv2pLW1j8bh0fqqB1%jj)%pB^3Arw>IENsK}CKtzui@dF8X=wzt| zWHgdUiS1qCwsw89uens(?AvOVckkA>00)`N$%(mdZZvg3%s+G39gzNsBF)bxTq_d^ z>{xYT3!V#Mxz!2m3@))vJtqfN2o*_3WZdy2wjienEB)NEy%MLrK`mt|^Yf;?RBee8 zZ&dSOAtV(-;$92Rdk!f!Sa6EP)MUY}`%EX@%M#>+OOhYnrO3H7OOhYkKkn$TO(-6#zOZl%P)9}uWNjU>~ zr~p}#|GjYj675c`)7f@ zpMQ;jX8`2SpP`vNz4cnLc$)S+QalF1tmpWSxtO+PsSJs^phNM}IaQe_fB0%XH#c$k zsw4NMM-I;wi|EEJXTHB2;jVmAEdG8k0-q-F3~idzPB<4#@6%*^hUUohv(#fVWd876 zK6hC=9-2Gee>v|d44f;-sw6&pJT!|jD+Iq0d?1)F2K$43T_@J>uk&K?Pi#B_-W$$e z3Flw!x`RfdK|A}2YkCu!p*{MZ;r0KGpI2A@?XLWl4n!!fd|jJ3=g{tcC-*i@@COHi z-wqB0_XPEGh4S6*hB3xIm7K=}VKaHxA;7_8Lb?8|Ud>!~U z^sfWF2mA%-9|FGw{$21G@OQy~1y1jCBFCW~;W*%NtXaCSq2O5PA)LP9HX#0;WT2?F zy%6i5C;Q!Kms}KXPp7-_{$)$P(=aaXTYb-+Th`r1A;_i!*D zF+|eGa2he*zsjobHuW9A zF5&W^{y6E|+@2?#ZSKa$T_LykL|vPE!}sbnchj*2n!9yk;SP5o<8BSQn}Y5QZEi2@ zVBh9$kmLGgjBhLASod!V`8j<)0-tpR_ToK4BM#beCRb^uIR*{5Fo`~1hq?F408NH~9@|&qq7C#0{l9j8*5tD&_M|C5~07)_EmlX0r& z;ZxYqy`p+v9fbV~cDC?>#NC2Uc|`m^cm{7h1l%ZDOG16JxE9*l1vFGP|eiojt)FAw9ISgYutpD7cIywjR=yf!5Je3b3oQvp0l1 zWU#F(L{1egk5vLPwJP+EZ|)542)CCrl7WCsEUFZuN;^igIXPlv=5K2rjvIp^e-Hux zdzQ9#F0^JXX115QuhhtHQclyF2(@Xdqf<857X3daig)2b#S$q!myKhD$h3CeSdT@F zh?##ygOF|JM?-mHO6uAw)nnPTK7z+h>1Z=~OQUE`5PdM4Eyb!#`<6S1sf*DLB6W-@ zVoOikD*Md2YFnH*by8Kk8Py73_TZ=y83Z>nCLiHaB86o9nDC|2M%)){3vV$% zGKwuiZeRcNjlR3EC6?a1e4gOnCHY*+6_Kr#Zihf;L2RFr_}sz2`*{`4jNfZ4`%$p^ z^ZCS30oSpi;&%TI;8$>VyFVXTjRf%FJ3QKUYKc9DAR6w`tFrBxl z*no=&Ur>@Bz#Xrel0Tn|8dXF2JZ@T-zZY5Fg94p}xqd!BrBs7?{JH&X$9y0B>1@q1 zpR)?ep<7i%?I#;g5lq}7HN6E~8X!9Rm7?2j@G$}#cUQ?=; ze*%TIe*Ru9DE}TFSQUWl<#<1}`Sbbn5+$cWikSlL_Wu787}d|;O#J;gs~qk2EHi&j z`ExV*cXs~$y$^aTu^(e+P@wwRpU=J8V$;GPrG@O{`4V(E^_B8be9qwCR_kR_> z%PjtUj&7i!AiKR?{yS`_iL{1^_`L1;l>TqQho&0)b3TdxUt&u2UronSd$?aG;cKm* z&+l{8DUiLrEHi%}Hdg=AIbT(y*E58MLf XW?bBV-oI#>)vDjC44$wl?e+f~T^ijn literal 0 HcmV?d00001 diff --git a/friend/friend_class.cpp b/friend/friend_class.cpp new file mode 100644 index 0000000..bfa2372 --- /dev/null +++ b/friend/friend_class.cpp @@ -0,0 +1,28 @@ +#include + +using namespace std; + +class A +{ +public: + A(int _a):a(_a){}; + friend class B; +private: + int a; +}; + +class B +{ +public: + int getb(A ca) { + return ca.a; + }; +}; + +int main() +{ + A a(3); + B b; + cout<Allem3`v<>-S9b5Y9*iPc%*pdC5 zwH0Nl0-da`kaY}I8fa)6lh7t@lZJ#4YE!jpVFIaWLX-BTj=mU5MwelcK`f#1at@ z>%?_p5s+G30jVKwmYC10(9G+UoeR7MSDVuW+MEGdV9wPs=N1yD`brc~MU%g{%oLdm z;gtaSQCsJ)k|OvXSztb<+VM0sOp;gL2`0Y=w-mwm$O7~8s$tBzf7Ca+`c&LLX8;n( z0b-(4-bpk(|MAnFBI+BrW zHl7uFxNo~2i)R$vx4k2oPR08ogUPt5tFF0!N3YSANN4rINH*RQP9=;^e`s9jz|+ZW zsC#QqZ@O0x0q8Ya;;C3N9PKsy{^&>~qZ^q>!pMfBp->O7&4`eQ>glYJiAP4meR^NB z9_npHYb)#MFzZ0bXgX&UYfA|9JIY-~Z=(OiF6ib_YTg>vVUHWF=Aagl6G55`lrUr=lXAZjq(mzq8`PqzXRU&~M zt43_bb0I9ZCV`#7CGJqq$$=F@MbZ%&Hy_0o

40pReB|aoQWyQkF75Z`w=MmMHNC zH4hd;QXwSnwcxzxkfPCoQ!J)t3vS()+AKJ&VWxluS6iP{X%>7b8-sUSaJA)|_LFbd zX@_e+y~HcDN2ZP1nePGCCQsL$GMx)sRzg+SunPD3bpez}9wFuI`2uLeQj)3bv*)Dj zB${u{|OB(qOT`Aw2(C}yXm{07N11hW%T{w>Kgyt89c&OjcT zf-K4ZPB{PCZY}?YHhE#LyDxlp`aIqM+S!w1lAV2`E+A%x;dp7NeqATt%V`Wmzt%JY zrcKVfwfx2Lwa-&1>i&v>6Qn4dhw;NQ{=g~f^^lL{ zTi=0SG1zUiI84c5-4~mzI_2ds+&gbSQ z4_tQSK6~)Me4&6IU4P=+D-iCj4-17C_8{L?nIr9%-Q>OQEvOPi5W#(tp`BPKe zmwfJ$>`wosyl0AreF8=z_@&@|!F(auAMEQovSGZ&i@`tA^bmM&IR8O7|9aQW7d4v0 zCqHz}+=_a%N8T~K{@?NQ>dL>_mH(g<5eln*uT7qEXt%wUdy^*kR|bM#4Gsi%2lZ1^ zrRV!T=Dm!kmH_Q9j+L^k78Udfd2rz2HjeUPOS&mz&pWr zgP(@}LGT#lx50l3PVaLf$NnDS*z0kuUB0+(%CXo(IDNx4BK}4)P*mMsi1pBu{Vudi zE(*72tGnUu`ek3Qn-F)cxqaj2^*2%ovgyP{?fn!1LAU3Sv*W5oJ*XHW>0`KljC$qX z$ohLq`iG%^0{Ri~qQ5gL4aomTxc&(JomTz6lK*Mom!V&6)pwivPGA>sdCD%3& z$DHl%hDTi?xA#a*ySwpQwVJ#6&?3#Ma-cVoNT3p?1iyX)k*eh%Z? zhB(&!n?im{i?ys zOi?r_F4w3k6Qj3?B<$=&ytbyLRNBwzMNK647;um3FXQKH1EemtyID%+-bzKTAIn$v zXG+;)+mtfbJE!E7(yK84cgE*fdqs=zo+G+O@tYKHReY=B_bEQ4__*TI*>c;~(eVXu zWB*_-W#qhDd@a7_rq-O4{15qCea$UCzyD@a;oa2iZ*6XEzRluZwdleuZF2@HbS^y2 zzN)xO7*+9_;ykkkb79u;{3^#637&`L_+nA*`MEGV__>$cFA+R{%JHSec~*`u6TIHa z@#SJp&C7E9Dlt*zdANkTnBOV4uNS<2%W;pGQ|r1MUs23Yl;bOfwlrXcWZ5OIF75|b zr3-I4-UrI@)q*}B?c@^I6!S1voeQg!&pYKfR-szw<@mK?S5>@p9xk`%U95!Cc2gtX z!$)8_(f;TVmF=f}(TVY&wmlb$Ot`S^!#;)E_vcO-e~p;JM=25S)4j4>IiCB0Q+(d{ z$%p6=E=QH;@(l25{d!K?uMzYyOvLq`Mw#MYQSF!COu#NFoZmCN4=*%sZYUhcR6M^d z0M8O#C-KVhB#Ub8Y?KYFoS(PLIF<9^UTJ@I#XKBTIKRiZML8L#avmPVhVB)W^Xehk zuViNn|E|Q{f=+ov{62UBg_Rgj&ckk$S|Of+y;qg3?3WAR-Pw#-EPeL~(f+;t#+*_ZSP^r$%e z9Wj7$rZ~scI%1c4*jJk;O$xW?^>V;zeC+LcaDjRc$vAF7c?6;nc^Be0vi()wFVT#V zHF85kz9>>&cX#yYUE$t7WB^NvKHV7Aqm=4H3Q&)w_2FcCFp|_`Mmm$#Be}gInjRfX z#*KK)_xUZiwNy9KhZ3oT9?4`P`}BCq$m|nCnaF5dkL5;3_rb*?>990xrU@hl^`TrU z>Whwz$y8xio31C)WD2pxuT!SZKz5LjL?oHm4+#m)2>fDkWDIjrDK{q)Lf_W4vpv`a zm)xKp*5N)JHzGa$Alk9DC%8SNhjw&Q5>$={myyZVLz*(sI(v#?c5dC;8$vQN*xnT) zr?Te9$^n^Q6?*5FcLcYGJ4$KEKtN^}RUT309;4Zu95#gb@5$NfDbT8M%_J}7G?f}j zO-f~2^Pe_NWpqm7+M@r*{P0dZpjaZM=dy8(37J+;7wfTz5i!%QXb_Uj{4gjzOu1ZJ zrFtxz)<^J|DGP1pY-!xgiJ=c>v&C5D+1^qIF=OxF;SVBXjHzMEO4};?*ePmToH%t- zRl5n*%KWnMW%rF5kwI`HWAYI$B~nPlj|pEYZNz=S_HdIC8CKG8D(4%_CGbm4A|`w! zjYP5|!WY|@LOhcj8B;SJ&t$PG$^;#{OgtGO2UQwN8p0<>(1)ULI1Le5aolMY!zeA= z?~9M9bvqJ65SC0=a{-$kT>e@VW~e4InuwweX@kN8p~3LsQ3)Tml2L3AYSa237=3SH z3ogEI`5eK&NAh`;s~}q|eFg%Z0kLgL;`0Xo-se>~Gk(vp>_@@s&*u_D1zgXDirf7= zfq#HABiDb-8IYF86u{@uT8Wm_;QkTAMSXS z6#e-;)Sw#5=Wx@y^qt7^ZWQPY%=PoRDWw|B>ZV#7Hc^A*r@-B#0|s1(I=HdIQRDC_3AYxRFxwV(Ha>!I9)i~G;}7cH}D^?Q}U KVVlxk|GxpiINdt{ literal 0 HcmV?d00001 diff --git a/friend/friend_func.cpp b/friend/friend_func.cpp new file mode 100644 index 0000000..8ef67cc --- /dev/null +++ b/friend/friend_func.cpp @@ -0,0 +1,33 @@ +/** + * @file friend_func.cpp + * @brief 友元函数 + * @author 光城 + * @version v1 + * @date 2019-08-06 + */ + +#include + +using namespace std; + +class A +{ +public: + A(int _a):a(_a){}; + friend int geta(A &ca); ///< 友元函数 +private: + int a; +}; + +int geta(A &ca) +{ + return ca.a; +} + +int main() +{ + A a(3); + cout<