#include<iostream>//1. 在class内使用static,表示所有类的实例共享这一成员,共享同一份内存//静态方法无法访问非静态变量/*2. 在class之外使用static,表示该变量只在该文件内可见
每个cpp文件为一个翻译单元,被是static修饰的全局变量仅在该文件中可见
两个文件中被static修饰同名全局变量不会发生定义冲突。
当想在当前文件(翻译单元)使用其它文件中公开的全局变量时,
要在当前翻译单元用extern声明它
一个常用做法是在头文件中用static修饰变量,当该头文件被多个cpp文件引入时会自动地将这些变量私有化
*//* 3.函数体中的static变量
函数体中的static变量相当于可见范围被限制在函数体中的全局变量,其生存周期几乎为整个进程的周期
被static修饰声明的变量仅仅在第一次会被初始化并赋值,再次进入该函数时这句初始化将不起实质作用,仅仅引用已经存在变量的值
*/classEntity{public:int x, y;staticint share;voidprint(){
std::cout << x <<","<< y << std::endl;}};voidinc(){staticint i =1;
std::cout << i++<< std::endl;}int Entity::share =100;//静态成员变量需要在外部定义,并且不能在未定义的情况下直接使用intmain(){
Entity e ={3,6};
Entity::share =100;
e.print();inc();inc();inc();
std::cin.get();exit(0);}
继承
#include<iostream>//继承减少了代码重复 classEntity{// 实体类public:Entity(){
x =0;
y =0;
std::cout <<"initing..."<< std::endl;}float x, y;voidmove(float a,float b){
x += a;
y += b;
std::cout << x <<","<< y << std::endl;}private:int passwd;};classPlayer:publicEntity{//玩家类将包含Entity所有public级别的成员public:int age;char* name;};intmain(){
Player p;//调用自己的构造函数时,将会先调用父类的构造函数
p.move(2,3);exit(0);}
#include<iostream>//在任何地方都用初始化列表来对成员变量进行初始化classInfo{public:Info(){
std::cout<<"info is initing .."<< std::endl;}Info(const std::string& s){
std::cout<<"info is initing by "<< s << std::endl;}};//初始化列表要求列出的成员变量的顺序必须是按照类中的声明顺序。//并且,初始化列表是必须的。即便某个成员变量没有在初始化列表中进行初始化,编译器也会在每个构造函数的开始处调用该成员的默认构造函数://因此若不用初始化列表,而在函数体内进行初始化,则会造成对同一成员变量的重复初始化。classPerson{private:
Info info;int age;public:Person(const std::string& s){// 对成员info的首次初始化:调用Info的默认构造函数
info =Info(s);//对成员info的第二次初始化}};intmain(){
Person *p =newPerson("PP");return0;}