糟糕的const特性<2>
2015-09-19 12:22
253 查看
本文章将持续不断的吐槽const特性已经在开发中遇到的一些人对const的恶心用法。
const是C99,C++引入的关键字,意在防止变量的值被恶意修改。很多人喜欢使用这个特性,它在compile time 可以帮我们检查变量是否被恶意修改。但是const带来的副作用远远大雨它带来的好处。
1.复杂的使用方法
对,就是复杂的使用方法。去百度一下c++ const,随便点开一片文章,我敢打赌没有哪一篇文章不超过两页。(而那些博主在花了上千字的文章来介绍一个关键字后居然还有脸说const给我们带来了无尽的好处)
尤其是跟引用,指针,函数结合起来,规则多到你可以专门用两页纸来书写都写不完。
这么多的规则,我们在写代码时到底记得的能有几条?
请问自己以下几个问题:
请问const声明时放在*前面和后面有什么区别,用来修饰引用呢?怎么用来修饰指针的引用?
请问带const和函数不带const的函数有什么区别,如果函数是成员函数呢
...
一门编程语言应当做到语法尽量简单而组合出来的功能尽可能的强大。而const在语法上引入的混乱比它带来的好处简直要多得多。
2.函数的相互调用
Aaron编写了一个函数void func_a(const int a) {...}.然后在项目中到处调用了这个接口。后来Aaron离职了,Bill接替了他的工作。Bill现在要维护func_a, 它需要获取a的值,然后对这个值进行修改处理,于是Bill定义函数void func_b(int b)。然后调用func_b(a);
void func_a(const int a)
{
...
func_b(a);
...
}
这个时候编译器告诉它,禁止把const 类型的变量传递给非const的变量。
为了绕过编译器,Bill不得不定义了一个中间变量tmp_b,并将代码写成
void func_a(const int a)
{
...
int tmp_b = a;
func_b(tmp_b);
...
}
问题就在这里。如果变量a是一个数据很大的类型,中间变量的拷贝将会白白耗费很多内存空间。
而且我们仅仅为了这么一点点好处,却让代码的逻辑变得这么难看。
const是C99,C++引入的关键字,意在防止变量的值被恶意修改。很多人喜欢使用这个特性,它在compile time 可以帮我们检查变量是否被恶意修改。但是const带来的副作用远远大雨它带来的好处。
1.复杂的使用方法
对,就是复杂的使用方法。去百度一下c++ const,随便点开一片文章,我敢打赌没有哪一篇文章不超过两页。(而那些博主在花了上千字的文章来介绍一个关键字后居然还有脸说const给我们带来了无尽的好处)
尤其是跟引用,指针,函数结合起来,规则多到你可以专门用两页纸来书写都写不完。
这么多的规则,我们在写代码时到底记得的能有几条?
请问自己以下几个问题:
请问const声明时放在*前面和后面有什么区别,用来修饰引用呢?怎么用来修饰指针的引用?
请问带const和函数不带const的函数有什么区别,如果函数是成员函数呢
...
一门编程语言应当做到语法尽量简单而组合出来的功能尽可能的强大。而const在语法上引入的混乱比它带来的好处简直要多得多。
2.函数的相互调用
Aaron编写了一个函数void func_a(const int a) {...}.然后在项目中到处调用了这个接口。后来Aaron离职了,Bill接替了他的工作。Bill现在要维护func_a, 它需要获取a的值,然后对这个值进行修改处理,于是Bill定义函数void func_b(int b)。然后调用func_b(a);
void func_a(const int a)
{
...
func_b(a);
...
}
这个时候编译器告诉它,禁止把const 类型的变量传递给非const的变量。
为了绕过编译器,Bill不得不定义了一个中间变量tmp_b,并将代码写成
void func_a(const int a)
{
...
int tmp_b = a;
func_b(tmp_b);
...
}
问题就在这里。如果变量a是一个数据很大的类型,中间变量的拷贝将会白白耗费很多内存空间。
而且我们仅仅为了这么一点点好处,却让代码的逻辑变得这么难看。
相关文章推荐
- 采用jquery的imgAreaSelect样品图像裁剪示范插件实现
- jquery插件datepicker
- form表单与Servlet之间的参数传送
- 技术人生:故事之十七 ASP害得我好惨!
- jquery插件autocomplete
- surfaceView和View最本质的区别
- 关于unicode模式下CString 转LPCSTR问题
- ratingBarStylendicator的简单使用
- 技术人生:故事之十六 IE还是NetScape?
- ubuntu下一个jboss-seam-2.2.2.Final/examples/build.xml:754: warning: 'includeantruntime' was not set
- DALI模块
- MySQL Replication数据不一致 推荐
- JAVA中堆栈和内存分配原理
- 精品软件 推荐 Adobe Photoshop CC 2015(ps cc下载)16.0.0.88官方中文版
- 精品软件 推荐 Adobe Photoshop CC 2015(ps cc下载)16.0.0.88官方中文版
- 遍历itemList是否含有listWidget列表里的item,有则移除
- 网络调试命令nc命令使用详解
- UI样式的继承
- UITableView左右滑动删除常见问题
- Guava(四):集合基础总结之List