面试相关】【C++进阶】【持续更新中】阅之丰:《程序员面试笔记---C/C++、算法、数据结构篇》(by_杨&吴&王)

7 篇文章 0 订阅
1 篇文章 0 订阅
本文详细介绍了C++中的预处理指令,包括#include的区别、宏定义及类型转换。讨论了内存管理,如变量修饰词extern、static和const的用途,以及内存对齐和动态分配。同时,深入讲解了断言assert的使用和类型转换的四种方式。此外,文章还探讨了模板在函数和类中的应用,包括全特化、偏特化和模板元编程。最后,提到了main()函数执行前后对象的初始化顺序和atexit()函数的使用。
摘要由CSDN通过智能技术生成

【面试相关】【C++进阶】阅之丰:《程序员面试笔记—C/C++、算法、数据结构篇》(by_杨&吴&王)


[by_041]

C++程序设计基础(第10章)

#include < > / " "的区别

  • #include < >直接在编译器指定路径搜索,失败直接报错
  • #include < >先在当前目录搜索,失败后再从编译器指定路径搜索,再失败报错

#define #/##的作用

  • #可以把后面的宏参数作为完整字符串替换
  • ##可以把其前后的宏参数进行字符串化的连接
#include<iostream>

using namespace std;


#define f(x) cout<<#x<<"\t:\t"<<x<<endl;

int main(int argc, char *argv[])
{
	f(10);
	f("abc");
	f(1.3);
	return 0;
}

/*输出:
		12345	:	12345
		"abc"	:	abc
		1.234	:	1.234
		
*/

