Effective STL 04 ~ 08

条款4:确定对象使用前已经被初始化

  • 为内置型对象要手工初始化,因为c++不保证初始化它
  • 构造函数最好使用成员初始值,而不要在构造函数本体内赋值操作。且要保持class 内成员的顺序
  • “跨编译单元初始化次序”问题,请以local static 来替换 non-local static
int a;
cout << a << endl;

这样得到的数据是内存的数,我们初始化,所以我们要对它初始化。

int a = 5;
cout << a << endl;

我们在初始化类成员函数喜欢这样写:

class  a
{
public:
    a(int bnum, string bstr);
    ~a();
private:
    int num;
    string str;
};

a::a(int bnum, string bstr)
{
   num = bnum;
   str = bstr;
}

应该养成习惯,改写成(保持类中的顺序):

class  a
{
public:
    a(int bnum, string bstr);
    ~a();
private:
    int num;
    string str;
};

a::a(int bnum, string bstr):num(bnum),str(bstr)
{
   
}

c++规定,对象的成员变量的初始化动作发生在进入构造函数之前,构造函数里面是赋值运算。

local static 是指函数内的static 对象,其他的static 对象为 non-local static。

编辑单元 是指产出的单一目标文件的源码,其实就是对应的.h与.cpp 文件。

简单来说就是这个函数还没有调用,会导致local static 未能初始化,导致在别的函数中,获取相关联的数据,就会出问题。

条款5:了解c++默默编写并调用那些函数

  • 编译器可以暗自为Class创建default构造函数、copy构造函数、copy assignment 操作符,以及析构函数。

当我们写:

class b
{};

编译器默默的给你写了:

class b
{
public:
     b(){...}
     b(const b& rhs){...}
     ~b(){...}

     b& operator=(const b& rhs){...}
};

一定要记住哟。

条款6:若不想使用编译器自动生成的函数,就该明确拒绝

  • 为驳回编译器自动提供机能,可以将对应函数改写成private。

比如将上面的改写成:

class b
{
public:
     b(){...}   
     ~b(){...}
private:
     b(const b& rhs){...}
     b& operator=(const b& rhs){...}
};

这样就可以了。

条款7:为多态基类声明virtual析构函数

  • polymorphic(带多态性质的) base classes 应该声明virtual 析构函数。如果class带有任何virtual 函数,都要,加上virtual析构函数。
  • classes 不具有多态,或者作为base classes ,不能加上virtual 析构函数

简单来说,当你base类 指向你的派生类,然后你用delete 这个指针会出现问题。因为本来在释放的时候,先释放派生类,在释放基类,你使用delete,会造成不完全释放。就会报错。

条款8:别让异常逃离析构函数

  • 析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞没它或结束程序。
  • 如果出现一个异常函数,应该提供一个普通函数来执行改操作。

这个就很简单了,若你只是抛出异常,程序还会进行,后面会出现更多的问题。应该在析构函数里吞没。

今天先写这里,希望大家多多了解,让代码写的更加漂亮。​​​​​​​

发布了26 篇原创文章 · 获赞 7 · 访问量 4300

猜你喜欢

转载自blog.csdn.net/weixin_42126427/article/details/104400085