1.构造函数
特点:没有返回值,可以有参数(因此可以重载),只会在创建对象时被调用一次,且无需手动调用,用于给成员变量初始化
2.析构函数
特点:没有返回值,也没有参数,不用写void,在名称前加上“~”,对象在销毁前会自动调用析构函数,用于释放占用的内存,防止内存泄漏
3.派生类的构造函数
在C++中,派生类(也称为子类)的构造函数需要处理两部分:一是它自己的成员初始化,二是基类的初始化
如果基类有非默认的构造函数(即需要参数的构造函数),那么派生类的构造函数必须显式地调用它。这可以通过初始化列表(member initializer list)来完成。如果基类有默认构造函数,则派生类的构造函数可以省略对基类构造函数的调用,因为编译器会自动调用它。
在派生类构造函数的初始化列表中,必须使用基类构造函数来初始化基类部分,因为基类的成员必须在派生类的成员之前初始化。
#include <iostream>
// 基类
class Base {
public:
Base(int x) : baseValue(x) {}
void showBase() const {
std::cout << "Base value: " << baseValue << std::endl;
}
protected:
int baseValue;
};
// 派生类
class Derived : public Base {
public:
// 派生类构造函数,同时接受基类构造函数的参数和派生类自己的参数
Derived(int x, int y) : Base(x), derivedValue(y) {}
void showDerived() const {
std::cout << "Derived value: " << derivedValue << std::endl;
}
private:
int derivedValue;
};
int main() {
Derived d(10, 20);
d.showBase(); // 输出:Base value: 10
d.showDerived(); // 输出:Derived value: 20
return 0;
}
4.创建对象时变量的初值
在C++11及以后的版本中,你可以在类定义时为非静态成员变量提供默认初始化器(default member initializer),但这并不是在“声明”时赋值,而是在创建类的实例时,如果没有为这些成员提供显式的初始化值,则使用这些默认初始化器。
class MyClass {
public:
MyClass() {} // 构造函数
// ... 其他成员函数 ...
private:
int myInt = 42; // 默认初始化器,在创建MyClass实例时如果没有初始化myInt,则它将被初始化为42
std::string myString = "Hello, World!"; // 同样,myString将被初始化为"Hello, World!"
};
5.using 关键字
C++11 及其后续版本中的类型别名(Type Alias)语法, using
关键字来为一个类型创建一个新的名称
using uint32 = unsigned int;
6.非常量引用初值必须为左值
- 左值:在C++中,左值可以出现在赋值语句的左边和右边。左值通常代表一个内存地址,通过这个地址我们可以读取和写入数据。例如,变量就是左值。
- 右值:右值只能出现在赋值语句的右边,它通常是临时的、不可修改的数据。例如,常量或表达式的结果通常是右值。
- 如果我们尝试用一个右值(如常量或表达式的结果)来初始化一个非常量引用,编译器会报错,因为右值通常不包含有效的内存地址,因此无法通过它来进行修改操作。
7.继承中析构函数的调用顺序
当派生类对象被销毁时,析构函数的调用顺序与构造函数相反,即首先调用派生类的析构函数,然后按照继承层次向上调用基类的析构函数。这是为了确保在派生类成员被销毁之前,基类部分的状态能够保持正确。
8.析构函数的回调
当你使用基类指针指向派生类对象,并试图通过该指针来删除该对象时(使用delete
操作符),请确保基类的析构函数是虚函数,这是因为如果没有将基类的析构函数声明为虚函数,那么当使用基类指针删除派生类对象时,只会调用基类的析构函数,而不会调用派生类的析构函数。这会导致派生类对象中由new
分配的资源不会被释放,从而产生资源泄漏。
9.虚函数
目的:为了实现多态,允许使用基类的指针或引用来调用派生类的函数,而无需在运行时确定实际调用的是哪个类的函数。
特点:被“virtual”修饰,析构函数一般是虚函数,因为在继承中,在delete时,线调用派生类的析构函数在调用基类的析构函数,如果基类的析构函数不是虚函数,那么只会调用基类的析构函数。
10.类中的静态变量和函数
在C++中,类的静态成员(包括静态变量和静态函数)是类的所有实例所共有的。这意味着静态成员不属于类的任何特定实例,而是与类本身相关联。
定义,静态变量在类中是使用static
关键字声明的。它们不属于类的任何对象(或实例),而是属于类本身。静态变量在程序开始时分配内存,并在程序结束时释放。所有对象共享同一份静态变量的内存空间。
初始化,静态变量必须在类外部进行初始化。初始化通常在一个源文件中进行,并且只能进行一次。
静态函数只能访问静态成员(包括静态变量和其他静态函数),不能直接访问类的非静态成员。
11.纯虚函数
格式:纯虚函数在声明时,需要在函数声明的结尾处加上 = 0
// 纯虚函数声明
virtual void pureVirtualFunction() = 0;
任何包含纯虚函数的类都是抽象类,抽象类不能被实例化(即不能创建抽象类的对象)。
如果派生类没有为所有纯虚函数提供实现,那么它也将成为抽象类。