基础知识部分

指令周期

  • 一般把计算机完成一条指令所花费的时间称为一个指令周期。
  • 指令周期越短,指令执行就越快。

顺序程序

  • 顺序程序具有顺序性、封闭性和可再现性的特点,使得程序设计者可以控制程序执行的过程,对程序执行的中间结果和状态进行预先估计,这样就可以方便地进行程序的调试和测试。
  • 顺序程序不具备并发性,并发性是并发程序的特点。

算法复杂度

  • 为了降低算法的空间复杂度,主要应该减少输入数据所占的存储空间以及额外空间,通常采用压缩存储技术。
  • 算法的计算工作量是用算法执行的基本运算次数来衡量的,而算法本身执行的基本运算次数是用问题规模表示的函数。
  • 算法的复杂度与程序的编制方式无关。
  • 算法设计需要考虑其可行性、确定性和有穷性等。

  • 树的结点个数是各个结点的度数之和加一。

结构化程序设计

  • 通过设计结构良好的程序,以程序静态的良好结构保证程序动态执行的正确性,使得程序容易理解和维护,以提高软件开发的效率并减少出错率。
  • 结构化程序的三种基本控制结构:顺序、选择和重复。

C++知识点部分

const关键字

  • const常量的定义:const变量只能只读,并且必须初始化。
  • 指向常量的指针和常量指针:const 类型名* 指针名表示常指向常量的指针,可以不进行初始化;const *类型名指针名表示常量指针,必须在定义的时候初始化。(在前需要初始化,在后无需初始化)
  • 常对象:常对象只能调用类的常成员函数,但是对象的成员函数不一定都是常成员函数,只需要保证数据成员都是常数据成员即可。
  • const修饰符可以放在类型名后也可也放在数据类型名之前。

内联函数

  • 与一般函数不同,内联函数在调用时,是将调用表达式用函数体来替换,所以在调用时不发生控制转移。
  • 类内部实现的函数都是内联函数,可以不使用inline进行定义,但是类外的内联函数必须用inline关键字定义。
  • 编译器并非对声明了内联的函数都会使用内联,而是会结合具体情况。
  • 内联函数是对C语言中带参数的宏的取代。

运算符重载

  • C++不允许用户定义新的运算符,只能对已有的C++运算符进行重载。
  • 不是所有的C++运算符都可以重载,有五个运算符不能重载。
  • 重载不能改变操作数的个数,不能改变运算符的优先级和结合性。
  • 重载的运算符必须和用户的自定义类型对象一起使用,操作数中至少有一个自定义对象。
  • 一般情况下,单目运算符最好重载为类的成员函数,双目运算符则最好重载为类的友元函数。但是,双目运算符中的赋值号、小括号和中括号等不能重载为类的友元函数。
  • 赋值运算符的重载方式为:Fraction& oprator=(Fraction&)
  • 输入运算符的重载方式为:friend istream& operator>>(istream& is, MyClass& a)
  • 运算符重载不能带有默认参数。

类的成员

  • 友元函数不是类的成员函数,不能直接使用成员变量,且不能用const修饰。
  • 类的非静态成员函数都有this指针,当类的非静态成员函数访问类的静态成员函数时,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。全局函数和静态成员函数都不能使用this指针。
  • C++11之前,类中的数据变量声明时不能对其进行初始化,而是需要在构造函数的初始化列表或函数体内部赋值。
  • 常数据成员的初始化必须通过参数初始化列表的方式进行。
  • 静态成员不含有this指针,不能访问本类中的非静态成员。

虚函数

  • 虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public。
  • 纯虚函数是指声明方式为virtual 返回值类型 函数名(参数列表)=0的函数。拥有纯虚函数的类被称为抽象类,抽象类不能被实例化。
  • 抽象类中包含有虚函数,也可也包含其他函数。

基类和派生类

  • C++中一个类可以有多个直接基类。
  • 当基类中定义了默认构造函数或根本没有定义任何一个构造函数时,在派生类构造函数的定义中可以省略对基类构造函数的调用。
  • 在派生类的构造函数中,先生成基类的对象之后生成派生类的对象;释放对象时,先调用派生类的析构函数再调用基类的析构函数。
  • 可以通过基类引用或基类指针的形式将一个派生类对象转化为基类对象,此时调用这个对象的函数时将会优先使用基类的函数,如果基类的函数是虚函数将会使用派生类中覆盖虚函数的同名函数。

