Regular cast vs. static_cast vs.dymamic_cast in C++

介绍C++类型转换的用法。

1.static_cast

static_cast用与强制隐式类型转换,即隐式类型转换的反方向。static_cast,限制条件少,不进行运行时检验。

必须用于当你知道对象的具体类型时,这样检验是不必要的,否则,不安全。

example:

void func(void *data) {
  // Conversion from MyClass* -> void* is implicit
  MyClass *c = static_cast<MyClass*>(data);
  ...
}

int main() {
  MyClass c;
  start_thread(&func, &c)  // func(&c) will be called
      .join();
}

在这个例子中,你已经知道传入的是一个MyClass 对象,没有必要进行运行时检验。

如果将一个非MyClass 对象传入func中,会如何呢,看下面code,

#include<iostream>
using namespace std;
class A{
	public:
		A()
		{
			i=0;
			j=12;
		}
		int i;
		int j;
};

void cast_f(void *ptr)
{
	A * p=static_cast<A *>(ptr);
	cout<<p->i<<endl;
	cout<<p->j<<endl;
}
int main()
{
	int a=11;
	int * p=&a;
	cast_f(p);
	cin.get();
	return 0;
}

输出11和一个未知数。而不是0和12。 这就要我们确保已知传入的对象类型。否则,不安全。

2.dynamic_cast

dynamic_cast用在当你不知道对象的动态类型是什么的时候,而你想在一个你认定为继承类对象身上执行继承类的操作函数,但你的手上却只有一个指向基类对象的指针或者引用。若为downcast并且类型参数不为多态时,不能使用dynamic_cast,编译器报错。

dynamic_cast 返回一个null指针,如果对象的类型不是以将要转换为的类型为基类的话。即,非派生类对象转为基类对象,或者基类对象转为派生类对象,均返回null指针。

#include<iostream>
using namespace std;
class A{
	public:
		virtual void f(){
			cout<<"A"<<endl;
		}
};
class B:public A{
	public:
	void dynamic_f()
	{
		cout<<"called dynamic_f()"<<endl;
	}
};
int main()
{
	A a;
	B *b=dynamic_cast<B *>(&a);//when downcast, if a is not object of class B,return null pointer.
	if(!b)
	{
		cout<<"null"<<endl;
	}
	else
	{
		cout<<"not null"<<endl;
	}
	A *aa=0;//基类指针
	B bb;
	aa=&bb;//指向派生类
	//aa如何调用dynamic_f()呢? aa.dynamic_f()当然不行了,编译不通过
	B *ba=dynamic_cast<B*>(aa);
	ba->dynamic_f();
	cin.get();
	return 0;
}

这个例子中,将基类对象转换为派生类对象,返回一个null指针。

up-cast(向上转换)是隐式转换,对static_cast,dynamic_cast,without any cast均有效。

3.Regular cast

Regular cast 又称为C风格类型转换。C-style cast,结合const_cast,static_cast,reinterpret_cast,但是它是不安全的,因为不支持dynamic_cast。

通常在数字转换时用C-style cast,其他用c++风格的cast。另外,c++风格的更易读。

Regular cast vs. static_cast vs.dymamic_cast in C++,布布扣,bubuko.com

时间: 2024-08-03 15:06:11

Regular cast vs. static_cast vs.dymamic_cast in C++的相关文章

c++ cast operator(类型转换操作符)

复制于:http://xiaochonganty.blog.163.com/blog/static/48527932008931104132748/ New Cast Operators Originally, the C++ standardization committee wanted to deprecate C-style casting, thereby enforcing the use of the new cast operators exclusively. However,

条款3:尽可能的使用const

const成员函数的一般好处有: 它使得class接口比较容易理解. 它使得操纵const对象成为可能. 使用的过程中应该在const与non const成员函数之间避免代码重复: class TextBlock { public: ... const char & operator[](std::size_t position)const { ... //边界检查 ... //日志数据访问 ... //校验数据完整性 return text[position]; } char & ope

C++11 之 scoped enum

  C++11 枚举类型是“域化的” (scoped enum),相比 C++98 枚举类型的“非域化” (unscoped enum),具有如下优点: 1  命名空间污染  一般来说,声明在花括号内的名字,其可见性限制在由花括号定义的作用域内,但是非域化枚举 (unscoped enum) 却是例外 enum Color { black, white, red }; // black, white, red are in same scope as Color auto white = fal

static_tast(C++)

static_cast <new_type> (expression) 虽然const_cast是用来去除变量的const限定,但是static_cast却不是用来去除变量的static引用.其实这是很容易理解的,static决定的是一个变量的作用域和生命周期,比如:在一个文件中将变量定义为static,则说明这个变量只能在本Package中使用:在方法中定义一个static变量,该变量在程序开始存在直到程序结束:类中定义一个static成员,该成员随类的第一个对象出现时出现,并且可以被该类的

C/C++面试题目总结

目录 1. 多态性都有哪些?动态绑定怎么实现? 3 2. 虚函数,虚函数表里面内存如何分配? 3 3. 纯虚函数如何定义,为什么析构函数要定义成虚函数? 4 4. C++中哪些不能是虚函数? 4 5. 类型转换有哪些? (参考) 4 6. 为什么要用static_cast转换而不用c语言中的转换? 4 7. 操作符重载(+操作符),具体如何去定义? 5 8. 内存对齐的原则? 5 9. 内联函数与宏定义的区别? 5 10. 关键字static.extern.const.typedef 5 11.

条款2. 最好使用C++转型操作符

C++提供了four cast operators: static_cast,const_cast,dynamic_cast and reinterpret_cast. 1. static_cast 用来进行基本类型数值间的转换,例如:int --- char,安全由程序员进行控制. 不能用于无关类型间指针间的转换,例如:int* --- double* 编译出错. 将null pointers – other pointers. 基类和派生类之间指针或者引用的转换.up-casting (把派

C++ 基础知识汇总 持续更新

摘录一些C++面试常考问题,写一些自己的理解,欢迎来摘果子. static关键字 用于声明静态对象: 静态函数只在本文件可见.(默认是extern的) 全局静态对象:全局静态对象,存储在全局/静态区,作用域整个程序,在程序结束才销毁: 局部静态对象:在函数内部加上static声明的变量,在首次调用时初始化,然后一直驻留在内存,作用域是该函数,可用于函数调用计数(primary有例子),程序结束释放: 静态数据成员:归属于类,类对象共享,类外初始化,类对象可访问: 静态函数成员:归属于类,只能访问

C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast

1. c强制转换与c++强制转换 c语言强制类型转换主要用于基础的数据类型间的转换,语法为: (type-id)expression//转换格式1 type-id(expression)//转换格式2 c++除了能使用c语言的强制类型转换外,还新增了四种强制类型转换:static_cast.dynamic_cast.const_cast.reinterpret_cast,主要运用于继承关系类间的强制转化,语法为: static_cast<new_type> (expression) dynam

C++的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast(dynamic_cast还支持交叉转换,const_cast将一个类的const、volatile以及__unaligned属性去掉)

在C++中,存在类型转换,通常意味着存在缺陷(并非绝对).所以,对于类型转换,有如下几个原则:(1)尽量避免类型转换,包括隐式的类型转换(2)如果需要类型转换,尽量使用显式的类型转换,在编译期间转换(3)避免使用reinterpret_cast和老式的强制类型转换操作符通常,隐式的类型转换会导致警告,需要重视这些警告,并使用显式的类型转换代替,例如static_cast代替一些算术类型转换. 在C++中,对象的类型通常有如下几种:(一)内置类型,如int ,bool ,枚举类型等(二)自定义类型