C/C++面试知识点

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

C/C++面试知识点

提示:本文将记录遇到的C/C++问题,随时会增加


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


C/C++基础部分

  1. Q:某文件中定义的静态全局变量(或称静态外部变量)其作用域是?
    A:通常分析变量都是从两个方向分析。1、生命周期,普通局部变量的生命周期为该域的起止,全局变量和静态本地变量生命周期是程序运行的全过程。2、作用域,局部变量的作用域为定义改变量的域中,静态局部变量改变的是生命周期。全局变量生命周期为程序运行的全过程,静态全局变量限制其作用域为本文件。并且函数外的static变量不能被extern到别的文件。

  2. Q:如何判断一段程序是C编译器编译还是C++编译器编译?
    A:在程序编译过程会自动添加一些宏,其中一个可用于判断是否为C++编译器编译。

	#ifdef __cplusplus		//双下划线为非人为添加的
		cout<<"cpp"<<endl;
	#else
		cout<<"C"<<endl;
	#endif`
  1. Q:C和C++的不同?
    A:C是面向过程的(也可以通过cobject一些方法编写面向对象的程序),C++是面向对象的。C体积小效率高,适合写对效率要求更加苛刻的地方。C++是C的plus所以更加的复杂和适合编写规模大的程序,侧重对象而不是过程,侧重类的设计而不是逻辑过程的设计。
  2. Q:C和C++中struct的不同点?以及C++中struct和class区别
    A:
struct保护功能能否定义函数
C不能定义函数
C++可以定义函数,but默认是public
C++classstruct
默认访问属性privatepublic
默认继承属性privatepublic
  1. Q:如何判断机器是32位还是64位?
    A:定义一个指针int* p,然后用sizeof§,返回的便是操作系统的位数。
    或者
int tmp_num=~0;
if(a>65535){
	cout<<"32bit"<<endl;
}else{
	cout<<"16 bit"<<endl;
	
  1. C/C++内存的分配方式
C语言内存区特点分析
auto 在执行函数时,函数内局部变量的存储就是在栈上,函数执行结束时内存自动释放,效率高但是空间有限。
动态内存分配,程序在运行时通过malloc申请内存,但需要手动free释放内存,使用灵活但容易泄露
全局静态区存放全局变量和静态变量,空间由系统管理,(函数外部定义的变量,在定义的时候,这个空间就已经被开辟了)程序开始执行时开辟空间,程序结束执行时回收空间,程序执行期间一直存在。
常量区存放常量,在整个程序运行期间不能改变,生命周期与程序同
代码区存放程序执行的CPU指令,我们的代码最后在编译的时候都会转化为相应的CPU指令,告诉计算机如何执行程序
C++语言内存区特点分析
auto 在执行函数时,函数内局部变量的存储就是在栈上,函数执行结束时内存自动释放,效率高但是空间有限。
new,动态内存分配,程序在运行时通过new申请内存,但需要手动delete释放内存,使用灵活但容易泄露
自由存储区就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
全局/静态存储区全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
常量存储区这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)
  1. Q:对于一个频繁使用的小函数,在C中和C++中怎样实现更好?
    A: C中用宏,C++用内联函数(inline)。

  2. Q:引用和指针的区别?
    A:指针不必初始化,引用必须初始化(因为指针可以改变,引用不可以改变)。引用更加安全,指针更加灵活。

  3. Q:有了malloc/free还要new/delete干嘛?
    malloc/free是C/C++的标准库函数,new/delete是C++的运算符,二者皆可动态申请内存。
    malloc/free适用于内置类型,因为其不会调用构造函数,和对应的析构,but new/delete可以。
    由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于 malloc/free。
    因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符 new,以及一个能完成清理与释放内存工作的运算符 delete。
    注意 new/delete 不是库函数。

  4. Q:如果申请不到足够大的内存块,malloc和new会返回null指针,怎么处理?
    A:申请完之后判断指针是否为null,如果是,则进行相应的处理,并结束相应的程序。

  5. Q:C++是不是类型安全的?
    A:不是类型安全的,两个不同的类型可以牵制类型转换。

  6. 转移字符’'的作用?
    通常用于特殊格式的输出如\n等,同意忘记的是【+三个八进制】或者【+两个十六进制】。

  7. Q:const关键字的作用?
    A:const可以阻止对改变量的后续更改。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
    对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;`

const char* p;//p是指向const的指针,可以改变p的指向,但是不能通过P来改变指向的变量的值。
char const *p;//同上
char* const p;//p是一个指针,且不能改变指向
//其中区别可以看const在*前后。

在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;`

