c++类型转换

1.类型准换

c++是强类型语言。很多的转换(特别是对转换值产生不同的解释的转换)都需要显示进行,c++称之为类型转换。一般的类型转换存在两种转换语法:函数式和C风格式。

double x = 10.3;
int y;
y = int (x);    // 函数式
y = (int) x;    // C风格式

这两种风格的转换对于基础数据类型的转换是够用了,但是对于类与类,类与指针之间的转换却未加区别,这就会导致代码编译通过,但是可能发生运行时错误。见下面的例子:

#include <iostream>
using namespace std;

class Dummy {
    double i,j;
};

class Addition {
    int x,y;
  public:
    Addition (int a, int b) { x=a; y=b; }
    int result() { return x+y;}
};

int main () {
  Dummy d;
  Addition * padd;

  padd = (Addition*) &d;
  cout << padd->result();
  return 0;
}


在上述代码中声明了一个指向Addition的指针padd,但是却使用显示的类型转换给它赋值了一个与它所指类型不相干的对象的地址。
padd = (Addition*) &d;
不加限制的显示类型转换允许将任何一个指针转换成另外一个指向不同类型的指针,这种转换完全独立于指针所指对象的类型。随后调用result函数,将会导致一个运行时错误或者其他不可预知的错误。

为了控制类之间类似的转换,c++提供了四种转换控制符:

dynamic_cast <new_type> (expression)
reinterpret_cast <new_type> (expression)
static_cast <new_type> (expression)
const_cast <new_type> (expression)
这四种转换类似于传统的转换:
(new_type) expression
new_type (expression)
但是每一种转换都有其特性。

2.dynamic_cast

该运算符把expression转换成new_type的对象。new_type必须是类指针,类的引用或者void×。它的目的是确保转换的结果指向一个有效的完整的目的指针所指向的类型。dynamic_cast不仅支持pointer upcast (converting from pointer-to-derived to pointer-to-base),同时也支持downcast (convert from pointer-to-base to pointer-to-derived)。dynamic_cast可以在执行期决定真正的类型。如果downcast是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。如果downcast不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)。

// dynamic_cast
#include <iostream>
#include <exception>
using namespace std;

class Base { virtual void dummy() {} };
class Derived: public Base { int a; };

int main () {
  try {
    Base * pba = new Derived;
    Base * pbb = new Base;
    Derived * pd;

    pd = dynamic_cast<Derived*>(pba);
    if (pd==0) cout << "Null pointer on first type-cast.\n";

    pd = dynamic_cast<Derived*>(pbb);
    if (pd==0) cout << "Null pointer on second type-cast.\n";

  } catch (exception& e) {cout << "Exception: " << e.what();}
  return 0;
}
上面的代码将会输出:
Null pointer on second type-cast.

dynamic_cast的转换是和编译器相关的。比如,vc6.0的在使用dynamic_cast的时候需要打开RITI编译选项。同时在转换的时候,vc6.0需要转换的指针所指向的类必须是多态类。但是g++的做法却不一样。在进行downcast转换的时候,转换的指针所指向的类必须是多态类(比如含有虚函数),但是如果进行pointer upcast转换的时候,没有这个限制。

3.static_caststatic_cast

可以在指向有联系的类的指针之间进行准换。同时支持upcasts和downcasts。但是不执行运行期间类型安全检查,不保证转换结果的完整性。

class Base {};
class Derived: public Base {};
Base * a = new Base;
Derived * b = static_cast<Derived*>(a);
以上代码是合法的,但是在运行期间会发生错误。

static_cast还能进行如下转换:

  • 将void*转换成任意的指针类型;
  • 把整数,浮点数,枚举转换成枚举类型;
  • 显示的调用copy  constructor或者operator操作符
  • 把一个右值准换成引用

关于“显示的调用copy  constructor或者operator操作符”例子如下:

#include <iostream>
#include <exception>
using namespace std;
class A{
public:
    A() {
        cout<<"A constructor"<<endl;
    }

    A(A&){
        cout<<"A copy constructor"<<endl;
    }

    A& operator=(A& a){
        cout<<"A copy assign"<<endl;
        return *this;
    }
};
int main () {
    A a1;
    A a2;
    a2 = static_cast<A>(a1);
    return 0;
}

a2 = static_cast<A>(a1)首先会根据a1调用A的copy constructor构造一个临时的对象,然后调用a2的copy assign操作符给a2赋值。

所以运行结果为:
A constructor
A constructor
A copy constructor
A copy assign

3.reinterpret_cast

reinterpret_cast把一个指针转换成另外一个指针,即使这两个指针所指向的对象没有任何的联系。

4.const_cast

该运算符用来修改类型的const或volatile属性。

5.typeid

typeid的表达式如下:
typeid(e)
这里e是任意表达式或者类型名。如果表达式的类型是类类型且该类含有一个或者多个虚函数,则表达式的动态类型可能不同于它的静态编译时的类型。typeid的结果是返回名为type_info的标准库类型的对象引用。

6.参考资料

《c++ primer》
《百度百科》
http://www.cplusplus.com/doc/tutorial/typecasting/
## 软件功能详细介绍 1. **文本片段管理**:可以添加、编辑、删除常用文本片段,方便快速调用 2. **分组管理**:支持创建多个分组,不同类型的文本片段可以分类存储 3. **热键绑定**:为每个文本片段绑定自定义热键,实现一键粘贴 4. **窗口置顶**:支持窗口置顶功能,方便在其他应用程序上直接使用 5. **自动隐藏**:可以设置自动隐藏,减少桌面占用空间 6. **数据持久化**:所有配置和文本片段会自动保存,下次启动时自动加载 ## 软件使用技巧说明 1. **快速添加文本**:在文本输入框中输入内容后,点击"添加内容"按钮即可快速添加 2. **批量管理**:可以同时编辑多个文本片段,提高管理效率 3. **热键冲突处理**:如果设置的热键与系统或其他软件冲突,会自动提示 4. **分组切换**:使用分组按钮可以快速切换不同类别的文本片段 5. **文本格式化**:支持在文本片段中使用换行符和制表符等格式 ## 软件操作方法指南 1. **启动软件**:双击"大飞哥软件自习室——快捷粘贴工具.exe"文件即可启动 2. **添加文本片段**: - 在主界面的文本输入框中输入要保存的内容 - 点击"添加内容"按钮 - 在弹出的对话框中设置热键和分组 - 点击"确定"保存 3. **使用热键粘贴**: - 确保软件处于运行状态 - 在需要粘贴的位置按下设置的热键 - 文本片段会自动粘贴到当前位置 4. **编辑文本片段**: - 选中要编辑的文本片段 - 点击"编辑"按钮 - 修改内容或热键设置 - 点击"确定"保存修改 5. **删除文本片段**: - 选中要删除的文本片段 - 点击"删除"按钮 - 在确认对话框中点击"确定"即可删除
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值