最近我一直在用文件流做很多练习。当我使用fstream.write(...)
时
例如写一个10个整数的数组(intArr[10]
)我写道:
fstream.write((char*)intArr,sizeof(int)*10);
(char*)intArr
- 演员安全吗?到目前为止我没有遇到任何问题,但是我了解了static_cast
(c ++方式正确吗?)并使用了static_cast<char*>(intArr)
但它失败了!我无法理解......我应该改变我的方法吗?
答案 0 :(得分:5)
静态演员不是正确的事。当有问题的类型可以自然转换时,您只能执行静态转换。但是,不相关的指针类型不可以隐式转换;即T*
一般不能转换为U*
或来自int intArr[10];
myfile.write(reinterpret_cast<const char *>(intArr), sizeof(int) * 10);
。你真正在做的是重新解释演员:
(char *)
在C ++中,C风格的转换const_cast
成为最合适的转换类型,其中最弱的是重新解释转换。使用显式C ++样式转换的好处是,您可以证明您了解所需的转换类型。 (此外,没有C等效于float q = 1.5;
uint32_t n = static_cast<uint32_t>(q); // == 1, type conversion
uint32_t m1 = reinterpret_cast<uint32_t>(q); // undefined behaviour, but check it out
uint32_t m2 = *reinterpret_cast<const uint32_t *>(&q); // equally bad
。)
注意差异可能是有益的:
uint32_t m;
char * const pm = reinterpret_cast<char *>(&m);
const char * const pq = reinterpret_cast<const char *>(&q);
std::copy(pq, pq + sizeof(float), pm);
偏离主题:编写最后一行的正确方法涉及更多,但使用了大量的投射:
{{1}}