c++ 类的几个要点

2019-01-09  本文已影响9人  守拙圆

1 C++ 类的书写风格

Lakos (Lakos, J., 2001) Large-Scale C++ Software Design (Addison-
Wesley) 书中推荐了 C++ 类的书写风格:

2 初始化

  1. 对于 C 中的 struct 和 c++ 中的 class/struct 的最大区别就是,定义实例时, C 中的 struct 不会初始化其数据成员,而 class/struct 会调用构造函数初始化其数据成员。

注意:当 C++ 中的类调用的是默认无参空构造函数时,不会初始化普通类型的数据成员,会以调用默认构造函数的方式初始化其他成员对象。

  1. 构造函数可以重载,可以存在个构造函数,然后根据定义时对象的参数来选择合适的构造函数进行对象的构造。
  2. 当数据成员中存在常量成员时,构造函数的函数体中,无法对常量成员进行赋值,这就引出了初始化列表的必要性。
  3. 初始化列表的执行优先于构造函数的函数体中代码,但是对象的数据成员的初始化顺序是取决于变量的申明顺序,与初始化列表顺序无关。
  4. 引用数据成员必须使用初始化列表的方式初始化,因为引用无法以复制的方式进行改变。

3 内联函数

内联函数的实现有两种方式:一是在申明的同时定义函数,则此函数为内联函数;二是在定义函数时,前面加关键字 inline,则此函数为内联函数。

注意:内联函数只是一个请求,至于次函数是否确实当作内联函数使用需要依赖于编译器自身决定。

内联函数的使用场景:
void  Person::printname() const
{
    cout << d_name << endl;
}

来说,使用内联函数对于效率的提升是无效的。因为执行 cout 的时间远大于执行函数调用的时间。

4 头文件嵌套

首先,让我们来看一下如下的一组头文件:
string.h

#ifndef _String_h_
#define _String_h_
#include <project/file.h>   //to know about a File
class String
{
 public:
    void getLine(File &file);
}
#endif

file.h

#ifndef _File_h_
#define _File_h_
#include <project/string.h>  //to know about a string
class File
{
  public:
    void gets(String &string);
}
#endif

其预编译过程为:
定义 String_h
打开 project/file.h
定义 File_h
打开 project/string.h
发现 String_h 已经定义,跳过 string.h
定义 class File 时发现 String 无法解析。

以上头文件的相互包含,造成其中一个头文件无法被预编译。
解决此问题的方法是:由于在定义 File 的时候并不需要 String 的具体结构,只需知道其是一个类名即可。所以可以将 #include <project/string.h> 放到 File 定义的后面,用前置申明 class String; 来解决 String 标识符不识别的问题。

5 mutable 关键字

mutable 关键字可以用于需要在 const 函数中其内容的变量。

6 头文件中 using namespace 的使用

在头文件中,尽量不要使用命名空间声明语句 using namespace xxx;,这样有可能造成此命名空间范围扩大,而影响其他命名空间中的同名变量。

上一篇下一篇

猜你喜欢

热点阅读