C++ 知识点汇总(持续更新)

  • 1. 引用:
  • 引用作为别名时,声明时就必须初始化
  • 常用作函数得形参,使用引用即使用源数据,而不是其副本=\
  • 传递类对象参数得标准方式一般是按引用传递
  • 指针是变量,可重新赋值,但引用不行
  • 使用时必须初始化,且不能再指向其他变量

  • 2. 内联函数

  • 3. 默认参数的函数

  • 函数中某个参数设置了默认值,则它右边的参数也都要有默认值

  • 4. 函数重载

  • 5. extern "C 主要用于能够正确实现 C++ 调用其他 C 语言代码,加上 **extern "C"**之后,会指示编译器这部分代码按照 C 语言的进行编译,而不是 C++ 的。

  • 6. 函数模板和类模板

  • 7. 构造函数

  • 构造函数的名称和类名相同,通过函数重载,可以创建多个同名的构造函数。

  • 构造函数没有声明类型。初始化与构造函数的参数列表相匹配。

  • 如果不实现构造函数,编译器会生成一个默认构造函数;如果自己实现,则编译器不会生成。

  • 8. 析构函数

  • 系统默认的析构函数:如果构造函数没有使用 new,只需编译器生成一个什么都不用做的析构函数即可。

  • 如果构造函数使用 new 来分配内存,则必须使用 delete 提供的析构函数释放这些内存。

  • static 数据成员和成员函数

  • static 修饰类中成员,表示类的共享数据

  • static 成员变量不占用对象的内存,而是在所有对象之外开辟内存,即使不创建对象也可以访问。

  • 使用 static 成员变量必须在类外进行初始化。

  • 用 static 修饰的成员变量在对象中是不占内存的,因为他不是跟对象一起在堆或者栈中生成,用 static 修饰的变量在静态存储区生成的。

  • 由于 static 修饰的类成员属于类,不属于对象,因此 static 类成员函数是没有 this 指针的(this 指针是指向本对象的指针)。正因为没有 this 指针,所以 static 类成员函数不能访问非 static 的类成员,只能访问 static 修饰的静态类成员。

  • 普通成员函数可以通过对象名进行调用,而 static 成员函数必须通过类名进行调用(因为它与类关联)。

  • 9. 动态内存分配

  • new/delete是运算符(关键字),malloc/free是函数调用。

  • 10. 拷贝构造函数

  • 调用拷贝构造函数的时机:

  • 1.定义一个新对象并用一个同类型的对象进行初始化时

  • 2.对象作为实参或函数返回对象时

  • 定义一个拷贝构造函数的固定形式:Student(const Student& s);

  • 11. 浅拷贝和深拷贝

  • 如果不定义拷贝构造函数,则编译器会使用默认拷贝构造函数,是浅拷贝

  • 浅拷贝遇到含有指针的对象类型时很容易出问题,因为浅拷贝出来的对象和原对象的指针都指向同一个内存空间,当其中一个对象被析构后,另一个对象再使用时就会发生内存溢出。

  • 深拷贝遇到指针时,会重新分配一块空间,因此不会有问题。

  • 12. 什么时候需要定义拷贝构造函数

  • 1.类数据成员有指针

  • 2.类数据成员管理资源(如打开一个文件)

  • 3.一个类需要析构函数释放资源时,那它也需要一个拷贝构造函数

  • const 关键字

  • 初始化 const 成员变量的唯一方法是使用初始化列表(不能在构造函数的函数体中初始化)。

  • const 成员函数可以使用类中的所有成员变量,但是不能修改它们的值, 这种措施主要还是为了保护数据而设置的。const 成员函数也称为常成员函数。

  • 常成员函数需要在声明和定义的时候在函数头部的结尾加上 const 关键字

  • 在 C++ 中,const 也可以用来修饰对象,称为常对象。一旦将对象定义为常对象之后,就只能调用类的 const 成员(包括 const 成员变量和 const 成员函数)了。

  • 13. 运算符重载

  • 运算符重载可以选择使用成员函数或非成员函数来实现。

  • 非成员函数应是友元函数,这样才可以直接访问类的私有数据。

  • 运算符重载的限制

  • 1、为防止用户为标准类型重载运算符,重载后的运算符必须至少有一个是用户自 定义类型的数据。

  • 2、不能违反运算符原有的运算规则。

  • 3、不能重载不存在的运算符,即不能创建新的运算符

  • 4、以下运算符不可重载:

            sizeof :sizeof运算符
    
            . :成员运算符
    
            .* :成员指针运算符
    
            :: : 域解析运算符
    
            ? : 条件运算符
    
            typid : RTTI运算符
    
            const_cast、dynamic_cast、reinterpret_cast、static_cast  :强制类型转换
    
  • 5、只能用作成员函数重载的运算符:

            = :赋值运算符
    
            () :函数调用运算符
    
            [] :下标(索引)运算符
    
            -> :通过指针访问类成员的运算
    
  • C++ 的运算符重载可以作为成员函数重载,也可以作为非成员函数(友元)重载,两者之间最重要的区别在于重载函数的参数列表的不同,作为成员函数重载的时候会隐式的传递 this 指针,而作为非成员函数进行重载的时候需要显式传递。+ C++ 中 ++、-- 运算符的重载式很特别的存在,它们有独特的格式,分为前自增(自减)和后自增(自减)。为了编译器能够进行区分,引入了一个额外的 int 进行区分,但这个 int 不含有实际意义

  • 13. 类之间的关系

  • is-a 继承体现

  • has-a 组合体现

  • 继承的意义

  • 代码重用

  • 体现不同抽象层次

  • 公有继承:`class Teacher: public Person

  • 子类只能访问父类的public和protected成员,不能访问private成员。

  • 在构造一个子类时,父类部分由父类的构造函数完成,子类的部分由子类的构造函数完成。

  • 构造一个子类时,先构造父类,然后构造子类,析构时相反。`

  • 多态:同样的方法调用而执行不同操作、运行不同代码。

  • 14. 虚函数与抽象类

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章