断言(ssert)的概念

  • assert(???);:???中的表达式为真则无事发生;为假即检测失败,程序会向标准错误流stderr中输出错误信息,再调用abort函数终止程序执行(只在DEBUG过程中起作用,RELASE无效;如是说但在使用时要达到这个效果要在编译时加入以下命令-DNDEBUG
#define NDEBUG		//禁用assert宏,记得在引用库上面
#include<assert.h>	//包含assert库
assert(?);			//调用assert函数

变量

  • 修饰词
    • extern:任何通过include包含该文件的文件中都可以使用这个全局变量
    • static静态局部变量只在第一次申请时初始化赋值,之后执行到该语句无事发生,该变量的作用依旧停留在函数内部,但生存期会是整个程序的生命周期;静态全局变量,兼具静态变量(只一次初始化)和全局变量(作用于全局)的特性
    • const:修饰常量型变量,其值不能修改
  • (++i)+(++i)+(++i)
    • 在VC中:先三次递增i,再求和,结果为 ( i 0 + 3 ) + ( i 0 + 3 ) + ( i 0 + 3 ) = 3 × ( i 0 + 3 ) (i_0+3)+(i_0+3)+(i_0+3)=3\times(i_0+3) (i0+3)+(i0+3)+(i0+3)=3×(i0+3)
    • 在GCC编译器中:先进行前两次递增,求一次和后再递增第三次,最终求和,结果为 ( ( i 0 + 2 ) + ( i 0 + 2 ) ) + ( i 0 + 3 ) = 2 × ( i 0 + 2 ) + ( i 0 + 3 ) ((i_0+2)+(i_0+2))+(i_0+3)=2\times(i_0+2)+(i_0+3) ((i0+2)+(i0+2))+(i0+3)=2×(i0+2)+(i0+3)
  • 类型转换
    • static_cast:可以代替C风格的类型转换实现基本类型转换;可以转换父子关系类型的指针,但是可能不安全;不相关类型的指针无法转换
    • dynamic_cast只能用于指针间的类型转换,需要继承关系。子类指针可以直接转换为父类指针;而父类指针转换为子类指针时,只有当一个父类指针指向一个子类对象,并且父类指针包含虚函数时才会成功,否则返回空指针,如果是引用则抛出异常
    • const_cast:可以在转化过程中增加或删除const属
    • reinterpret_cast:可以将一种类型的指针直接转化为另一种类型的指针或者整数,不论两个类型是否有继承关系。经常用在不同函数指针之间的转换

宏定义和内联

  • inline、、

内存分配和sizeof()

  • 综合例子:
// 申请的变量		"前缀地址"~所占内存大小~起始地址~"结束地址"
	
struct T1
{
	char	a;		//	0	1	0	1
	short	b;		//	1	2	2	4
	int		c;		//	4	4	4	8
	double	d;		//	8	8	8	16
}
//占空间最大的基础类型:double(8)
//sizeof(T1)=16;//大等于16最小的8的倍数(内存补齐)
	
struct T2
{
	int		a;		//	0	4	0	4
	double	b;		//	4	8	8	16
	short	c;		//	16	2	16	18
	char	d;		//	18	1	18	19
}
//占空间最大的基础类型:double(8)
//sizeof(T2)=24;//大等于19最小的8的倍数(内存补齐)
  • 类中的变量进行内存分配

    • 结构体变量第一个变量的_起始地址为0_

    • 组成结构体的基本类型变量在申请空间时_起始地址为该类型所占字节的整数倍的地址_

    • *手动对类中的变量进行内存分配设置

    struct T_
    {
    	int a:8;	//设置占用空间为 8位( 8b即1B)
    	int b:16;	//设置占用空间为16位(16b即2B)
    	int c:41;	//设置占用空间为41位(41b占6B,没满)
    	int d:32;	//设置占用空间为32位(32b即4B)
    }
    //书P86
    
  • sizeof()

    • sizeof不允许计算结构体中某个域成员占用的空间(sizeof(node.val)
    • sizeof(T_)结果为T_中占空间最大的基本类型的大小的整数倍(内存对齐)
  • 指针相关的内存分配

    • 申请释放
    //C:
    int * p = NULL;
    p = ( int * ) malloc( sizeof(int) * 10 );	//开一个有10个元素的int数组
    free( p );
    p = NULL;		//赋值NULL避免野指针,下同
    
    //C++
    int * p = new int(10);	//新建并指向int变量空间(初值为10)
    delete p;
    p = NULL;
    
    int * p = new int[10];	//新建并指向int数组的空间(元素个数为10)
    delete p;
    p = NULL;
    
    T_ * p = new T_();
    delete p;
    p = NULL;
    
    
    • 【P90开始】

main()前后

  • 外部初始化构造会在main()之前执行
class OutTest
{
	public:
		OutTest(){cout<<"OutTest begins"<<endl;}
};

class InTest
{
	private:
		static OutTest innerObj;
		//InTest(){cout<<"InTest begins"<<endl;}
};

OutTest outObj;
OutTest InTest::innerObj;

int main()
{
	cout<<"Main begins"<<endl;
}

/*输出:
		OutTest begins
		OutTest begins
		Main begins
		
*/

  • atexit(func);:注册func()函数,被注册的函数将在当前函数退出时执行(必须是无参数的void类型函数);如有多个函数,从最后一个被注册的函数开始执行(类比栈)

模版与泛型编程(第15章)

模版

template<typename T_,...>修饰函数/类

尽量少使用操作符,比如能只使用小于号(<)就不使用大于号(>)

  • 函数模板
//模板(宏观模板)
template<typename T1,typename T2>
class Test
{
	public:
		Test(T1 a,T2 b):
			a(a),b(b){cout<<"normal"<<endl;}
	private:
		T1 a;
		T2 b;
};

//运用宏观模板创建的模板
template<>
class Test<char,int>
{
	public:
		Test(char a,int b):
			a(a),b(b){cout<<"full"<<endl;}
	private:
		char a;
		int b;
};

//运用宏观模板创建的模板
template<typename T>
class Test<T,char>
{
	public:
		Test(T a,char b):
			a(a),b(b){cout<<"partial"<<endl;}
	private:
		T a;
		char b;
};
C、C++语言是IT行业的主流编程语言,也是很多程序员必备的软件基本功,是软件开发行业招聘考查的重点。本书以流行的面试题讲解为主要内容,介绍了C、C++语言基本概念,包括保留字、字符串、指针和引用、结构体、库函数等各个方面的基础知识,介绍了面向对象编程基本概念,包括如何实现继承、多态和封装等。还介绍了排序算法数据结构的实现,包括链表、堆栈、队列和树。此外,本书开始用两章幅详细介绍了英文面试的注意事项、常见问题及程序员的职业规划等软件工程师的常识。最后四章详细讲解了现在流行的智力测试题。 第一 求职 第1章 应聘求职 1.1 企业与人才 1.1.1 企业需要什么样的人才 1.1.2 如何成为企业需要的人才 1.2 做好面试的准备 1.2.1 面试衣着 1.2.2 简历 1.3 面试 1.3.1 面试注意事项 1.3.2 面试问题分析 问题一:“请自我介绍一下。” 问题二:“谈谈你的家庭情况。” 问题三:“你有什么业余爱好?” 问题四:“你最崇拜谁?” 问题五:“谈谈你的缺点。” 问题六:“谈一谈你的一次失败经历。” 问题七:“你为什么选择我们公司?” 问题八:“对这项工作,你可预见到哪些困难?” 问题九:“如果我们录用你,你将怎样开展工作?” 问题十:“与上级意见不一致,你将怎么办?” 问题十一:“我们为什么要录用你?” 问题十二:“你能为我们做什么?” 问题十三:“你是应届毕业生,缺乏经验,如何能胜任这项工作?” 问题十四:“你希望与什么样的上级共事?” 问题十五:“你在前一家公司的离职原因是什么?” 1.4 为明天做好计划 第2章 英文面试 2.1 英文电话面试 2.1.1 英文电话面试注意事项 2.1.2 英文电话面试常见   问题 问题一:When will you graduate? 问题二:How do you normally handle criticism? 问题三:Why should we hire you? 问题四:Please tell me something unreflected at your resume/about yourself/ your experience/your activities. 2.1.3 英文电话面试常用词汇 2.2 英文面试 2.2.1 英文简历 2.2.2 英文面试流程 2.2.3 英文面试注意事项 2.2.4 英文面试常见问题 问题一:What is your strongest trait? 问题二:How would your friends or colleagues describe you? 问题三:What personality traits do you admire? 问题四:What leadership qualities did you develop as an administrative personnel? 问题五:How do you normally handle criticism? 问题六:What do you find frustrating in a work situation? 问题七:How do you handle your failure? 问题八:What kinds of people do you like to work with? 2.2.5 英文面试常用词汇 2.3 计算机专业英语面试常用词汇 第二 C/C++面试题 第3章 C/C++程序基础 3.1 基本概念 面试题1:什么是C语言语句 面试题2:变量的声明和定义有什么区别 面试题3:下列字符,哪些不是C语言关键字 面试题4:下列变量定义,哪些是合法的 面试题5:如何以最简单的方式让电脑蜂鸣器发出声音 3.2 编程规范 面试题6:谈谈你对编程规范的理解或认识 面试题7:函数、变量等命名都有哪些规则 面试题8:写出bool、int、float、指针变量与“零值”比较的if语句 3.3 数据类型 面试题9:写出代码的输出结果 面试题10:C语言不合法的整型常数 面试题11:short i = 0; i = i + 1L;这两句有错吗 面试题12:char x[] = {"abcd"}和 char y[] = {'a','b','c','d'} 有不同吗 面试题13:char型数据在内存的存储形式 3.4 运算符 面试题14:请写出下列代码的输出内容 面试题15:运算符的优先级问题 面试题16:&&和&,||和|有什么区别 面试题17:什么是左值,什么是右值 面试题18:请写出程序的运行结果 面试题19:sizeof和strlen的区别 3.5 结构体 面试题20:结构体是什么样的数据类型 面试题21:结构体可以直接赋值吗 面试题22:组织WAV文件头,并解析WAV格式的各项信息 面试题23:计算学生不及格的人数打印他们的性别、姓名和成绩 面试题24:结构体内存对齐问题 3.6 C和C++的区别 面试题25:关键字static在C和C++的区别 面试题26:C语言的结构体和C++的有什么区别 面试题27:C的malloc和C++的new有什么区别 面试题28:C++的引用和C语言的指针有什么区别 第4章 预处理、保留字 4.1 预处理 面试题1:简述#ifdef、#else、#endif和#ifndef的作用 面试题2:宏定义和函数 面试题3:用#define声明一个常数 面试题4:写一个“标准”宏MIN 面试题5:typedef和define有什么区别 面试题6:#define CHAR char*和typedef char* CHAR各有什么优劣 面试题7:谈谈你对typedef的认识 4.2 const(常量) 面试题8:关键字const是什么 面试题9:说明以下a声明的含义 面试题10:const、define定义常量的区别 4.3 static(静态)和extern 面试题11:static有什么作用 面试题12:extern有什么作用 面试题13:简述变量存储类型 4.4 volatile 面试题14:volatile有什么作用 面试题15:一个参数可以既是const又是volatile吗 面试题16:一个指针可以是volatile吗 第5章 引用和指针 5.1 引用 面试题1:什么是引用 面试题2:常引用有什么作用 面试题3:流操作符重载为什么返回引用 5.2 指针 面试题4:说明以下声明的含义 面试题5:简述指针常量与常量指针区别 面试题6:写出以下代码的输出结果 面试题7:找出代码的错误 5.3 指针和数组 面试题8:写出代码的输出结果 面试题9:请问这段程序有问题吗 面试题10:a和&a有什么区别 面试题11:请问代码有什么问题 面试题12:数组名和指针的区别 5.4 函数指针 面试题13:请解析(*(void (*)())0)()的含义 面试题14:指出程序的错误 5.5 “野指针” 面试题15:如何避免“野指针” 面试题16:程序是否正确 面试题17:指出程序的错误 5.6 动态内存 面试题18:简述C、C++程序编译的内存分配情况 面试题19:以下四段代码哪段没有错误 第6章 字符串 6.1 数字字符串 面试题1:编码实现数字转化为字符串 面试题2:编码实现字符串转化为数字 6.2 字符串函数 面试题3:编写一个标准strcpy函数 面试题4:简述strcpy、sprintf与memcpy的区别 6.3 字符串与数组 面试题5:找出程序的错误之处 面试题6:判断程序会出现什么问题 第7章 嵌入式编程 面试题1:编码实现某一变量某位清或置 面试题2:用C编写一个死循环程序 面试题3:用变量a给出下面的定义 面试题4:设置地址为0x67a9的整型变量的值为0xaa66 面试题5:评论下面这个断函数 面试题6:评价一个代码片段 第8章 面向对象 8.1 面向对象的基本概念 面试题1:谈谈你对面向对象的认识 面试题2:面向对象的三大特征 面试题3:面向过程和面向对象有什么区别 8.2 类的成员变量和成员函数 面试题4:简述类public、protected、private的作用 面试题5:写出代码的打印结果 面试题6:写出程序的打印结果 面试题7:C++的空类有哪些成员函数 8.3 构造函数和析构函数 面试题8:构造函数能否为虚函数 面试题9:简述子类与父类的析构、构造函数的调用顺序 面试题10:编写类String 的构造函数、析构函数和赋值函数 8.4 拷贝构造函数 面试题11:谈谈对拷贝构造函数和赋值运算符的认识 面试题12:写出当定义#define _INMAIN 0和不定义时代码打印结果 第9章 继承与多态 9.1 继承 面试题1:指出程序的错误 面试题2:用C++设计一个不能被继承的类 9.2 虚函数和纯虚函数 面试题3:下面说法正确的是哪个 面试题4:写出程序的打印结果 面试题5:访问基类的私有虚函数 9.3 多态 面试题6:简述类成员函数的重写、重载和隐藏的区别 面试题7:简述多态实现的原理 第10章 数据结构 10.1 链表 面试题1:链表和数组有什么区别 面试题2:寻找单链表间结点 面试题3:怎样把一个单链表反序 10.2 单循环链表 面试题4:根据需求建立一个单向循环链表 面试题5:检测一个较大的单向链表是否带环 10.3 双向链表 面试题6:按要求构造一个双向链表 面试题7:编程实现双链表插入新结点 面试题8:编程实现双链表删除指定结点 10.4 栈和队列 面试题9:简述队列和栈的异同 面试题10:建立一个链式栈 面试题11:建立一个链式队列 面试题12:能否用两个栈实现一个队列的功能 10.5 二叉树 面试题13:建立一个二叉树 面试题14:计算一棵二叉树的深度 面试题15:在二元树找出和为某一值的所有路径 第11章 排序 11.1 插入排序 面试题1:编码实现直接插入排序 面试题2:编码实现希尔(Shell)排序 11.2 交换排序 面试题3:编码实现冒泡排序 面试题4:编码实现快速排序 11.3 选择排序 面试题5:编码实现直接选择排序 面试题6:编程实现堆排序 11.4 基数排序 面试题7:编程实现基数排序 第三 智力测试 第12章 基本方法 面试题1:斯密斯夫妇握手问题 面试题2:5个强盗分100颗宝石 面试题3:分牛 面试题4:谁在说谎 面试题5:是亏了还是赚了 面试题6:小虫分裂问题 面试题7:飞机绕地球环行问题 第13章 数学能力 面试题1:用一笔画出经过9个点的4条直线 面试题2:在9个点上画10条线 面试题3:100盏灯 面试题4:找出不同的球 面试题5:时针、分针和秒针重合问题 面试题6:可以喝多少瓶汽水 面试题7:怎样拿到第100号球 面试题8:烧绳计时 面试题9:分金条 面试题10:至少有多少人及格 面试题11:如何取3升水 面试题12:将16升水平均分给四个人 面试题13:如何将140克的盐分成50、90克各一份 面试题14:蜗牛几天能爬到井口 面试题15:100美元的差额到哪里去了 面试题16:点击鼠标比赛 面试题17:小猴最多能运回多少根香蕉 面试题18:算出小张买了几瓶啤酒、几瓶饮料 面试题19:牧场有多少匹马 面试题20:找出不同的苹果 面试题21:如何穿越沙漠 第14章 推理能力 面试题1:怎么少了100元 面试题2:村里有多少条病狗 面试题3:他们都在做什么 面试题4:躯体与灵魂 面试题5:小明一家能否安全过桥 面试题6:过河   问题 面试题7:这是张什么牌 面试题8:说谎岛上的两个部落 面试题9:谁是特尔斐城的预言家 面试题10:哪个政党获胜 面试题11:每个护士星期几休息 面试题12:每个人系的圆牌都是什么颜色的 面试题13:帽子问题 面试题14:谁是凶手 面试题15:他们的头发是什么颜色的 面试题16:谁是漂亮的青年 面试题17:哪个袋子里有金子 面试题18:他们星期几在说谎 面试题19:剩下的是什么牌 面试题20:老李的儿子们是做什么的 面试题21:史密斯家的门牌号 面试题22:尤克利地区的电话 面试题23:乡村庙会的15点游戏 面试题24:各家的孩子得了第几名 面试题25:经理应该带谁出差 面试题26:法官的判决 面试题27:张老师的生日是哪一天 面试题28:谁是M小姐的情人 面试题29:他们分别是哪国人 面试题30:他们分别是做什么的 面试题31:他们都会说什么语言 面试题32:怎么把马匹从甲村拉到乙村 面试题33:谁打碎了花瓶 面试题34:分机票 面试题35:石头有多重 面试题36:该释放谁 面试题37:谁打碎的玻璃 面试题38:谁是最优秀的医生 面试题39:今天星期几 面试题40:五个人进行汽车竞赛 面试题41:下一行是什么 面试题42:三筐水果各是什么 面试题43:最后剩下的是谁 第15章 反应能力 面试题1:下水道的井盖 面试题2:30秒答题 面试题3:一分钟答题 面试题4:镜子的你 面试题5:埃及古币 面试题6:投硬币 面试题7:他在撒谎吗 面试题8:制造零件 面试题9:不喜欢正方形窗户的人 面试题10:孩子租房 面试题11:重男轻女的国度 面试题12:分遗产 面试题13:栽果树 面试题14:聪明的农民 面试题15:聪明的死刑犯 面试题16:幼儿园奇怪的人 面试题17:奇怪的城镇 面试题18:聪明的商人 面试题19:渡船过河 面试题20:愚蠢的长工 面试题21:红球和白球 面试题22:小明坐在了哪里 面试题23:乌龟赛跑 面试题24:老师的爱恋 面试题25:爬楼梯 面试题26:马丁先生的约会 面试题27:巧入房间 面试题28:管子的球 面试题29:女儿的错
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值