点击上方“C语言与CPP编程”,选择“关注/置顶/星标公众号”
(资料图)
干货福利,第一时间送达!
你好,我是飞宇。
公司每年都会有一定的人员流动,相应地也会招一些应届生补充进来,指导应届生已经成为老员工的必修课了。
平日里会我们会经常帮新人排查代码中的问题,在此过程中发现了编程新手容易犯的一些编程错误,在此简单的总结一下,给新人们提供一个参考,希望能对大家有所帮助。
对于 C++ 类,一些关键字只要写在 .h 中就好,cpp 中就不用再加上了,比如 virtual、static 等关键字,如果在 cpp 中多写,编译器会报错。比如如下的虚接口与静态成员变量的定义,只要在头文件中声明就可以了。
classshape{virtualDraw();//...staticintnLevel;}
带有参数默认值的函数,默认值是加在函数声明处的,函数实现处的参数是不需要带上的。为了方便查看代码,在函数实现处的参数中,将默认值注释起来。正确的做法是,头文件中有默认值:
BOOLCreateConf(constCString&strConfName,constBOOLbAudio=FALSE);在函数实现处的参数中不用添加默认值:BOOLCreateConf(constCString&strConfName,constBOOLbAudio/*=FALSE*/);{//......}
在类的结尾处忘记添加分号,编译会报错,新人们有可能找了半天也没找出引起编译错误的原因。其实很简单,在类的结尾处忘记添加分号了。
classShape{//...};
在添加类的函数时,只在类的头文件中添加了函数声明,但在 cpp 中却没有添加函数的实现。如果其他地方调用到该函数,在编译链接的时候会报unresolved external symbol
错误。因为没有实现,所有没有供链接使用的 obj 文件。
在添加 C++ 类时,我们一般会添加 .h 头文件和一个 .cpp 源文件。结果忘记把 .cpp 文件添加到工程中了,即没有参与编译,没有生成供链接使用的 obj 文件。如果有代码调用到该 C++ 类的接口,则在编译链接的时候会报unresolved external symbol
错误,即链接不到该 C++ 类对应的接口。
在函数中返回了一个局部变量的地址或者引用,而这个局部变量在函数结束时其生命周期就结束了,内存就被释放了。当外部访问到该变量的内存,会触发内存访问违例的异常,因为该变量的内存已经释放了。比如如下的错误代码:
char*GetResult(){charchResult[100]={0};//......returnchResult;}
代码中本来要借助于 C++ 多态的虚函数调用,调用子类实现的接口,结果忘记在父类中将对应的接口声明为 virtual,导致没有调用到子类实现的函数。一定要记住,要实现多态下的函数调用,父类的相关接口必须声明为 virtual。
classShape(){//...virtualvoidDraw();//...}
有时我们需要调用一个接口去获取某些数据,接口中将数据拷贝到传入的参数对应的内存中,此时设计参数时会传入指针或引用。我们在调用GetData 之前定义了结构体指针p,并 new 出了对应的结构体对象内存,应该在定义 GetData 接口时应该使用双指针(指针的指针)的,结果错写成了单指针。
有问题的代码如下:
structCodecInfo//编码信息{ int nFrameRate;//...}CodecInfo*pInfo=newCodecInfo;GetAudioCodecPtr()->GetCodecInfo(pInfo);//调用AudioCodec::GetCodecInfo获取编码信息AudioCodec::GetCodecInfo(CodecInfo*pInfo)//此处的参数不应该使用单指针{memcpy(pInfo,m_codecInfo,sizeof(CodecInfo));}
上面中的AudioCodec::GetCodecInfo
接口的参数不应该为单指针,应该用双指针,修改后的代码应该如下:
AudioCodec::GetCodecInfo(CodecInfo**pInfo)//此处的参数类型使用双指针{memcpy(*pInfo,m_codecInfo,sizeof(CodecInfo));}
比如新人用 VS-MFC 库编写一个测试用的工具软件,结果在发布 release 版本程序时,没有将程序依赖的 C 运行时库带上,导致该工具软件在某些电脑中启动报错,提示找不到 C 运行时库:
因为程序中依赖了动态版本的运行时库和 MFC 库,在发布程序时要将这些库带上。有些系统中没有这些库,程序启动时就会报找不到库,就会启动失败。
本来应该要进行深拷贝的,却使用了浅拷贝(直接赋值),导致另个不同生命周期的 C++ 对象指向了同一块内存,一个对象将内存释放后,另一个对象再用到这块内存,就造成了内存访问违例,产生异常。
有个经典的 C++ 笔试题,让我们实现 String 类的相关函数,其主要目的就是用来考察对深拷贝与浅拷贝的理解的。题目中给出 String类的声明:
classString{public:String();String(constString&str);String(constchar*str);String&operator=(Stringstr);char*c_str()const;~String();intsize()const;private:char*data;};
让写出上述几个函数的内部实现。这些函数的实现代码如下:
//普通构造函数String::String(constchar*str){if(str==NULL){ m_data = new char[1];//得分点:对空字符串自动申请存放结束标志"\0"的,加分点:对m_data加NULL判断*m_data="\0";}else{intlength=strlen(str);m_data=newchar[length+1];//若能加NULL判断则更好strcpy(m_data,str);}}//String的析构函数String::~String(void){delete[]m_data;//或deletem_data;}//拷贝构造函数String::String(const String &other)//得分点:输入参数为const型{intlength=strlen(other.m_data);m_data=newchar[length+1];//若能加NULL判断则更好strcpy(m_data,other.m_data);}//赋值函数String & String::operator =(const String &other)//得分点:输入参数为const型{if(this ==&other)//得分点:检查自赋值return*this;if(m_data) delete[] m_data;//得分点:释放原有的内存资源intlength=strlen(other.m_data); m_data = new char[length + 1];//加分点:对m_data加NULL判断strcpy(m_data,other.m_data);return*this;//得分点:返回本对象的引用}
简单分享快乐学习,欢迎分享,点赞,在看。
你好,我是飞宇,本硕均于某中流985 CS就读,先后于百度搜索以及字节某电商部门担任Linux C/C++后端研发工程师。
同时,我也是知乎博主@韩飞宇,日常分享C/C++、计算机学习经验、工作体会,欢迎点击阅读原文围观我分享的学习经验
我组建了一些社群一起交流,群里有大牛也有小白,如果你有意可以一起进群交流。
欢迎你添加我的微信,我拉你进技术交流群。此外,我也会经常在微信上分享一些计算机学习经验以及工作体验,还有一些内推机会。
扫描上方二维码,加我微信
我的私人微信
点击阅读原文查看你错过的宝藏
点击上方“C语言与CPP编程”,选择“关注 置顶 星标公众号”干货...
风物中的初夏之“鲜”
新华社三亚5月21日电(记者施雨岑、周慧敏)国家文物局、海南省人民政...
今年以来,市场震荡,多数主动权益基金业绩表现不佳,红利策略主题...
【全国最大规模装配式公共住房项目交付入住】5月21日,由中建科技EP...
北京时间5月21日晚,2023英雄联盟季中冠军赛迎来总决赛,LPL一号种...
1、四川新华高级技工学校这个学校还是很不错的,四川新华电脑学校简...
1、可以用数据透视表将相同的数据快速汇总:以2010版excel为例,比...
光伏产业链压力自下而上传导,硅片库存高企带崩硅料价格
近日,有马卡、阿斯、RAC1等报道将基米希与巴萨联系在了一起。而知...
正值第十七个“地方志法规宣传日”之际,徐汇区地方志办公室与南洋...
1、中文名:X女特工外文名:AgentX出品时间:2012年出品公司:无锡...
红周刊编辑部|齐永超今年一季度,大洋彼岸的巴菲特大举加码苹果,持...
在激烈混战格局下,基金行业的“马太效应”越发凸显。有别于经常见...
你们好,最近小品发现有诸多的小伙伴们对于rand函数怎么用,rand函...
1、宁波市海曙福裕工艺品有限公司于1995年11月29日成立。2、法定代...
近年以来,随着居民生活水平的提升,人们对健康程度越来越重视。消...
【乌军否认巴赫穆特被瓦格纳完全控制】据悉,泽尔斯基已经安排乌军...
“这里的水稻田已经10多年不打农药、不施化肥了。”全国脱贫攻坚楷...
1、你好,肝性脑病(HE)又称肝性昏迷,是严重肝病引起的、以代谢紊...
去年年底宁马高速公路(南京段)改扩建工程全线通车在滨江开发区设...
旌,关于旌介绍这个很多人还不知道,现在让我们一起来看看吧!1、旌...
今天来聊聊关于棉袜哔哩哔哩,棉袜控吧的文章,现在就为大家来简单...
1、大多数人都认为所谓“无毒不丈夫”是要成就大事业必须手段毒辣,...
以下为韩网评论(已翻译)那你难受去吧gun吧加油!不敢评价哈哈哈哈...
1、中国朱砂主要产地是贵州东部和湖南西部,以质好量大而出名。产出...
1、欧Ⅳ型式认证和生产一致性排放限值车辆类别基准质量(RM)kg限值...
1、杭州昊梦文化传媒有限公司于2014年09月17日成立。法定代表人王翠...
你们好,最近小活发现有诸多的小伙伴们对于dnf一觉醒任务在哪接,dn...
2023年大理马拉松,520当天为爱奔跑,精彩纷呈!520的浪漫或许陪伴...