C++基础知识点整理笔记(四)
发布人:shili8
发布时间:2025-03-12 00:22
阅读次数:0
**C++基础知识点整理笔记(四)**
**1. 类和对象**
在 C++ 中,类是用来描述一个事物的特征和行为的模板。对象则是根据这个类创建出来的实体。
###1.1 类定义
cppclass Person { public: string name; int age; void sayHello() { cout << "Hello, my name is " << name << " and I'm " << age << " years old." << endl; } };
在这个例子中,我们定义了一个名为 `Person` 的类,它有两个成员变量 `name` 和 `age`,以及一个成员函数 `sayHello()`。
###1.2 对象创建
cppint main() { Person person1; person1.name = "John"; person1.age =30; person1.sayHello(); return0; }
在这个例子中,我们创建了一个 `Person` 类的对象 `person1`,并为其成员变量赋值,然后调用 `sayHello()` 函数。
###1.3 构造函数构造函数是用来初始化类成员变量的特殊函数。它的名字与类名相同,并且没有返回类型。
cppclass Person { public: string name; int age; Person(string n, int a) { name = n; age = a; } void sayHello() { cout << "Hello, my name is " << name << " and I'm " << age << " years old." << endl; } };
在这个例子中,我们定义了一个构造函数 `Person(string n, int a)`,它接受两个参数 `n` 和 `a`,并为类成员变量赋值。
###1.4 析构函数析构函数是用来释放类资源的特殊函数。它的名字与类名相同,但前面加上一个波浪线 (~)。
cppclass Person { public: string name; int age; Person(string n, int a) { name = n; age = a; } ~Person() { cout << "Person object destroyed." << endl; } void sayHello() { cout << "Hello, my name is " << name << " and I'm " << age << " years old." << endl; } };
在这个例子中,我们定义了一个析构函数 `~Person()`,它输出一条消息指示类对象被销毁。
**2. 继承**
继承是用来创建新类的机制。新类可以继承原来的类的成员变量和成员函数,并且可以添加新的成员变量和成员函数。
###2.1 公共继承
cppclass Animal { public: string name; int age; void eat() { cout << "Eating..." << endl; } }; class Dog : public Animal { public: void bark() { cout << "Woof woof!" << endl; } };
在这个例子中,我们定义了一个 `Animal` 类,然后继承它来创建一个 `Dog` 类。 `Dog` 类可以访问 `Animal` 类的成员变量和成员函数,并且可以添加新的成员函数 `bark()`。
###2.2 私有继承
cppclass Animal { public: string name; int age; void eat() { cout << "Eating..." << endl; } }; class Dog : private Animal { public: void bark() { cout << "Woof woof!" << endl; } };
在这个例子中,我们定义了一个 `Animal` 类,然后继承它来创建一个 `Dog` 类。 `Dog` 类可以访问 `Animal` 类的成员变量和成员函数,但这些成员变量和成员函数是私有的。
###2.3 多重继承
cppclass Animal { public: string name; int age; void eat() { cout << "Eating..." << endl; } }; class Dog : public Animal, public Mammal { public: void bark() { cout << "Woof woof!" << endl; } };
在这个例子中,我们定义了一个 `Animal` 类,然后继承它来创建一个 `Dog` 类。 `Dog` 类可以访问 `Animal` 类的成员变量和成员函数,并且可以继承另一个类 `Mammal` 的成员变量和成员函数。
**3. 模板**
模板是用来定义泛型函数或类的机制。它允许函数或类在编译时根据参数类型进行实例化。
###3.1 函数模板
cpptemplate <typename T> T max(T a, T b) { return (a > b) ? a : b; }
在这个例子中,我们定义了一个函数模板 `max()`,它接受两个参数 `a` 和 `b`,并返回较大的值。该函数可以根据类型进行实例化。
###3.2 类模板
cpptemplate <typename T> class Stack { public: void push(T value) { // ... } T pop() { // ... } };
在这个例子中,我们定义了一个类模板 `Stack`,它接受一个类型参数 `T`。该类可以根据类型进行实例化。
**4. 异常**
异常是用来表示程序运行时出现的错误或异常情况的机制。异常可以通过抛出和捕获来处理。
###4.1 抛出异常
cppvoid divide(int a, int b) { if (b ==0) { throw runtime_error("Division by zero!"); } cout << a / b << endl; }
在这个例子中,我们定义了一个函数 `divide()`,它抛出一个异常当除数为零时。
###4.2 捕获异常
cppvoid divide(int a, int b) { try { if (b ==0) { throw runtime_error("Division by zero!"); } cout << a / b << endl; } catch (const exception& e) { cerr << "Error: " << e.what() << endl; } }
在这个例子中,我们定义了一个函数 `divide()`,它捕获异常并输出错误信息。
**5. 智能指针**
智能指针是用来管理动态内存的机制。它可以自动释放内存以避免内存泄漏。
###5.1 unique_ptr
cppunique_ptr<int> ptr(new int(10)); cout << *ptr << endl;
在这个例子中,我们定义了一个 `unique_ptr`,它指向一个动态分配的整数。该智能指针可以自动释放内存。
###5.2 shared_ptr
cppshared_ptr<int> ptr(new int(10)); cout << *ptr << endl;
在这个例子中,我们定义了一个 `shared_ptr`,它指向一个动态分配的整数。该智能指针可以自动释放内存。
**6. lambda表达式**
lambda表达式是用来定义匿名函数的机制。它允许函数在使用时定义。
###6.1 简单lambda
cppauto add = [](int a, int b) { return a + b; }; cout << add(10,20) << endl;
在这个例子中,我们定义了一个简单的lambda表达式 `add()`,它接受两个参数并返回它们的和。
###6.2 复杂lambda
cppauto add = [](int a, int b) { cout << "Adding..." << endl; return a + b; }; cout << add(10,20) << endl;
在这个例子中,我们定义了一个复杂的lambda表达式 `add()`,它接受两个参数并返回它们的和。该函数还输出一条消息。
**7. fold表达式**
fold表达式是用来简化循环或递归操作的机制。它允许将多个元素合并为一个值。
###7.1 简单fold
cppint sum =0; for (auto i : {10,20,30}) { sum += i; } cout << sum << endl;
在这个例子中,我们定义了一个简单的fold表达式,使用范围-for循环将三个元素合并为一个值。
###7.2 复杂fold
cppint sum =0; for (auto i : {10,20,30}) { if (i >15) { sum += i *2; } else { sum += i; }