牛客网c++工程师测试知识点整理

1 枚举类型
枚举类型是能被列举的常量的一个集合。
在枚举类型中,各常量的值只能是整型

4 方法重载和方法重写
方法重载同一个作用域内发生(比如一个类里面)。
方法重写继承时发生,在子类中重新定义父类中的方法,子类中的方法和父类的方法是一样的。与虚函数相关。
方法重载的返回值的类型可以不同,因为判断方法重载的方法主要是根据方法的参数不同来判定。
方法重写的返回值类型需要相同,重写就是子类继承了父类的方法,并在此方法上重写属于自己的特征,既然是继承过来的,那么它的返回值类型就必须要相同。

5 析构函数
析构函数的调用与构造函数的调用顺序刚好相反。
析构函数在下边3种情况时被调用:
①对象生命周期结束,被销毁时;
②delete指向对象的指针时,或delete指向对象的基类类型指针,而其基类虚构函数是虚函数时;
③对象i是对象o的成员,o的析构函数被调用时,对象i的析构函数也被调用。
全局变量、静态局部变量、局部变量的析构函数调用:
全局变量和静态局部变量时从静态存储区中划分的空间,二者的区别在于作用域的不同,全局变量作用域大于静态局部变量(只用于声明它的函数中)。全局变量和静态局部变量都是在对象生命周期结束时调用析构函数。
局部变量来自系统的栈空间,方法执行结束后就会由系统自动调用析构函数。
通过new从系统堆空间中分配的变量在程序运行结束时,系统不会自动回收分配给它们的空间,需要程序员手动调用delete来实现。
补充:内存分配
一个由C/C++编译的程序占用的内存分为以下几个部分:
栈区(stack):由编译器自动分配释放,存放函数的参数值、局部变量值。
堆区(heap):由程序员分配释放,new和malloc申请的内存,在程序运行时分配。
全局区(静态区)(static):存放全局变量和静态变量。初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序编译结束后由系统释放。
文字常量区:常量字符串就是放在这里的。 程序结束后由系统释放
程序代码区:存放函数体的二进制代码。

6 new动态分配内存
对于内置类型而言,new仅仅是分配内存,除非后面显示加(),相当于对其赋初值,对于自定义类型而言,只要一调用new,那么编译器不仅仅给它分配内存,还调用它的默认构造函数初始化,即使后面没有加()。
在这里插入图片描述
7 整型常量的表示:
八进制:开头是0,012表示八进制的12,-023表示八进制的-23,八进制每一位的数值的取值范围是0-7
十六进制:开头是0x,0x1A表示十六进制的1A,-0x46表示16进制的-46,十六进制每一位的数值的取值范围是0-9且A到F

8 不同数据类型所占内存空间
char每次移动1个字节;short移动2个字节 ;int , long ,float移动4个字节 ;double移动8个字节

9 sizeof使用总结
sizeof是一个操作符,返回一个对象或者类型所占内存的字节数。
sizeof的语法形式:sizeof(对象)或者sizeof(数据类型)eg:sizeof(i)或者sizeof(int)
基本数据类型的sizeof:与系统相关,不同系统下取值可能不同,一般sizeof(char)为1,sizeof(short)为2,sizeof(int/long/float)为4,sizeof(double)为8。
结构体的sizeof:结构体的sizeof涉及字节对齐。编译器会对结构体进行默认处理,让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基本数据类型(int等)都位于能被4整除的地址上。两个数中间就可能需要加入填充字节,所以整个结构体的sizeof值就增长了。
①结构体变量的首地址能够被其最宽基本类型成员的大小所整除
②结构体的每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要,编译器会在成员之间加上填充字节(internal adding)
③结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员后加上填充字节(trailing padding)
空结构体(不含数据成员)的sizeof值为1。
联合体的sizeof:联合体则是重叠式,各成员共享一段内存;所以整个联合体的sizeof也就是每个成员sizeof的最大值。
数组的sizeof:当字符数组表示字符串的时候,sizeof值将’/0’计算进去。
当数组为形参时,其sizeof值相当于指针的sizeof值。
在这里插入图片描述
在这里插入图片描述
指针的sizeof:sizeof(指针)的值为4,与指针所指的对象无关。
函数的sizeof:sizeof也可对一个函数调用求值,其结果是函数返回值类型的大小,函数并不会被调用。注意:1)不可以对返回值类型为空的函数求值。 2)不可以对函数名求值。 3)对有参数的函数,在用sizeof时,须写上实参表。
类的sizeof
类的大小为类的非静态成员数据的类型大小之和,也就是说静态成员数据不作考虑
普通成员函数与sizeof无关
虚函数由于要维护在虚函数表,所以要占据一个指针大小,也就是4字节
类的总大小也遵守类似class字节对齐的,调整规则。

10 多态性
多态性包括:虚函数、函数重载、模板
多态性包括动态多态性和静态多态性。虚函数属于动态多态性,函数重载、模板属于静态多态性。

11 reinterpret_cast
reinterpret_cast是c++里面的强制类型转换符。使用模板:reinterpret_cast (expression)

