zoukankan      html  css  js  c++  java
  • 【C/C++学习】之四、static_cast

    用法:static_cast < type-id > ( expression )

     

    《C++primer 第四版》中说编译器隐式执行的任何类型转换都可以由static_cast显式完成!

    要注意的是,此转换没有运行时检测安全!他不能转换掉expression的const、volatile、或者__unaligned属性。他也不是用来去掉static属性的! 大家应该清楚static限定符吧,他会造成范围性的影响,而const则不同,他只是限定变量或对象自身!

    当你用static限定符限定一个变量的时候,就拿类中吧,他会随类的第一个实例对象的出现而出现,并且可以被这个类的所有对象所使用!!

    C++中的static_cast执行非多态的转换,用于代替C中通常的转换操作。

    对于我们的static_cast转换符,他不仅可以应用到指针和引用上,而且还可以应用到基础数据结构和对象上!如:

    	double da = 1.1;
    	void *pa = &da;
    	double *dp = static_cast<double*>(pa);
    
    	int ia = static_cast<int>(da);
    
    	cout << *dp << endl;
    	cout << ia << endl;

    OK,代码编译通过!

    《C++primer》告诉我们,对于一个由较大的算术类型到一个较小的类型的赋值,编译器通常会报错,然后当我们显示地提供强制类型转换的时候,警告信息就关闭了!

    要知道我们的static_cast的真正用处不是在指针的引用上,而是在基础类型的转换和对象的转换上!


    我们的static_cast也支持指向基类的指针和指向子类的指针之间的转换!

    如:

    class A
    {
    public:
    	virtual void  a()
    	{
    		cout << 'a' << endl;
    	}
    
    	virtual void b()
    	{
    		cout << 'a' << endl;
    	}
    
    private:
    	int i;
    };
    
    class B:public A
    {
    public:
    	virtual void a()
    	{
    		cout << 'b' << endl;
    	}
    };
    
    int main(void)
    {
    	A *pa = new A();
    	B *pb = static_cast<B*>(pa);
    
    
    	B *ppb = new B();
    	A *ppa = static_cast<A*>(ppb);
    
    	return 0;
    }

    OK,编译通过!

    但是在这里要注意的是,我们从基类转换到子类是一个不安全的行为,在这里先做了解,在下面的dynamic_cast中还会讲到这方面的问题!




    2012/8/5

    jofranks 于南昌

  • 相关阅读:
    Django(60)Django内置User模型源码分析及自定义User
    Django(59)验证和授权
    Django(58)viewsets视图集详解
    Django(57)Generic类视图
    正则表达式
    JMeter之检查点(JSON断言)
    JMeter之检查点(响应断言)
    JMeter之参数化(一)
    JMeter之一个简单的性能测试
    JMeter基础
  • 原文地址:https://www.cnblogs.com/java20130723/p/3211437.html
Copyright © 2011-2022 走看看