本学期的工程实践基础课选修了C++,因为要考试,顺便把以前学的C++盲点记录一下。这些都是C++的基础知识,涉及一些语法,以及程序设计中易犯的错误。不是概括的包含所有知识点,这只是针对我个人的盲点….

2 从C到C++

2.1 命名空间

使用命名空间(namespace)时,结尾处不能添加分号。

2.2 操作符

使用不带参数的操作符,如(hex, endl),必须包含头文件iostream;而使用带参数的操作符,如(setfill,setw),则需要头文件iomanip

setw操作符,一次设置,一次有效;而其他操作符,一旦设置,一直有效,持续到下次被设置为止。

fixed之后再加setprecision(n),使得小数部分精确到n位。

2.3 强制类型转换

2.4 string

函数getline()常用来读入一行到string类型的变量中,但它不会把换行符存入到这个变量中

2.5 内联函数

避免函数调用的开销,但如果函数体很大,那么程序的可执行代码将变得很大。宜将频繁使用的小函数声明为内联函数。 关键字inline出现在函数声明,而不是函数定义中。

2.6 函数签名与默认参数

返回值不是函数签名的一部分,所以不能通过返回值类型的不同,来实现函数的重载。默认参数出现的次序,应该从右往左,且不能间断。默认参数应出现在函数的声明而非函数的定义中给出。

3 类

3.1 默认构造函数

摘自CSDN一位大牛的解释 :

The default constructor is used whenever we define an object but do not supply an initializer. A constructor that supplies default arguments for all its parameters also defines the default constructor.

默认构造函数(缺省构造函数)跟系统提供不提供构造函数没有任何关系,默认构造函数就是当你定义一个对象时不需要提供初始化的的构造函数。包括三种情况:

当然在一个类中,以上3中情况不可能共存,只要有一点满足就是默认构造函数。

3.2 拷贝构造函数

3.3 构造函数

常量成员只能在初始化列表中初始化,这是初始化const类型成员的唯一方法。

3.4 析构函数

析构函数不带参数,不能被重载。

3.5 类数据成员与成员函数

4 继承

4.1 改变访问限制

某些基类的成员可能不适合子类,这时候需要在子类中把基类的成员给隐藏掉。可以使用using声明。如下所示:

class BC {
public:
    void setX(){}
};

class DC: public BC {
private:
     using BC::setX;
};

4.2 保护成员

4.3 子类的构造函数

class A {
};  

class B {
};

class C: public A {
 public:
     C() { }
 private:
     B b1;
     B b2;
};

C类的构造函数,先构造父母A,在构造客人b1,b2,最后构造自己。子类的构造函数,只负责前一层对象的构造,祖先类对象的构造并不执行。

4.4 多继承的构造函数

先继承的先被构造,跟初始化列表中的顺序无关。客人不止一个,先声明谁就先构造谁。

4.5 保护继承

5 多态

5.1 动态绑定

使用动态绑定的程序会影响效率,因为虚成员函数表需要额外的存储空间

5.2 构造函数与析构

构造函数不能是虚成员函数,析构函数可以是虚成员函数。

5.3 虚成员函数

只要非静态成员才可以是虚成员函数。

5.4 重载、覆盖、隐藏

5.5 多态条件

继承层次中的同名函数,必须具有相同的函数签名,也就是所说的覆盖。

5.6 抽象基类

一个类只要有一个纯虚函数,就是抽象基类。抽象基类可以有其他不是纯虚成员函数或数据成员。

5.7 多态中的dynamic_cast

dynamic_cast操作是否正确与转型的目标类型是否多态无关,但转型的源类型必须是多态的。也就是说dynamic_cast只能施加于具有多态性的类型,而且转型的目的类型必须是指针或者引用。

6 操作符重载

6.1 重载规则

6.2 重载方式

成员函数重载:

class A {
public:
    A( int x ) { this->x = x; }
    A operator+ ( const A & a ) const { return A( x + a.x ); }
private:
    int x;
};

顶层函数重载:

A operator+ ( const A & a, const B & b ) { return A( a.x + b.x ); }

6.3 顶层函数进行操作符重载

6.4 输入与输出操作符的重载

6.5 前置后置运算符的重载

6.6 重载转型操作符

声明中不能包含返回类型,即使void也不行。如下所示:

operator othertype(); // othertype 可以为一个基本类型如int,或者一个类

6.7 内存管理操作符


纸上得来终觉浅,绝知此事要躬行~