10程序员面试笔记之C++程序设计基础

参考资料:

[1]程序员面试笔记 第10章 C++程序设计基础

学习建议:

必须先思考!!!

10.1程序的编译和执行

源程序→可执行程序:
预处理、编译、汇编、链接等

面试题1:简述#include<>与#include""的区别
#include<> 直接从编译器指定的路径搜索
#include"" 首先在程序当前目录搜索,然后再从编译器指定的路径搜索
面试题2:简述#与##在define中的作用(两个#的运行有问题)
#include
//PRINTCUBE(5)在预处理后,#x被替换成字符串常量"5"
//PRINTCUBE(y)在预处理后,#x被替换成字符串常量"y"
#define PRINTCUBE(x) cout<<"cube("<<#x<<")="<
面试题3:简述assert断言的作用

注意:最好在每个assert中只检测1个条件,不要要assert中修改变量的值

assert,用于程序debug版本的检测条件表达式,如果结果为假,输出诊断信息并终止程序运行。

10.2变量

C++和C的变量的类比:
C++变量 类比 C语言变量
类中的数据成员 结构体变量
全局变量 全局变量
局部变量 局部变量
局部变量和全局变量的区别:

在函数内定义还是在函数外定义

全局变量分为:
全局变量 代码写法
静态全局变量 通常在源文件中声明和定义,不能使用extern,作用域:文件内部。 如果在头文件中进行声明的同时会被初始化,在多个源文件include这个头文件,每个源文件对这个变量都会有单独的拷贝,变量的改变互不影响
普通全局变量 在头文件中声明,用extern修饰,其作用是将变量导出,表示任何通过include包含该头文件的文件可以使用这个全局变量,在源文件中定义,作用域:整个工程,参考VINS parameter.hpp
全局常量型变量 在头文件中进行声明和定义
类中的静态变量:

在类的内部声明,在类的外部进行初始化。参考SLAM14讲project 0.4

面试题1:简述i++和++i的区别

先赋值再运算与先运算再赋值的区别。

面试题2:简述C++类型转换操作符(先这么弄)

只有当一个父类指针指向1个子类对象,并且父类中包含虚函数时,使用dynamic_cast将父类指针转为子类指针才成功,否则返回空指针。

面试题3:简述静态全局变量的概念

参见楼上。

10.3条件语句和循环语句

略。

10.4宏定义和内联

内联函数定义使用inline关键字,在函数中声明使用inline是没有效果的。

面试题1:简述内联函数和宏定义的区别

根本区别是宏定义仅仅是字符串替换,而内联函数是个函数。
在函数层面,内联函数,完全可以取代宏定义。
使用内联函数,要注意内联函数产生的代码膨胀问题,在各处调用处进行代码展开,所以要确保内联函数的函数体尽可能简单。

面试题2:宏定义的宏展开错误

要注意(1)将参数加上括号,(2)将宏定义内容加上括号

面试题3:内联函数的常识性问题

内联函数本质上就是个函数。

(补充)函数声明和定义写法上的区别是什么。

函数要赋初值得在函数的声明中,在函数的定义中是不行的。

#include

using namespace std;
int add(int a=0,int b=3);

int main()
{
    int result = add(1,4);
    cout<

10.5sizeof的使用

sizeof()是一个单目运算符,并不是一个函数。sizeof的操作数可是是类型名,也可以是表达式,如果是类型,直接获得该类型的字节数。如果是表达式,分析表达式的结果,再确定所占的字节数,并不对表达式进行实际运算。

面试题1:不能使用sizeof计算的表达式

cout< // cout< // cout< cout< // cout<

#include
using namespace std;

struct baby
{
    unsigned int gender:1;//这是啥,位域,占1个位
    unsigned int weight:5;//位域,占5个位,不能跨字节,节省空间
    unsigned int week:7;
    unsigned int blood:3;
    unsigned int height:8;
};

int trip(int number)
{
    return 3*number;
}

void show(int rank)
{
    cout<<"I am No."<
面试题2:sizeof计算结构体时的内存对齐问题

要考虑数据对齐,画图即可解决。
(1)在处理结构体成员时,成员在内存当中的起始地址必须是成员类型所占数据空间的整数倍。
(2)结构体sizeof的计算结果必须是结构体中占用最大的数据成员所占空间的整数倍。

面试题3:结构体嵌套时的sizeof对齐问题

结构体sizeof的计算结果是占用空间最大的基本(!!!!!!)数据成员所占空间的整数倍。

10.6内存分配

在C语言中malloc函数:

(1)动态分配的空间来自堆空间,指针指向一个堆空间的地址,而指针本身作为一个局部变量存放在栈空间中。
(2)通过malloc动态分配的空间必须通过free函数进行释放,这两个函数成对出现。
(3)通过free释放空间后,最好将指针置空。
为了更好地支持面向对象操作,满足操作类对象的需要,C++通过引入new和delete申请和释放空间。

C++中的new和delete运算符:

(1)对于基本类型:new操作符首先在堆上分配空间,然后使用括号内的值初始化堆上的数据,并返回空间的首地址,delete直接释放堆上的空间。
(2)对于自定义类型:首先在堆上分配空间,然后根据括号内的参数调用构造函数初始化对象,delete操作符先调用类的析构函数,再释放对象在堆上的空间。

#include

using namespace std;

int main()
{
//1 malloc和free函数
//    int* p= NULL;
//    p = (int*)malloc(sizeof(int)*10);

//    free(p);
//    p=NULL;
    //2 new 和delete运算符
    int* p=new int(10);
    cout<<*p<
面试题1:malloc和free的常识性问题

malloc申请的空间位于堆上。

面试题2:返回1个64整数倍的内存地址

先略。

面试题3:简述malloc/free和new/delete的区别

(1)malloc/free是C语言提供的库函数,new/delete是C++提供的运算符。
(2)malloc/free只能应用于基本类型,new/delete不但能用于基本类型,还能用于自定义类型。
(3)malloc函数只负责申请空间,并返回首地址,new运算符除了申请空间,还会调用构造函数初始化指针指向的内容,free函数只负责释放空间,delete首先调用对象的析构函数,然后释放空间。
new/delete完全可以覆盖malloc/free的功能,之所以C++中还有malloc/free,主要是为了兼容性问题,防止C++程序调用包含malloc/free的C语言函数。

面试题4:简述delete和delete[]区别

当new[]中的数据类型是基本类型,使用delete和delete[]都可以释放数组空间。
当new[]中的数据类型是自定义类型,只能使用delete[]释放数组空间。

10.7位运算

略。从题目入手。

10.8 main函数

1标准main函数的返回值是int类型。
2main函数的参数是固定的。
(1)第一个参数argc是argument count的缩写,整型,表示通过命令行输入的参数个数。
(2)第二个参数argv是argument value的缩写,char*,首元素argv[0]是程序的名字,其余元素为通过命令行输入的参数。

你可能感兴趣的:(10程序员面试笔记之C++程序设计基础)