first::int fun()const{return 0;}

对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。
14.Q: 交换两个变量的方法
A:

a=a^b;
b=a^b;//a ^ b ^ b = a
a=a^b;//a ^ b ^ a = b
  1. Q:打印当前文件的文件名,行号,函数名
    A:`
cout<<__FILE__;//文件名
cout<<__LINE__;//行号
cout<<__FUNC__;//函数名
  1. Q:当一个类A 中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少?
    A:是1.深度探索c++对象模型中是这样说的: 那是被编译器插进去的一个char ,使得这个class的不同实体(object)在内存中配置独一无二的地址。 也就是说这个char是用来标识类的不同对象的。
  2. Q: 为什么A++不能是左值?
    A:首先对于i++的实现是:
int   temp; 
temp   =   i;
i   =   i+1;
return   temp;  

而++i的实现是:

 i   =   i+1;
 return   i;     

所以对于我们提出来的问题已经能得到解决了:
i++=5; 是错误的是因为i++返回的是编译器自动分配的临时变量temp,而这个temp并不是你程序中定义的可寻址变量的引用 ,也就是说你不能通
过地址对temp进行操作.(换句话说就是不能作为左值),因为temp是一个临时变量。++i=5;是正确的就是因为其返回值就是i。

  1. ?:,问号后的两个操作数必须是同一类型?
    必须是同一类型。
  2. Q:内联函数是否做类型检查?
    A:内联函数要做参数类型检查, 这是内联函数跟宏相比的优势。
  3. 函数 assert 的用法?
    A:断言assert是仅在debug版本起作用的宏,用于检查“不应该“发生的情况。
    程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段。
  4. Q:const 与 #define 的比较 ,const有什么优点?
    A:(1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。
    而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应) 。
    (2)有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。
  5. Q:
void * ( * (*fp1)(int))[10]; //fp1是一个指针,指向一个函数,这个函数的参数为int型,函数的返回值是一个指针,这个指针指向一个数组,这个数组有10个元素,每个元素是一个void*型指针。
float (*(* fp2)(int,int,int))(int);//fp2是一个指针,指向一个函数,这个函数的参数为3个int型,函数的返回值是一个指针,这个指针指向一个函数,这个函数的参数为int型,函数的返回值是float型。
int (* ( * fp3)())[10](); //fp3是一个指针,指向一个函数,这个函数的参数为空,函数的返回值是一个指针,这个指针指向一个数组,这个数组有10个元素,每个元素是一个指针,指向一个函数,这个函数的参数为空,函数的返回值是int型。
  1. Q:你觉得如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦?
    A:1) 程序的可读性(可理解性)变差。程序员自己会忘记那些数字或字符串是什么意思,用户则更加不知它们从何处来、表示什么。
    (2) 在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。
    (3) 如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错。

C++特性

  1. Q:面向对象的三个基本特征。
    A:封装:
    把客观事物封装成类,对自身的数据和函数进行保护。
    继承:
    为了代码复用,广义的继承分三类:实现继承(指使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。
    多态:是将父对象设置成为和一个或更多的与他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
    简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

  2. Q: 多态的作用?
    A:隐藏实现细节,接口重用。

  3. Q:虚函数表。
    A:虚函数表是在编译时期建立的一个组织虚函数入口地址的数组。但是对象的虚指针是在运行期间(构造函数被调用时)进行初始化的。这是多态实现的关键。

  4. 虚函数。
    用一代指针调用:
    两代:
    父类虚函数,子类非虚函数,则调用父类。
    父类非虚函数,子类虚函数,则调用父类。
    三代:
    一代非虚函数,二三代虚函数,调用一代。
    一代虚函数,二三无所谓,调用三代。
    用二代指针调用:
    一代或二代虚函数,三代无所谓,调用三代。

  5. C++中有没有纯虚构造函数?
    A:构造函数不能是虚的,只能有虚的析构函数

  6. Q:析构函数和虚函数的用法和作用?
    A:析构函数是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用。有释放内存空间的作用。虚函数是C++多态的一种表现, 使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。
    派生类的析构函数必须是虚函数,否则会内存泄漏

  7. Q:通常不能声明为虚函数的有?
    A:普通函数非成员函数)、静态成员函数、内联成员函数、构造函数、友元函数。

  8. Q:重载(overload)、重写(override,有的书也叫做“覆盖”)、重定义(redefinition)的区别?
    A:重载 同一名字空间 是指允许存在多个同名函数,而这些函数的参数表不同。
    重写/覆盖 不同名字空间,用于继承,子类重新定义父类虚函数的方法。
    重定义/隐藏 不同名字空间 用于继承,派生类与基类的函数同名,屏蔽基类的函数。

  9. 全局变量的初始化,不是由 main 函数引起的。

  10. Q:① return String(s1 + s2); 和 ②String temp(s1 + s2); return temp; 一样吗?
    A:①这是临时对象的语法,表示“创建一个临时对象并返回它” 。
    ②将发生三件事。首先,temp 对象被创建,同时完成初始化;然后拷贝构造函数把 temp 拷贝到保存返回值的外部存储单元中;最后,temp 在函数结束时被销毁(调用析构函数) 。
    然而“创建一个临时对象并返回它”的过程是不同的,编译器直接把临时对象创建并初始化在外部存储单元中,省去了拷贝和析构的化费,提高了效率。

  11. Q:在 C++的一个类中声明一个 static 成员变量有没有用?
    A:改变量是所有实例所共享,也就是无论多少个实例,该变量只有一份,属于类,不被继承。而类的静态成员函数也只能访问静态成员(变量或函数)。静态成员函数不可重写,通过类名调用。

  12. Q:函数模板和类模板的区别?以及模板类
    A:函数模板通过调用时参数的类型指定,用于函数的声明和函数实现中。类模板需要程序员显式指定,同样用于数据的类型参数化。
    “一般来讲,类模版是结构相似但不同的类的抽象,是描述性的;形式:template class 类版名;模版类是 类模版铸造出来的类,是具体的类,是如结构等相似的类型;” 类模板只是一个抽象的描述,在应用时在内存中是不占空间的,
    而模板类是一个具体的东西!
    泛型编程。

  13. Q:C++空类默认产生哪些成员函数?
    A:

class Empty
{
public:
	Empty();//缺省构造函数
	Empty(const Empty&);//拷贝构造函数
	virtual ~Empty();//虚析构函数
	Empty& operator=(const Empty&)//赋值运算符
	Empty& operator&();//取址运算符
	const Empty& operator&()const;//const取址运算符
}
  1. Q:In C++, what does “explicit” mean?
    A:C++中的 explicit 关键字用来修饰类的构造函数,表明该构造函数是显式的,在某些情况下,我们要求类的使用者必须显示调用类的构造函数时就需要使用 explicit,反之默认类型转换可能会造成无法预期的问题。
  2. Q:所有的运算符都能重载吗?
    A:在 C++运算符集合中,有一些运算符是不允许被重载的。这种限制是出于安全方面的考虑,可防止错误和混乱。
    (1)不能改变 C++内部数据类型(如 int,float 等)的运算符。
    (2)不能重载‘.’,因为‘.’在类中对任何成员都有意义,已经成为标准用法。
    (3)不能重载目前 C++运算符集合中没有的符号,如#,@,$等。原因有两点,一是难以理解,二是难以确定优先级。
    (4)对已经存在的运算符进行重载时,不能改变优先级规则,否则将引起混乱。

其他

  1. Q:VC 中,编译工具条内的 Debug 与 Release 选项是什么含义?
    A:Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
    Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
    Debug 带有大量的调试代码,运行时需要相应的运行库,发布模式程序紧凑不含有调试代码和信息,直接可以运行(如果不需要运行库)

C/C++常见面试知识点总结附面试真题 第一部分:计算机基础 C/C++内存有哪几种类型? C中,内存分为5个区:堆(malloc)、栈(如局部变量、函数参数)、程序代码区(存放二进制代码)、全局/静态存储区(全局变量、static变量)常量存储区(常量)。此外,C++中有自由存储区(new)一说。 全局变量、static变量会初始化为零,而堆栈上的变量是随机的,不确定的。 堆栈的区别? 1).堆存放动态分配的对象——即那些在程序运行时分配的对象,比如局部变量,其生存期由程序控制; 2).栈用来保存定义在函数内的非static对象, 阅读详情

相关推荐

C/C++面试高频知识点八股文

带你了解C/C++必须要会的知识点,告诉你怎么答。

林夕07 2万+

return string()有什么用途?

即,当参数是可选的,并且在文件中不存在时,这个函数将返回一个空字符串,同时设置。当从配置文件中搜索的参数不存在,并且这个参数不是必需的时,会执行。类的默认构造函数,它将创建一个空的。在这段代码中用于返回一个空字符串。,表示未找到这个参数。

小秋 AI SLAM 入门实战教程 268

C/C++知识点速记(笔试面试

1.指针与数组要注意的点: ●数组:生命数组变量时,一定要写出申请空间,可以使宏常量,但不能是变量,就算变量已经被赋值; ●指针:指针变量声明时的*只是一个指针类型说明符;而在非变量声明语句中,*才是指针运算符; ●指针变量:数组名a代表数组的首地址; a=&a[0]; *a=a[0]; a+i=&a[i]; *a+i=a[i]; 若整形指针变量p指向整形数组...

almost_change_it的博客 903

C语言中函数返回字符串的四种方法

在讨论着四种方法之前,首先要对函数有一个简单的认识,无论是在形实结合时,还是在return语句返回时,都有一个拷贝的过程。你传进来的参数是个值,自然函数在工作之前要把这个值拷贝一份供自己使用,你传进来的是个地址,函数也就会拷贝该地址供自己使用。同样return返回时,如果返回一个值,函数会将该值拷贝一份以提供给主调函数使用,返回的是一个指针(也就是地址),自然拷贝的就是一个地址,供主调函数使用。 ...

weixin_30657541的博客 3295

关于C++中的函数返回局部string的问题

函数返回局部变量string的时候能不能被引用? 前两天被同事突然问道这个问题,见到string一时糊涂了,最初学习C++的时候,就说不能引用局部变量,现在怎么糊涂了呢?呵呵   今天想了下,原来是被函数外表蒙蔽了,看个例子 std::string TestStringReference() { std::string strTest = "This is a test.";

pecywang的专栏 1万+

《高质量C++/C编程指南(林锐)》学习总结

1. 不可以将布尔变量直接TRUE、FALSE、1、0进行比较。应该用if(flag)或者if(!flag)。 整型变量直接用”==“或者”!=“与0进行比较。 浮点变量不可以直接用”==“或者“!=”与数字比较。 指针变量用“==”“!=”与NULL直接进行比较。 2. 可以使用诸如if(NULL == P)来避免if(NULL=P)类错误。 3. 在有循环嵌套的时候,尽量将长循环放在最内层,这样可以提高效率。 4. 可以使用#define来定义宏常量,用const来定义const..

aqbhc的专栏 308

软件开发基础知识(1)

3.虚函数纯虚函数 3.1动态编译 VTABLE实际是一个函数指针的数组,每个虚函数占用这个数组的一个slot。一个类只有一个VTABLE,不管它有多少个实例。派生类有自己的VTABLE,但派生类的VTABLE与基类的有相同的函数排列顺序,同名的虚函数被放在两个数组的相同位置。在创建类实例的时候,编译器还会在每个实例的内存布局中增加一个vptr字段,该字段指向本类的VTABLE。通过这些手段,编译器在看到一个虚函数调用的时候,就会将这个调用改写。 类的实例对象不包含虚函数表,只有虚指针; 一个类的虚函数在

ZZcppc的博客 1090

C/C++面试笔试知识点总结

C/C++面试问题 1 const关键字的作用? 1)欲阻止一个变量被改变,可使用const,在定义该const变量时,需先初始化,以后就没有机会改变他了; 2)对指针而言,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const; 3)在一个函数声明中,const可以修饰形参表明他是一个输入参数,在函数内部不可以改变其值; 4)对于类的成员函数,有时候必须指定其为const类型,表明其是一个常函数,不能修改类的成员变量; 5)对于类的成员函数,有时候必须指定其返回值为

weixin_42538789的博客 1万+

C/C++面试知识点总结

C/C++面试知识点总结1.关键字(1)C语言中的###(2)关键词volatile的使用场景(3)关键词static的作用(4)extern作用(5)const的作用(6)什么时候使用const(7)new/deletemalloc/free的区别(8)左值右值的概念(9)短路求值2.内存(1)堆栈的区别(2) 1.关键字 (1)C语言中的### #可以将宏定义中的传入参数名转换为双引号括起来的参数名字符串,必须置于宏定义的参数名前 ##是将宏定义的多个形参转换成一个实际的参数名 #define

BelanLu的博客 1429

C/C++面试常考知识点

C/C++基础部分 C++C的区别 设计思想上: C++是面向对象的语言,而C是面向过程的结构化编程语言。 语法上: C++具有封装、继承多态三种特性; C++相比C,增加多许多类型安全的功能,比如强制类型转换、 C++支持范式编程,比如模板类、函数模板等。 C++中static关键字的作用 全局静态变量 在全局变量前加上关键字static,全局变量就定义成一个全局静态变量。 静态存储区,在整个程序运行期间一直存在。 初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显

Ternence_zq的博客 7150

深入解析C/C++面试核心知识点:从基础到进阶

深入解析C/C++面试核心知识点:从基础到进阶 【免费下载链接】interview ???? C/C++ 技术面试基础知识总结,包括语言、程序库、数据结构、算法、系统、网络、链接装载库等知识及面试经验、招聘、内推等信息。This repository is a summary of the basic knowledge of...

gitblog_00481的博客 419

C/C++常见面试知识点总结

一个由 C/C++编译的程序占用的内存(memory)分为以下几个部分:程序代码区(.text)、文字常量区(.rodata)、全局区/静态区(static)、堆区(heap)、栈区(stack)

MusicScore的博客 165

C/C++面试知识点总结(一)

目录: 一、基础知识 1.C/C++基础 2.STL基础3.数据结构与算法基础 4.计算机网络基础5.操作系统基础6.数据库基础二、深入底层原理1.STL各种容器的底层实现2.各种经典树的原理以及实现 3.计算机网络深入4.操作系统深入5.数据库深入三、项目经历 1.纯属个人YY 一、基础知识 1.C/

_ACME_的博客 4万+

C/C++基础知识点面试

目录 一、虚函数的数据结构,如何工作? 二、const与define的区别? 三、指针与引用的区别? 四、指针与数据的区别? 五、不用临时变量实现两个变量的交换 七、一个C++源文件从文本到可执行文件经历的过程 八、C++11新特性 九、C++C的不同 十、malloc的原理 十一、内存泄漏、野指针 十二、static 十三、unionstruct 十四、new与ma...

找个特立不独行的名的博客 2万+

C/C++面试知识点

C/C++面试知识点 1.static有什么用途。 解答: 在函数体中,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。也就是说,这个函数被限制在声明它的模块的本地范围内使用。  

liushuiwen101423的专栏 438

C/C++面试知识点总结之STL篇

目录   一、智能指针的实现 1、auto_ptr 2、shared_ptr 3、unique_ptr 4、weak_ptr 二、vector的原理及实现 三、deque的原理及实现 四、list的原理及实现 五、配置器、配接器、迭代器 六、仿函数 一、智能指针的实现         C++程序设计中堆内存是一个非常频繁的操作,堆内存的申请释放都由程序员自己管理,虽然自...

找个特立不独行的名的博客 7739

C/C++高频面试核心知识点全面解析

函数自动生成条件默认构造函数无用户定义构造函数析构函数总是生成(除非显式删除)拷贝构造无移动操作且无用户定义拷贝拷贝赋值同上移动构造/赋值无用户定义拷贝/移动/析构✅ 最佳实践:若需手动管理资源(如裸指针),应遵循“三法则”或“五法则”,明确定义或删除相关函数,避免浅拷贝导致双重释放。纯虚函数(= 0)强制派生类实现该方法,构成接口契约。

weixin_32925455的博客 722

笔试面试中C/C++重要知识点整理(不定期更新)

1.  CC++语言中的优先级规则 C语言中语言声明的优先级规则如下(以后分析的基础): A 声明从它的第一个名字开始读取,然后按照优先级顺序依次读取 B  优先级从高到低依次是                 B. 1 声明中被括号括起来的那部分                 B. 2 后缀操作符:                        括号()表示这是一个函数

菜根 3731
上一篇: 转为博客记录的第一天
下一篇: 操作系统总结1/
Pickerr
博客等级 码龄8年 1粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值