文章

Class

WHAT IS AN OBJECT?

  • An Object is an instance of a Class.
  • When a class is defined, no memory is allocated but when it is instantiated (i.e. an object is created) memory is allocated.
  • A class works as a “blueprint” for creating objects

    Constructors

  • Overloadable
  • Use initializer lists for speedier construction!
    1
    2
    3
    4
    5
    
    //student.cpp  
    #include student.h  
    Student::Student() : name{“ ”}, age{0}, state{“ ”} {}  
    Student::Student(string name, int age, string state) :  
    name{name}, age{name}, state{state} {}
    

Template Classes

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
template <typename T>
class Stack {
private:
    static const int maxSize = 100;
    T elements[maxSize];
    int top;

public:
    Stack() : top(-1) {}

    void push(const T& item) {
        if (top < maxSize - 1) {
            elements[++top] = item;
        } else {
            // Handle stack overflow
            // 这里可以加入适当的错误处理代码
        }
    }

    T pop() {
        if (top >= 0) {
            return elements[top--];
        } else {
            // Handle stack underflow
            // 这里可以加入适当的错误处理代码
            return T(); // 默认构造一个类型T的对象返回
        }
    }

    bool isEmpty() const {
        return top == -1;
    }
};

1
2
Stack<int> intStack;    // 创建一个存储整数的栈
Stack<double> doubleStack; // 创建一个存储双精度浮点数的栈

bug

  1. Templates don’t emit code until instantiated:

    • 模板并不在定义时生成代码,而是在实例化(使用)时才生成实际的代码。这是C++模板的一个重要特性,也被称为”模板的延迟实例化”。这意味着编译器只在程序中使用模板的地方生成相应类型的代码,而不是在模板定义的地方生成所有可能的代码。
  2. So include the .cpp in the .h instead of the other way around!

    • 因为模板在实例化时才生成代码,为了确保在每个使用模板的地方都有相应的实现,一种常见的做法是将模板的实现(定义)放在头文件(.h 文件)中,而不是将实现放在独立的源文件(.cpp 文件)中。

    • 换句话说,通常建议将模板的声明和实现都包含在头文件中,以便在编译时能够生成所需的代码。这样做的好处是,当模板被不同的源文件引用时,编译器能够看到模板的定义并生成相应的代码。

    • 与普通的非模板类不同,模板的实现通常不会单独编译成目标文件,因为模板的代码在实例化时才生成,而不是在编译实现文件时。 当然,也可以Include vector.cpp in .h文件。

本文由作者按照 CC BY 4.0 进行授权