1.修饰全局变量
在全局变量前加关键字static,例如:
//此处g_count为全局变量
static int g_count;
此变量存储在静态存储区,在程序运行期间一直存在;如果未经初始化此变量,则会被自动初始化为0(自动变量的值是任意的);
作用域:在声明他的文件内
2.修饰局部变量
在局部变量前加关键字static,例如:
//此处i为局部变量
static int i;
初始化同上面全局变量;
作用域:只作用于定义他的函数或语句内,但是作用域结束并没有销毁,等下次调用该函数或语句时,值不变;例如:
void fun(){
static int a = 3;
a++;
cout << a << endl;
}
int main(){
fun();//输出4
fun();//输出5
return 0;
}
3.修饰函数
在函数的返回类型前加关键字static,例如:
static void fun(){
......
}
此函数只能在申明他的文件中可见;不会同其他cpp同名函数引起冲突
4.修饰类成员
在类的成员变量前加关键字static;
静态成员不属于对象成员,而是类成员,供所有对象使用;
5.修饰类成员函数
跟类的静态成员一样,属于类成员函数,不属于对象成员函数。对静态成员的引用不需要用对象名;
在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员;如果静态成员函数中要引用非静态成员时,可通过对象来引用;例如:
class Data{
public:
static int fun(){
Data d;
d.func();
return 1;
}
void func(){
cout << "hello" << endl;
}
};
int main(){
Data::fun();
return 0;
}
二、强制类型转换
1.const_cast
将const变量转化为非const变量,例如:
const int a = 10;
int *p = const_cast<int*>(&a);
*p = 3;
2.static_cast
用于各种隐式转换,比如将非const转换为const,void*转指针等;例如
double b = 12.34;
int c = static_cast<int>(b);
3.dynamic_cast
用于动态类型转换,即用于将一个父类对象的指针转换为子类对象的指针或引用(动态转换),只能用于含有虚函数的类,例如
class A
{
public:
virtual void f(){}
};
class B : public A
{};
int main()
{
//A a;
//B *b = dynamic_cast<B*>(&a);
//cout << b << endl;
//cout << &a << endl;
B c;
A *d = dynamic_cast<A*>(&c);
cout << &c << endl;
cout << d << endl;
return 0;
}
向上转换:指的是子类向基类的转换
向下转换:指的是基类向子类的转换
向下转化时,如果是非法的对于指针返回NULL,对于引用抛异常;
4.reinterpret_cast
通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型,几乎什么都可以转,比如将int转指针,可能会出问题,尽量少用
5、为什么不使用C的强制转换?
C的强制转换表面上看起来功能强大什么都能转,但是转化不够明确,不能进行错误检查,容易出错。