Bug Found:避免成员函数参数名字与类成员名字相同
2013-03-02 15:12
253 查看
最近在写一个任意数据类型调用lua的模块,在我有点眼困的时候被BUG乘虚而入,差点破坏了我整个工程,幸好我有一种习惯,会用记事本把稳定版本的主要代码保存下来,才让我的代码在修改BUG过程中的突发情况下得以生存。
这次BUG的原因很简单:
__:
函数setID(const char * id )的参数列表命名不应该和类成员id一致,如果百密一疏漏写了参数名字,会使得id赋值失败,id指向一堆无用内存,在以后使用成员id的过程中发生内存错误。
如果参数的名字和成员的名字不一样,e.g. __id ,编译器会在编译时为你提供一条错误消息,而不会让你的程序在运作中才出现问题。
同样,如果函数声明和定义分开,最好把参数名字写上,可以避免上述疏漏之余,还起到注释的作用。
这次BUG的原因很简单:
#include <iostream> using namespace std; inline void Assignment(char* &left_str,const char* right_str){ if( right_str){ left_str = new char[strlen(right_str)+1]; strcpy(left_str,right_str); } else cerr<<"right_str is nil .\n"; }; class Test{ public: char *id; Test(){ setID("IDTesting"); } void setID(const char * /*id*/ ){ //参数列表应为(const char *id) ,参数与成员的名字相同会为bug提供藏身之处 Assignment(this->id,id); } //上面函数没有参数名字,编译时没有提示信息,但使用时会使内存出错 void show(){ cout<<id<<'\n'; }; }; int main(){ Test test; test.show(); getchar(); return 0; }
__:
函数setID(const char * id )的参数列表命名不应该和类成员id一致,如果百密一疏漏写了参数名字,会使得id赋值失败,id指向一堆无用内存,在以后使用成员id的过程中发生内存错误。
如果参数的名字和成员的名字不一样,e.g. __id ,编译器会在编译时为你提供一条错误消息,而不会让你的程序在运作中才出现问题。
同样,如果函数声明和定义分开,最好把参数名字写上,可以避免上述疏漏之余,还起到注释的作用。
相关文章推荐
- 父类和子类的同名成员函数参数格式相同,返回值类型不同
- 如果虚函数在基类与子类名字相同,而参数类型不同不会进行迟后联编
- 避免对函数中继承得来的默认参数值进行重定义
- a[9]与9[a]的确是相同的,以及函数内部如何得到传入数组参数的大小
- 线程的封装技巧:把任意类的成员函数指针作为参数
- CEDIT 控件 SetSel 成员函数 参数类型导致出错
- 已定义了一个具有相同参数类型的成员
- 在名字空间中声明类和成员函数
- 编写高质量代码改善C#程序的157个建议[优先考虑泛型、避免在泛型中声明静态成员、为泛型参数设定约束]
- 类的成员函数参数定义为类的对象(匿名对象)
- 类成员函数参数和类成员变量的可见性
- 在 const 和 non-const 重载的成员函数中避免代码重复
- VS2013 bug : 无法使用std::function包装成员函数
- 类对象及类成员函数作为函数参数的方法
- [Effective C++]条款30: 避免这样的成员函数:其返回值是指向成员的非const指针或引用,但成员的访问级比这个函数要低
- 第十七章 特殊成员_函数指针也可以做为参数
- 代码片段--参数相同函数调用机制
- C++关于类成员函数在参数列表后加const的作用,以及使用条件
- const限定修饰符用法总结(常量,指针,迭代器,函数参数,成员函数)
- 定义一个圆类(Circle),私有数据成员为半径(radius)、圆周长和面积,共有成员函数为输入半径;计算周长、面积;输出半径、周长和面积。要求定义构造函数(以半径为参数,缺省值为0,周长和面积在