0x01 C++的static关键字主要在以下场景中用到 1)static修饰全局变量和局部变量 全局变量属于数据,放在.data或.bss段,如果是常量字符串的话,那就放在.rodata段,接下来看一下一个普通全局变量和static全局变量有什么区别? int gdata1 = 10; static int gdata2 = 10; int main() { return 0; } Linux下创建a.c文件,查看符号表: delphi@delphi-vm:~$ g++ -c a.cpp -o a.o delphi@delphi-vm:~$ objdump -t a.o a.o: file format elf32-i386 SYMBOL TABLE: 00000000 l df *ABS* 00000000 a.cpp 00000000 l d .text 00000000 .text 00000000 l d .data 00000000 .data 00000000 l d .bss 00000000 .bss 00000004 l O .data 00000004 _ZL6gdata2 00000000 l d .note.GNU-stack 00000000 .note.GNU-stack 00000000 l d .eh_frame 00000000 .eh_frame 00000000 l d .comment 00000000 .comment 00000000 g O .data 00000004 gdata1 00000000 g F .text 0000000a main 00000000 *UND* …
开心一刻: 每当对象迷了路,this月老闪现出来说:"跟哥走"。 ---> 剧终 下面是一段最简单的代码: class Test { public: void func() { cout<<"mvalue:"<<mvalue<<endl; } private: int mvalue; }; int main() { Test t1,t2; t1.func(); t2.func(); return 0; } 一个Test类可以生成很多对象,每个对象都有自己的成员变量mvalue值,但是所有对象共享成员方法,比如这里的func成员函数,那么通过不同的对象t1和t2来调用同一个func方法,这个func方法怎么知道打印谁的mvalue值呢?对了,就是this指针的作用,看看调用具体是怎么发生的,如下: t1.func() ====> Test::func(&t1); t2.func() ====> Test::func(&t2); 通过t1和t2对象来调用成员方法func,实际在汇编上,是调用了类Test作用域下的func方法,把调用方法的对象当做实参传递进去了,那么既然编译器自己把对象的地址当做实参进行传递,相应的它就得加个形参来就收,因此,上面的代码经过编译器编译后,就编程这样了: class Test { public: void func(Test *const this) { cout<<"mvalue:"<<mvalue<<endl; } pr…