const_cast带来的常引用的问题//大家觉得常引用安全吗,比方说如下使用就有问题//b直接被const_cast修改了,
const_cast带来的常引用的问题
//大家觉得常引用安全吗,比方说如下使用就有问题
//b直接被const_cast修改了,虽然传引用效率高些
//但是在有敌意的环境下貌似还是很危险的
//亲们,你们怎么看?
#include <iostream>
using namespace std;
class A{
public:
A() { m_b=new int;}
void set(const int &b)
{
m_b=&(const_cast<int&>(b));
*m_b=1;
}
int get() const { *m_b=3; return *m_b;}
private:
mutable int *m_b;
};
void main()
{
A *a=new A;
int b=2;
a->set(b);
cout<<b<<endl;
cout<<a->get()<<endl;
system("pause");
}
[解决办法]技术被滥用总是有危险的
[解决办法]通过编译的程序不一定是正确的.
任何尝试修改const 变量,行为未定义. 有未定义行为的程序可以理解为错误的程序.
GOOGLE 行为未定义
[解决办法]const始终是一个编译时约定,不是运行时约定……
有敌意的环境可以发生在很多阶段,比如编写时,预处理时,编译时,运行时,
预处理时举个例子
#define const
[解决办法]但是既然传的是const,那么就不想在函数里面去修改,违背了当初设计函数的时候意愿,实际开发过程中不太会遇到这种情况吧
[解决办法]1. 引用效率高些? 未必。
2. 编译器会尽量帮你写出安全代码,用了const_cast就是拒绝编译器的好意,你就是声称自己对此负责。
[解决办法]
int foo(int a)
{
int b = a;
}
int bar(int const& a)
{
int b = a; //间接访问,类似于指针
}
[解决办法]搭车问一下,很多直接传值的int参数都不加const,这里有什么讲究的吗?因为我自己是觉得加了比较安全,传进去的值被修改也没有意义。
[解决办法]作为形参:
T t; //值语义
T& t;//引用语义,类似于指针
T const& t;//值语义,却避免值拷贝的开销
int const& a;//设计上没有必要,因为int没有值拷贝开销问题。直接用int a,简单明了,效率还高
[解决办法]没有值拷贝的开销
------解决方案--------------------
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
[解决办法]个人意见:如果你的变量不是保存在ROM或CD-ROM中的话,总是有办法修改的。
何况就算保存在ROM或CD-ROM中也能用木马技术让你以为其值被修改。
[解决办法]为什么不把class A做成wrapper?
#include <iostream>
class A{
public:
A(int value):_value(value){}
int _value;
};
class B{
public:
B(const A *a):_a(a){}
int Get() const {
return _a == NULL ? 0 : _a->_value;
}
private:
const A *_a;
};
int main(void){
A *a = new A(10);
B b(a);
std::cout << b.Get() << std::endl;
return 0;
}
[解决办法]自己给自己挖了个坑,然后跳进去了。。
声明为const 在编译器就是告诉其他人,其值不能更改(警告),如果你不理此警告,更改了带来的意想不到的后果,你责任自负,
那为什么要有const_cast呢???让你能对非const赋值。。仅此而已
[解决办法]不敢直视., 看到2个new, 没看到一个delete.