- #include<iostream>
- usingnamespacestd;
- intprint(){
- cout<<"YYYYYYYYY\n";
- }
- classtt{
- public:
- staticint(*pp)();
- staticint*p;
- intv(){
- this->pp();//staticcanbeivokedbythis,but......
- }
- staticintvv(){
- //this->pp();No,onlystaticmemberorfunccanbeevoked!
- }
- };
- int(*tt::pp)()=print;//likethistoinitialise!
- int*tt::p=NULL;//must1.*2.tt::and3.p
- intmain(){
- tta;
- a.pp();
- (*tt::pp)();
- cout<<sizeof(tt)<<endl;//1
- }
- #include<iostream>
- usingnamespacestd;
- voidprint(){
- cout<<"asdf\n";
- }
- classtt{
- public:
- void(*p)();
- tt(){
- p=&(::print);
- }
- inta(){
- cout<<"aaaaafunction!\n";
- }
- };
- typedefint(tt::*MM)();
- intmain(){
- cout<<sizeof(tt)<<endl;//4not1,void*pinclassttisaval,notafunction!sosizeofis4
- tta;
- a.p();
- cout<<&tt::a<<endl;
- //cout<<(int)&a.a<<endl;
- MMmyf=&tt::a;
- (a.*myf)();//likethis
- }
- #include<iostream>
- usingnamespacestd;
- classtt{
- public:
- staticinta;
- };
- inttt::a=10;
- intmain(){
- cout<<sizeof(tt)<<endl;//1,static,nomatteritisconstorpointerorreference!saveinstaticsection,notclass
- //scope!
- cout<<tt::a<<endl;
- }
- #include<iostream>
- usingnamespacestd;
- classtt{
- public:
- doublea;
- charb;
- virtualint_a(){}
- virtualint_b(){}
- };
- intmain(){
- cout<<sizeof(tt)<<endl;//Linux16,Windows24,andvptrinthebeginningclass!
- //butalignofwindowsis8,becauseofthedouble,butalignoftheLinuxis4,evenif
- //uuse#pragmapack(8),thealignisstill4BYTE!
- }
- #include<iostream>
- usingnamespacestd;
- classT{
- public:
- charaa;
- doublei;
- virtualinta(){}
- };
- intmain(){
- //cout<<&(((T*)1)->aa)<<endl;//canuseitinWindows!LInux:can't
- //gettheaa'saddr,togetthatthevptris
- //atthebeginningortheendoftheclassortheclassobject!
- T*a=newT;
- cout<<(int)&(a->aa)<<endl;
- cout<<(int)a<<endl;
-
- cout<<sizeof(T)<<endl;
- deletea;
- }
其实,一些很变态的使用操作都在上面了,这里仅仅是一些很少用到的东西,注意拉!