文件流

  • 可以调用文件流(如ifstream)对象的open成员函数,以磁盘文件名和输入输出方式作为参数来打开一个磁盘文件。
  • 对于ifstream类流对象,其打开文件的默认方式是ios:in,而对类ofstream文件打开的默认方式是ios::out。
  • eof()函数可以检测是否到达文件尾部。
  • 对磁盘文件进行流操作时,必须包含头文件ifstream。
  • 当以ios_base::out模式打开的文件不存在时,将会自动创建一个新文件。
  • ios_base::cur表示文件当前位置的定位方式。

其他零散知识点

  • 如果给调用的函数传入的值没有经过初始化,那么程序会在编译阶段报错且无法运行。
  • if语句的条件部分不能嵌套使用if语句。
  • C++中的标识符可以包含数字、字母和下划线,并且必须要用字母或下划线开头。标识符不能是关键字。
  • 如果将一个非法的值如数字等直接传递给指针变量,那么程序运行时可能出错。
  • 变量的存储类型可以分为静态存储和动态存储两大类,包含四种:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)。如果没有说明类型,那么就默认采用auto方式进行存储。

C++流操作

与C++流有关的头文件

  • iostream:使用cin和cout等预定义流对象针对标准设备进行I/O操作。用于双向数据流的输入输出操作。
  • fstream:使用文件流对象针对标准设备进行I/O操作。可以打开一个既可以进行输入也可以进行输出的文件。
  • ifstream:打开一个用于输入的文件,也就是被读取的文件。
  • ofstream:打开一个用于输出的文件。
  • strstream:使用字符串流对象针对内存字符串空间进行I/O操作。
  • iomanip:使用setw和fixed等操作符进行格式控制。

C++流4个预定义的流对象

  • cin:标准输入流对象。
  • cout:标准输出流对象。
  • cerr:标准出错信息输出。
  • clog:带缓冲的标准出错信息输出。

备注:cin是istream类的对象,cout、cerr和clog都是ostream类的对象。

输出格式控制运算符

在这里插入图片描述

输出格式控制

  • 输出宽度控制

    • 输出宽度指的是最小输出宽度,当实际数据的宽度大于设置的宽度时,仍然按照实际的宽度输出。
    • 输出宽度的设置方法:setw(int n),其中n表示输出位数。
    • 宽度设置只对一次输入或输出有效,完成一次数据输出后宽度设置自动归零。宽度设置是所有格式设置中唯一一个一次性的设置。
  • 浮点数输出方式控制

    • 浮点数输出可以有自动、定点格式输出和科学计数法方式输出。
    • fixed表示定点格式输出;用scientific表示科学计数法输出。
  • 设置输出精度

    • 对于浮点格式,表示的是有效位数;对于科学计数法格式,表示的是小数位数。
    • 可以通过setprecision(int n)来设置输出精度。
  • 对齐方式设置:分别用left和right表示左对齐输出和右对齐输出。

  • 小数点处理方式

    • showpoint:即使小数部分为零,也输出小数点及其后面的无效零。
    • noshowpoint:小数部分为零时不输出小数点。这种方式是默认方式。
  • 填充字符设置:通过setfill(char c)来指定填充字符。

文件流的建立:可以通过文件流的构造函数或者open函数的第二个参数,指定文件的打开方式:

  • ios_base::app:为添加数据而打开,从文件尾部开始写。
  • ios_base::binary:作为二进制文件打开。
  • ios_base::in:作为输入文件而打开。
  • ios_base::out:作为输出文件而打开。
  • ios_base::trunc:如果文件存在则将文件变为空文件。
  • ios_base::ate:打开文件后定位与文件尾。

对于ifstream,其对文件的默认打开方式是ios_base::in,对于ostream,其对于文件的默认打开方式是ios_base::out。但是对于ifstream,其没有指定默认的打开方式。

输入流打开的文件不存在会检测并报出错误;输出流打开的文件不存在将会创建一个新文件。

另外,文件流使用完成后需要使用文件流.close()方法来关闭文件流。如果程序没有主动析构文件流对象,那么当文件流对象退出作用域后,系统会析构文件流对象并关系与之关联的文件。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