联系方式

咨询热线:400-998-6158

点击此处免费预约试听课程»

常见问题
学习资讯
学习资讯

C++ 常见编程技巧有哪些

C++ 常见编程技巧有哪些,下面小编给大家介绍一下。
确定对象被使用前已被初始化
有时候,读取未被初始化的值会导致不明确的行为。
对于无任何成员的内置类型,*手动完成初始化
构造函数的初始化和赋值是有所区别的。赋值是指在构造函数调用之后,通过用户自己输入的值进行运算,这是赋值,而初始化一定是在调用构造函数时候就完成的
要想真正的初始化,可以使用成员列表进行初始化。初始化的效率比赋值要高

初值列中针对各个成员变量而设的实参,被拿去作为各个成员变量的构造函数的实参。比起先调用构造函数再调用拷贝构造,直接调用一次拷贝构造的效率要高很多
如果成员变量是const 或者 reference ,那就一定需要初始化而不能赋值

基类总是比派生类更早的初始化,class的成员变量总是以声明次序进行初始化,尽管它们在成员初始化列表中的顺序不一样,所以尽量保持两者顺序一致。

static成员变量的初始化
non-local static

static 成员寿命是从被构造出来到程序结束为止

函数内被定义的static成员称为local-static 其他的称为 non local-static

以函数调用(返回一个引用指向local static 对象)替换直接访问 non-local-static对象,就可以增加获得的那个引用指向一个历经初始化的对象
从一个角度来看,通过函数返回static对象初始化过后的引用,使得他们成为inlining的候选人,但是另一方面函数内涵“static独享”的事实使得他们在多线程系统中带有不确定性

具体改进方法:在程序的单线程启动阶段手动调用所有的 返回引用函数,这就可以消除与初始化有关的“竞速形式”

构造/析构/赋值运算

构造函数/拷贝构造/析构函数/赋值运算符重载/这些函数都是在需要时才会被编译器创建出来

派生类的防拷贝,把拷贝构造函数声明为private,这样就可以阻止拷贝行为

2.将拷贝构造和赋值拷贝声明为私有的,这样可以防止别人调用
但是成员函数和 friend 函数还是可以调用他们**

如果你没有声明这些函数,编译器会自动声明,所以较好还是自己声明*好

为多态基类声明 virtual 析构函数
如果一个派生类对象经由一个基类指针被释放,而这个基类没有 virtual析构函数的话,那么就会导致派生类对象的成分没有被销毁,造成局部销毁

形成资源泄漏,败坏数据结构,在调试器上浪费许多时间

解决办法:给基类的析构函数声明为virtual ,这样就可以避免局部销毁了

虚函数(在运行期决定哪一个 virtual 函数被调用)

vptr指针指出,vptr指向一个由函数指针构成的数组,称为 vtable,每一个带有虚函数的class都有一个相应的 vtable

如果一个不想被声明为基类的类增加了虚函数,那么对象体积将会增大,一个指针在64位系统中占8个bit

一定要注意不要把一个派生类对象给基类指针,这样会引发问题

异常中的析构函数
类中的数据成员应该被正确的销毁,即使是在抛出异常的情况下。
在两个异常同时存在的情况下,程序不是结束执行就是导致不明确行为
为了解决抛出异常导致程序不能正常关闭的问题,我们可以在析构函数中调用 close函数

绝不在构造和析构函数中调用 virtual 函数
在继承关系中,如果一个派生类的构造函数被调用,那么首先会去调用基类的构造函数,基类对象构造期间虚函数绝不会下降到派生类阶层,取而代之,对象的行为就像隶属基类一样。可以这么说,在基类构造期间,虚函数不是虚函数
如果在派生类对象还没有被初始化之前就调用虚函数,结果将会是未定义的。

如果在构造函数或者析构函数中调用虚函数,那么虚函数就会用自己的一套处理机制来进行运转。虚函数会根据对象的类型进行显式地调用。假使构造函数中有一个虚函数,那么进行对象构造时,如果由一个派生类的指针 new 一个基类的对象,由于构造函数是虚函数,那么就会根据多态性,只会构造基类对象,那么初始化也就没有完成了。放在析构函数中也是类似的,会造成内存泄漏的问题

学校联系方式

更多培训课程,学习资讯,课程优惠等学校信息,请进入 北京达内教育北京C++培训北京嵌入式培训 网站详细了解,免费咨询电话:400-998-6158

相关课程