VC中静态变量Static
vc中没有强制的数据类型间转换,java和C都有的:
例如:vc中:
int a=0xfffe; //即65534
char b=a; 编译不出错
str.Format("%d",b);
MessageBox(str); //结果为-2
java中:
int a=0xfffe; //即65534
byte b=a; 编译出错,需要改成byte b=(byte)a
静态变量(static).静态变量之所以是因为静态,是因为他在整个程序生命周期的地址静止不变。也就是说在整个程序里面只保存有一份拷贝。static关键字允许它在不同的函数调用间保持它的值。如果一个静态变量被访问后值改变,它就会保持新的值。如果这变量再次被访问,它将会维持最新的值
class Test1{ public: static int a; const int b; Test1():b(10){ } void print1(){ a++; printf("%d,%d\n",a,b); } }; int Test1::a=10; void main(){ Test1 t1; t1.print1(); Test1 t2; t2.print1(); Test1 t3; t3.print1(); }
结果:11 12 13
在c++中,static静态成员变量不能在类内部初始化。int Test1::a=10;
在c++中,const常量成员变量也不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。在构造函数中初始化都不行
C++中常见的关键字含义:
1. inline:定义内联函数,该关键字是基于定义,如果只在函数声明时给出inline,则函数不会被认为是内联函数,所以必须在函数定义的地方也加上inline,同时inline只是向编译器建议函数以内联函数处理,不是强制的。
2. const:定义常成员,包括const数据成员和const成员函数,const数据成员必须,也只能通过构造函数的初始化列表进行初始化,const成员函数只能访问类的成员,不能进行修改,如果需要修改,则引入下面的mutable关键字。
3.mutable:这个关键字的引入是解决const成员函数要修改成员变量,通常而言,const成员函数只能访问成员变量,不能修改,但是如果成员变量被mutable修饰了,则在const成员函数中可以修改该变量。mutable和const不能同时用于修饰成员变量。
4. static:声明静态成员,包括静态数据成员和静态成员函数,它们被类的所有对象共享,静态数据成员在使用前必须初始化,而静态成员函数只能访问静态数据成员,不能访问非静态数据成员,因为该函数不含有this指针。
5. virtual:声明虚函数,用于实现多态,该关键字是基于声明的。
6. friend:声明友元函数和友元类,该关键字也是基于声明的。
7. volatile:被该关键字修饰的变量是指其值可能在编译器认识的范围外被修改,因此编译器不要对该变量进行的操作进行优化。可以与const同时修饰一个变量。
为什么需要const成员函数?
我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员(普通成员),,对常对象和常量进行访问。也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。其实,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。