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

参考资料:

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

学习建议:

必须先思考!!!

10.1程序的编译和执行

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

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

//##对宏参数进行字符串化,再连接
#define LINK3(x,y,z) cout<<x##y##z<<endl;

using namespace std;


int main()
{
    int y=5;
//    PRINTCUBE(5);
    PRINTCUBE(y);
    //LINK3("c","+","+");//编译过不了,不知道为啥
   LINK3(3,4,0);
}
面试题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<iostream>

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

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

int add(int a,int b)
{
    return (a+b);
}

10.5sizeof的使用

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

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

cout<<sizeof(baby)<<endl;//计算结构体类型所占用的空间
// cout<<sizeof(baby.gender)<<endl;//不允许计算结构体中某个成员占用的空间
// cout<<sizeof(trip)<<endl;//不允许通过sizeof计算函数所占的空间
cout<<sizeof(trip(1))<<endl;//并没有真正调用函数,计算返回值int类型所占用的空间,
// cout<<sizeof(show)<<endl;//返回值为空,就不行

#include<iostream>
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."<<rank<<endl;
}

int main()
{
    cout<<sizeof(baby)<<endl;//计算结构体类型所占用的空间
//    cout<<sizeof(baby.gender)<<endl;//
//    cout<<sizeof(trip)<<endl;//不允许通过sizeof计算函数所占的空间
    cout<<sizeof(trip(1))<<endl;//并没有真正调用函数,计算返回值int类型所占用的空间,
//    cout<<sizeof(show)<<endl;//返回值为空,就不行


}
面试题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<iostream>

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<<endl;//空间上的值
    delete p;
    cout<<*p<<endl;//这是一个垃圾值
    p=NULL;//必须进行置空才行
    //cout<<*p<<endl;
}
面试题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]是程序的名字,其余元素为通过命令行输入的参数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,874评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,102评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,676评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,911评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,937评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,935评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,860评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,660评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,113评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,363评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,506评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,238评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,861评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,486评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,674评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,513评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,426评论 2 352

推荐阅读更多精彩内容