认识static关键字以及四种强制类型转换

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的强制转换表面上看起来功能强大什么都能转,但是转化不够明确,不能进行错误检查,容易出错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值