C++11 指针类型与赋值

不能用类型不匹配的指针来完成赋值,如下代码是错的:

int i = 0;
double *dp = &i;    // 非法,类型不匹配

但是 void* 可用于存放任意对象的地址:

int i = 42;
void *p = &i;    // 合法

还有特殊字面值 nullptr,可以转换成任意其它的指针类型,用来判断指针是否指向了一个合法的对象。

如果一定要完成指针的类型转换,可以使用 C++11 的几种强制类型转换:

  1. 指针类型转换 (reinterpret_cast)
int *pint = 1;
char *pch = reinterpret_cast<char *>(pint);
  1. 涉及到 const 的指针类型转换 (const_cast)
const int num[5] = { 1,2,3,4,5 };
const int *p = num;
int *pint = const_cast<int *>(p);
  1. 子类指针转化为父类指针 (dynamic_cast)
class man {
public:
    int name;
    // 加上 virtual 关键字, 可以使得父类用子类初始化后可以调用子类的函数
    virtual void run() {
        cout << "man is running" << endl;
    }
};

class son : public man {
public:
    void run() {
        cout << "son is running" << endl;
    }
};

void main()
{
    man *pman = new man;
    son *pson = new son;
    //子类指针转换为父类指针, 但是还是调用子类的函数
    man *pfu = dynamic_cast<man *>(pson);
    pfu->run();
}

推荐阅读更多精彩内容