12 输入输出
输入:
scanf()遇空格、回车和tab都会结束。gets()可以接收空格,无上限接收,遇到回车或者EOF结束输入,将回车或者EOF转换成“\0”作为字符串的结尾。
输出:
putchar():向终端输出一个字符,需要引用头文件#include<stdio.h>

13 ACII码
大写字母 A-Z 65-90
小写字母 a-z 97-122
大写字母转小写字母:c+=32 or c=-(‘A’-‘a’)

14 const
const类指针只可以调用const类方法

15 在这里插入图片描述
即使分母为0 ,编译器也不会编译错误,输出结果为inf,表示无穷大
%要求两边都是整数,如果你非要一个整数%另外一个非整数的可以用强制类型转换把它装换成整形

16 C++运算符优先级
括号成员第一 :括号运算符 成员运算符. ->
全体单目第二:自加、自减、负号,取内容*,取地址&
乘除余三加减四:余是取余数运算
移位五关系六:移位<< >>关系> < >= <=
等与不等排第七:==或者!=
逗号运算级最低

17 逗号表达式
逗号运算符,优先级最低。将两个及以上的式子连接起来,从左向右依次计算表达式的值,整个表达式的值为最后计算的一个表达式的值。

18 关于&
&除了是取地址运算符,还有另一个含义:引用。
变量和变量的引用指向相同的值和内存单元。应用相当于变量的别名。
引用在参数传递的时候也只需要传递变量名即可。
引用和指针一样,可以修改主调函数的参数值。
在这里插入图片描述
19 c语言中用“%%”来打印“%”,注意结合顺序是从左到右。
在这里插入图片描述
20 系统软件包括:操作系统、语言处理程序、系统服务程序、数据库管理系统
杀毒软件不属于系统软件,属于应用软件。

21 C语言中的整数不能是二进制整数,可以是八进制、十进制、 十六进制整数。
输出语句中%d对应十进制、%o对应八进制,%x对应十六进制。

22 对于递归程序的复杂度计算:
时间复杂度对应递归次数,空间复杂度对应递归深度。

23 存储类别
auto声明局部变量,可省略。
static声明静态变量。对于局部变量,变量在函数调用结束后不释放。对于全局变量,变量的作用域只限于本文件中。
register声明寄存器变量,将变量放在寄存器中而非内存中,效率更高。
extern声明外部变量,扩展变量的作用域。外部变量,可以供所有源文件使用。

24 预处理命令
预处理命令不属于c++语句,为了区分,预处理命令以“#”开头,末尾不含分号
c++与其他高级语言的区别:使用预处理语句,具有预处理功能。
C语言在编译前对预处理语句进行处理
c++的预处理功能包含以下几点:宏定义、文件包含、条件编译
宏定义包括define定义的符号常量和const声明的常变量。
#define无参宏定义
#define 标识符 字符串,字符串可以省略,说明赋值为空
#define含参宏定义
#define 宏名(形参表) 字符串
宏定义只是在预处理阶段做了简单的替换,如果单纯的替换为a + b时,当你使用5 * add(2, 3)时,被替换为5 * 2 + 3,值为13,而非5 * (2 + 3)。

25 c++中运算符&&与& ||与|的区别:
& | 为整型和 bool 类型预定义了两种运算规则
对于整型,& 和 | 计算操作数的按位“与”;
对于 bool 操作数,& 或 | 计算操作数的逻辑“与”、“或”;
||或逻辑:左边为真,就会忽略右边表达式
&&与逻辑:左边为假,就会忽略右边表达式

26 const
const int i和int const i是等价的
c++中,声明const int i,是在编译阶段做到 i只可读的
const int * p,const修饰的是(p),不是p。所以指针p可以指向其他变量,但是不能通过p来修改内容。
例子:
int i1=30;
int i2=40;
const int p=&i1;
p=&i2; //此处,p可以在任何时候重新赋值一个新的内存地址。
i2=80; //这里能用
p=80来代替吗?答案是不能
printf("%d",*p); //输出80

int * const p,const修饰的是p,不是p。所以指针p不可以指向其他变量,可以通过p来修改内容
例子:
int i1=30;
int i2=40;
int * const p=&i1;
//p=&i2; 错误的。p不能再指向另一个新地址了。
i1=80; //这里能用p=80来代替,即可以通过p修改i1的值。
printf("%d",*p);

27 形参与实参:
形参与实参各占独立的存储单元。

28
编译器总是忽视第一维的长度,正如一维数组可以不指明大小;二维数组可以不指明第一维的长度;列的数量不可省略

29 变换矩阵的平移矩阵,平移矩阵属于仿射变换,平移矩阵可逆,平移矩阵不是正交矩阵,平移矩阵属于线性变换

30 隐式类型转换:等号右边全部转换成最高类型进行运算,最后强制转换成等号左边的类型
在这里插入图片描述
31 构造函数不能是虚函数,析构函数可以是虚函数。
32 实参可以是任何类型,形参只能是变量或常变量。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43854189/article/details/88876938
今日推荐