类里面的static和函数指针的特殊事项

  1. #include<iostream>
  2. usingnamespacestd;
  3. intprint(){
  4. cout<<"YYYYYYYYY\n";
  5. }
  6. classtt{
  7. public:
  8. staticint(*pp)();
  9. staticint*p;
  10. intv(){
  11. this->pp();//staticcanbeivokedbythis,but......
  12. }
  13. staticintvv(){
  14. //this->pp();No,onlystaticmemberorfunccanbeevoked!
  15. }
  16. };
  17. int(*tt::pp)()=print;//likethistoinitialise!
  18. int*tt::p=NULL;//must1.*2.tt::and3.p
  19. intmain(){
  20. tta;
  21. a.pp();
  22. (*tt::pp)();
  23. cout<<sizeof(tt)<<endl;//1
  24. }
  25. #include<iostream>
  26. usingnamespacestd;
  27. voidprint(){
  28. cout<<"asdf\n";
  29. }
  30. classtt{
  31. public:
  32. void(*p)();
  33. tt(){
  34. p=&(::print);
  35. }
  36. inta(){
  37. cout<<"aaaaafunction!\n";
  38. }
  39. };
  40. typedefint(tt::*MM)();
  41. intmain(){
  42. cout<<sizeof(tt)<<endl;//4not1,void*pinclassttisaval,notafunction!sosizeofis4
  43. tta;
  44. a.p();
  45. cout<<&tt::a<<endl;
  46. //cout<<(int)&a.a<<endl;
  47. MMmyf=&tt::a;
  48. (a.*myf)();//likethis
  49. }
  50. #include<iostream>
  51. usingnamespacestd;
  52. classtt{
  53. public:
  54. staticinta;
  55. };
  56. inttt::a=10;
  57. intmain(){
  58. cout<<sizeof(tt)<<endl;//1,static,nomatteritisconstorpointerorreference!saveinstaticsection,notclass
  59. //scope!
  60. cout<<tt::a<<endl;
  61. }
  62. #include<iostream>
  63. usingnamespacestd;
  64. classtt{
  65. public:
  66. doublea;
  67. charb;
  68. virtualint_a(){}
  69. virtualint_b(){}
  70. };
  71. intmain(){
  72. cout<<sizeof(tt)<<endl;//Linux16,Windows24,andvptrinthebeginningclass!
  73. //butalignofwindowsis8,becauseofthedouble,butalignoftheLinuxis4,evenif
  74. //uuse#pragmapack(8),thealignisstill4BYTE!
  75. }
  76. #include<iostream>
  77. usingnamespacestd;
  78. classT{
  79. public:
  80. charaa;
  81. doublei;
  82. virtualinta(){}
  83. };
  84. intmain(){
  85. //cout<<&(((T*)1)->aa)<<endl;//canuseitinWindows!LInux:can't
  86. //gettheaa'saddr,togetthatthevptris
  87. //atthebeginningortheendoftheclassortheclassobject!
  88. T*a=newT;
  89. cout<<(int)&(a->aa)<<endl;
  90. cout<<(int)a<<endl;

  91. cout<<sizeof(T)<<endl;
  92. deletea;
  93. }

其实,一些很变态的使用操作都在上面了,这里仅仅是一些很少用到的东西,注意拉!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值