我有以下代码由于编译失败 invalid conversion from ‘const int*’ to ‘int*’ [-fpermissive]
#include#include using namespace std; #define N 3 void f(int *p) { *p=8; } class A { private: int a; public: void init() const; void print() const {cout< 这并不奇怪,因为"init"函数的"const"限定符.
但是,以下代码编译并运行顺利,
#include#include using namespace std; #define N 3 void f(void **pp) { *pp = new int[N]; } class A { private: int * p; public: void init() const; void assign() {for (size_t i=0; i 问题:在第二种情况下,为什么"const"函数(init)可以修改其成员(p)?
你的C风格的演员正在进行const_cast
(除其他事项外),这使你可以获得非const对象的可写视图,即使你拥有的只是一个只读视图.
但是,如果你不小心,它可能会破坏(导致未定义的行为).考虑:
const A a; int main() { a.init(); //a.assign(); a.print(); }
如果您的工具链放入a
只读内存,那么在运行时可能会失败.
const
在C++中,private
不提供安全性.它是类型系统的一部分,并利用编译器的类型检查器来帮助您捕获编码错误.但是输入信息总是可以用强制转换覆盖.
最后,如果你不想意外抛弃const
,不要使用C风格的演员表.如果您使用过static_cast
或者reinterpret_cast
编译器会遇到错误.