首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

const_cast带来的常引用的有关问题

2013-07-04 
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,那么就不想在函数里面去修改,违背了当初设计函数的时候意愿,实际开发过程中不太会遇到这种情况吧

[解决办法]
引用
b直接被const_cast修改了,虽然传引用效率高些
但是在有敌意的环境下貌似还是很危险的

1. 引用效率高些? 未必。 
2. 编译器会尽量帮你写出安全代码,用了const_cast就是拒绝编译器的好意,你就是声称自己对此负责。 
[解决办法]
引用:
引用:引用b直接被const_cast修改了,虽然传引用效率高些
但是在有敌意的环境下貌似还是很危险的
1. 引用效率高些? 未必。 
2. 编译器会尽量帮你写出安全代码,用了const_cast就是拒绝编译器的好意,你就是声称自己对此负责。


什么时候引用效率比较低,能举个例子吗,谢谢




int foo(int a)
{
  int b = a;
}

int bar(int const& a)
{
  int b = a; //间接访问,类似于指针
}

[解决办法]
引用:
引用:引用:引用b直接被const_cast修改了,虽然传引用效率高些
但是在有敌意的环境下貌似还是很危险的
1. 引用效率高些? 未必。 
2. 编译器会尽量帮你写出安全代码,用了const_cast就是拒绝编译器的好意,你就是声称自己对此负责。


什么时候引用效率比……

搭车问一下,很多直接传值的int参数都不加const,这里有什么讲究的吗?因为我自己是觉得加了比较安全,传进去的值被修改也没有意义。
[解决办法]
引用:
搭车问一下,很多直接传值的int参数都不加const,这里有什么讲究的吗?因为我自己是觉得加了比较安全,传进去的值被修改也没有意义。


作为形参: 

T t; //值语义
T& t;//引用语义,类似于指针
T const& t;//值语义,却避免值拷贝的开销

int const& a;//设计上没有必要,因为int没有值拷贝开销问题。直接用int a,简单明了,效率还高 
[解决办法]
引用:
引用:引用:搭车问一下,很多直接传值的int参数都不加const,这里有什么讲究的吗?因为我自己是觉得加了比较安全,传进去的值被修改也没有意义。

作为形参: 

T t; //值语义
T&amp;amp; t;//引用语义,类似于指针
T const&amp;amp; t;//值语……


没有值拷贝的开销
------解决方案--------------------


不要纠结各种常量了,这个世界上唯一不变的就是变化。用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. 

热点排行