首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++ 面试必备:常见 C++ 面试题汇总及详细解析

当程序发生异常,可以抛出异常并在可控范围内进行处理,避免程序崩溃。而 C 不支持异常处理机制。 运算符重载 C++ 允许运算符进行重载,可以使得运算符处理特定类型数据更具有描述性。...重载则指的是一个作用域内声明几个同名但是参数列表不同函数。通过函数名相同但参数类型、个数顺序不同,可以让多个函数具有不同行为。...内联函数和普通函数区别在于是否进行了“内联优化”。内联函数是一种特殊函数,编译器会在编译将其整个函数体插入到调用该函数地方,从而节省了函数调用开销。...此外,extern关键字还可以用于多个文件中共享一个函数定义。...避免和减少内存泄漏和指针越界错误,可以注意指针长度、malloc需要确定在哪里free、指针赋值注意被赋值指针需要不需要释放、动态分配内存指针最好不要再次赋值、C++中优先考虑使用智能指针等

1.9K30

static_cast ,reinterpret_cast

进行上行转换(把派生类指针引用转换成基类表示)是安全; 进行下行转换(把基类指针引用转换成派生类表示),由于没有动态类型检查,所以是不安全。...)”,也就是说,要确定一个对象是否一个继承体系中一个特定类型。...它是唯一能做到这一点C++风格强制转型。这个转换能剥离一个对象const属性,也就是说允许你常量进行修改。...这样强制类型底层代码以外应该极为罕见。操作 结果只是简单一个指针到别的指针值得二进制拷贝。类型之间指向内容不做任何类型检查和转换。 旧风格 强制转型依然合法,但是新形式更可取。...首先,代码中它们更容易识别(无论是人还是像grep这样工具都是如此),这样就简化了代码中寻找类型系 统被破坏地方过程。其次,更精确地指定每一个强制转型目的,使得编译器诊断使用错误成为可能。

1.9K100
您找到你想要的搜索结果了吗?
是的
没有找到

【译】更新 Go 内存模型 Updating the Go Memory Model

C/C++ 中,未定义行为已经演变成了完全委托编译器作者将一个漏洞百出程序变成另一个漏洞百出程序。...它目前以: 读取和写入大于单个机器字,其行为相当于多个机器字大小操作,但顺序不确定。 结束。...Maybe: 为 sync/atomic 提供类型 API 上面的定义表明,当一个特定内存片段必须由多个 Goroutine 并发访问而没有其他同步,消除竞争唯一方法是所有访问都使用原子。...仅对部分访问使用原子是不够。例如,与原子读写并发非原子写仍然是竞争,与非原子读写并发原子写也是竞争。 因此,特定是否应该通过原子访问是该值属性,而不是特定访问属性。...一些单线程程序中有效编译器优化 Go 程序中是无效。特别是,编译器不能在无竞争程序中引入数据竞争。它必须不允许一个读取观察多个值。并且它一定不允许一个写入操作可以写入多个值。

37620

RUST 语言特性之所有权

与指针息息相关是内存管理, C/C++ 中都提供了申请内存和释放内存函数操作符,其使用原则也相当简单,使用时申请,不使用后释放。真所谓大道至简,但并没有什么用。...栈空间有一个限制,就是所有存储栈中数据都必须拥有一个已知且固定大小。对于那些在编译期无法确定大小数据(动态分配,比如根据用户输入值决定分配多少个数组),只能将它们存储堆中。...堆空间管理较为松散:将数据放入堆中,先请求特定大小空间。操作系统会根据请求堆中找到一块足够大可用空间,将它标记为已使用,并把指向这片空间地址指针返回给程序。...所以,当你看到某处调用了 clone ,你就应该知道某些特定代码将会被执行,而且这些代码可能会相当消耗资源,这时需要特别小心,要评估一下是否有必要这样做。...将值传递给函数语义上类似于变量进行赋值。将变量传递给函数将会触发移动复制,就像是赋值语句一样。至于何时移动何时复制,和变量类型有关。下面的代码展示了变量函数传递过程中作用域变化。

75760

整理了70道C语言与C++常见问答题

「注意」:当有多个指针指向同一段内存,某个指针释放这段内存可能会导致其他指针非法操作。因此释放前一定要确保其他指针不再使用这段内存空间。...「注意」:编程 static 记忆性,和全局性特点可以让不同时期调用函数进行通信,传递信息,而 C++静态成员则可以多个对象实例间进行通信,传递信息。...由于C++支持函数重载,因此编译编译函数过程中会将函数参数类型也加到编译代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码函数不会带上函数参数类型,一般只包括函数名。...C++代码调用C语言代码 C++头文件中使用 多个人协同开发,可能有的人比较擅长C语言,而有的人擅长C++,这样情况下也会有用到 31 请你来说一下C++中struct和class区别 C...定义」单一模板提供一个特殊实例,它将一个多个模板参数绑定到特定类型值上 (1)模板函数特例化 必须为原函数模板每个模板参数都提供实参,且使用关键字template后跟一个空尖括号,表明将原模板所有模板参数提供实参

3K01

讲解cl: 命令行 error D8021 :无效数值参数“Wno-cpp” 和 cl: 命令行 error D8021 :无效数值参数“Wno-unu

C++编程,我们可能会遇到名为"cl"命令行编译器和错误消息"D8021: 无效数值参数"。...问题描述当我们使用cl命令行编译编译C++代码,可能会遇到以下错误消息之一:plaintextCopy codecl: 命令行 error D8021 :无效数值参数“/Wno-cpp”plaintextCopy...这些参数用于控制编译特定警告信息进行禁用。然而,Microsoft Visual Studiocl编译器并不支持使用这些参数。 要解决这些错误,我们需要从编译命令中删除这两个无效参数。...删除任何包含"/Wno-cpp""/Wno-unused-function"文本。点击“应用”确定”按钮以保存更改。...当我们使用该参数编译器将不再产生与这些警告相关错误消息警告信息。 预处理器是C++编译过程中一个重要阶段,它对源代码进行转换和处理。

1.1K10

googl中java、c++编程风格

类名通常是名词名词短语,接口名称有时可能是形容词形容词短语。现在还没有特定规则行之有效 约定来命名注解类型。 测试类命名以它要测试名称开始,以Test结束。...那,到底什么算是一个常量? 每个常量都是一个静态final字段,但不是所有静态final字段都是常量。决定一个字段是否一个常量 , 考虑它是否真的感觉像是一个常量。...定义:极造函数中执行初始化操作。 优点:排版方便,无需担心类是否初始化。 缺点:极造函数中执行操作引起问题有:   1) 极造函数中丌易报告错诨,丌能使用异常。  ...接口继承可用亍程序上增强类特定 API 功能,类没有定义 API 必要实现时,编译器同样可以侦错。   缺点:亍实现继承,由亍实现子类代码父类和子类间延展,要理解其实现发得更加困难。...缺点:限制使用重载一个原因是特定调用处徆难确定到底调用是哪个函数,另一个原因是当派生类 叧重轲函数部分发量会令徆多人继承诧义产生困惑。

1K20

C++ 炼气期之数据是主角

变量是指位于内存中一个存储块。这个存储块又是由一个多个基本存储单元格组成。一个基本存储单元格大小一般为 1字节(1 B)。 比特(bit)是计算机最小存储单位。...//C++ 中需要变量,一定要指定数据类型 数据类型 变量名; 数据类型声明变量语法中有 2 个作用: 确定变量大小。 确定变量中数据用途。 之于数据类型具体概念是什么?...这里必然会出现一个问题,我 32 位计算机编写程序时,使用 int 描述了一个32 位数据。如果让此程运行在 16 位计算机上,则会出现编译无法通过丢失数据情况。...当然,C++也可以让开发者可以统一使用 int描述数据,在编译器中,由编译器根据计算机机器字,然后采用是否拆分存储方案。也就是把上述逻辑由开发层面移到编译器层面。...正如前文所说,C++并不会在语法层面 检查数据是否合理,编译器采用原则是能存储存则存储,不能存储就存储能存储一部分。

29120

Objective-C 中 9 种避免使用 Xcode 预处理器宏方法

但我想几乎所有其他内容提出质疑!这有什么关系呢?因为每次使用预处理器,你看到并不是你编译内容。对于作为常量使用 #define 宏,我们需要避免一些陷阱——其实我们完全可以避免这些陷阱。...升序整数常量在编码表格视图非常方便,可以确定哪些信息属于哪个单元格。......这就是枚举类型作用。...9、条件编译:支持多个项目平台 Smell #if PROJECT_A … #else … #endif 多个项目(多个平台)中共享代码,很容易共享源文件中偷偷加入特定于项目的扩展。...基本策略是将包含项目特定代码方法改写为模板方法(Template Methods),由项目特定子类提供项目特定操作。 步骤 为每个项目变量创建一个子类。 每个项目中,为该项目添加子类。...对于每个有条件编译部分: 执行提取方法,确定所需签名。 将主体每个平台特定部分向下移动到平台特定子类,直到基类方法为空。 编译和测试每个项目。 查找每个子类内部以及子类之间重复代码。

8410

可变参数(cc++)

利用特定参数类型:例如,如果所有的参数都是相同类型,你可以函数中使用特定参数类型确定参数数量。...参数表示零个多个类型列表;一个类型名后面跟一个省略号表示零个多个给定类型类型参数列表。...foo函数参数列表包含一个const s类型参数,指向T类型,还包含一个名为rest函数参数包,此包表示零个多个函数参数。 与往常一样,编译器从函数实参推断模板参数类型。...+在编译确定数组a大小来给空间,所以他会将里面的那个数据包展开,如图()中是一个逗号表达式,也就是有几个参数就会调用几下PrintArg。...因此,元素类型允许移动拷贝,emplace_back 和 push_back 性能差异可能会减小,甚至没有明显性能差异。在这种情况下,可以选择更符合语义操作更易读代码。

29110

第6章 函数

**这里要注意一点,即 C++并没有规定实参求值顺序,编译器能以任意可行顺序实参求值。**所以形如下式表达式是错误!...C++支持分离式编译每个 源文件(.cpp)独立编译。这样如果我们修改了其中一个源文件,那么只需要重新编译那个改动了文件。...C++一个函数只能返回一个值,而当函数需要返回多个,可以通过引用和指针形参来完成。这样的话,输入参数函数执行完毕后也会被改变,也就相当于是一个输出参数了。...当然,还可以通过自定义一个数据类型使用 tuple模板来返回多个值。 与变量初始化一样,参数初始化时,会忽略掉顶层 const。因此下式传给它常量对象或者非常量对象都是可以。...10.initializer_list提供了一系列相同类型元素轻量级存储和访问能力,值初始化后列表中元素永远是常量值。拷贝赋值,执行也是“类指针拷贝”,原始列表和副本共享元素。

1.2K70

01-C++基础-第一章-C++简介与C++简史

高级(high-level)语言致力于解决问题,而不针对特定硬件。一种被称为编译特殊程序将高级语言翻译成特定计算机内部语言。...这样,就可以通过每个平台使用不同编译器来不同平台上使用同一个高级语言了。...例如,OOP还有助于创建可重用代码,这将减少大量工作。信息隐藏可以保护数据,使其免遭不适当访问。多态让您能够为运算符和函数创建多个定义,通过编程上下文来确定使用哪个定义。...泛型编程需要对语言进行扩展,以便可以只编写一个泛型(即不是特定类型)函数,并将其用于各种实际类型C++模板提供了完成这种任务机制。      ...确定c++语言特性方面,真正编程需要比纯粹原理更重要。Stroustrup之所以c基础上创建c++,是因为C语法简洁、适合系统编程、使用广泛且于UNIX操作系统联系紧密。

1.2K20

浅谈 C++ 元编程

C++ 11 开始,C++ 支持了 变长模板 (variadic template):模板参数个数可以不确定,变长参数折叠为一个 参数包 (parameter pack) ,使用时通过编译迭代,...而常见测试类型又分为两种:判断一个类型 是否特定类型 和 是否满足某些条件。...(Σ) 2.2.3 使用折叠表达式化简编译迭代 C++ 11 引入变长模板,就支持了模板内直接展开参数包语法;但该语法仅支持参数包里每个参数进行 一元操作 (unary operation...编译时常数计算 能让程序员使用程序设计语言,写编译确定常量;而不是直接写常数(迷之数字 (magic number)) 在运行时计算这些常数。例如,几个例子都是编译常数计算。...具体方法是, 实现 (implementation) 调用需要操作之前,接口 (interface) 先检查是传入参数否有对应操作;如果没有,就通过短路方法,转到一个用于报错接口,然后停止编译并使用

2.9K60

C++打怪升级(一)- 命名空间、缺省形参、重载

等重大特性,还有已有特性更新:比如Lambda支持模板、范围for支持初始化等 ---- C++从C而来 C++语言开始是为了弥补C语言本身和其面向对象程序设计时不足。...---- 缺省参数是啥 缺省参数即函数默认形参参数,定义声明函数,其形参可以直接给出形参合适缺省(默认)值;调用含有缺省参数函数,调用者就可以选择缺省参数是否进行实参传入了,如果没有指定实参则采用该形参缺省值...函数重载是什么 函数重载是函数一种特殊情况,C++允许同一作用域中声明几个功能类似的同名函数,这 些同名函数形参列表(参数个数 类型 类型顺序)不同,常用来处理实现功能类似数据类型...这里就是C语言不支持重载原因: 一个源文件中定义相同函数名后,到形成符号表这里会出现两个相同函数名,并且这两个函数还都是有效,是编译错误。...C++形成汇编阶段也会形成符号表,对于函数来说,不是简单直接把函数名放入符号表,而是函数名进行事先确定规则进行修饰,成为一个独一份名字以此确保不会与其他有函数定义函数名重复。

81620

千万不要错过后端【纯干货】面试知识点整理 I

:一般构造函数可以有各种参数形式,一个类可以有多个一般构造函数,前提是参数个数或者类型不同(基于c++重载函数原理) 拷贝构造函数参数为类对象本身引用,用于根据一个已存在对象复制出一个该类对象...因为类类型数据成员对象进入函数体是已经构造完成,也就是说成员初始化列表处进行构造对象工作,这是调用一个构造函数, 进入函数体之后,进行已经构造好类对象赋值,又调用个拷贝赋值操作符才能完成...p 查看变量值 q 退出 引用是否能实现动态绑定,为什么引用可以实现 因为对象类型确定,在编译期就确定了,指针引用是在运行期根据他们绑定具体对象确定。...什么情况下系统会调用拷贝构造函数:(三种情况) (1)用类一个对象去初始化另一个对象 (2)当函数形参是类对象(也就是值传递),如果是引用传递则不会调用 (3)当函数返回值是类对象引用时...,它不会创建元素 编译与底层 c++源文件到可执行文件经历过程 预处理阶段:将源代码文件中头文件,宏定义进行分析和替换,生成预编译文件 编译阶段:将预编译文件转换成特定汇编代码,生成汇编文件 汇编阶段

50840

c++基础之变量和基本类型

从汇编角度来看,变量初始化是,变量进入它生命有效那块内存执行内存拷贝操作。而赋值则需要分解为两条语句,一个寻址,一个值拷贝。...声明只是告诉编译器这个符号可以使用,它是什么类型,占多少空间,但前它执行这种操作是否合法。最终会生成一个符号表,链接时候根据具体地址,再转化为具体二进制代码。...多文件中,为了完成这一个操作,必须事先知道它值,也就是在编译阶段知道它值。...,后续可能会有代码其进行修改 const int j = i + 20; // 是常量表达式,根据前面的代码,i是常量表达式,这个表达式中i会在编译进行替换,也就说j在编译也能确定初始值 const...,无法确定是否是常量表达式,我们可以需要定义常量表达式情况下使用 constexpr关键字,该关键字是用来修饰一个常量表达式,如果对应语句不是一个常量表达式,编译器会报错,可以根据这个报错进行修改

1.5K30

C++打怪升级(三)- 内联函数 、auto、范围for循环

其次宏没有类型检查,也就不安全,容易出错且不易发现。 C++从C而来,也C做出了一些改进。那么C++是否选择了C语言这种采用宏方法呢?...先说结论:不一定,取决于编译器。 inline对于编译器来说只是一个建议请求,不同编译器堆inline实现机制可能不同,编译是否接受我们发出请求也不受我们控制,而是由编译器自己决定。...怎样使用 使用auto定义变量必须其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto 实际类型。...当在同一行声明多个变量,这些变量必须是相同类型,否则编译器将会报错,因为编译 器实际只对第一个类型进行推导,然后用推导出来类型定义其他变量 #include using...迭代对象要实现++和==操作 ---- 指针空值nullptr 我们定义一个变量可能并不知道该变量应该赋予初值是什么,这时我们往往可以给其一个简单初值。

46720

#pragma once和条件编译

链接错误: 如果头文件中包含全局变量函数定义,重复包含可能导致链接错误,因为链接器无法确定哪个定义是有效。这种情况下,链接器可能会抛出多重定义错误。...#endif 这通常用于在编译根据不同条件选择性地包含排除代码块。...例如,你可能会使用 #ifdef 来检查某个特定是否已经被定义,然后根据这个宏定义与否来包含排除相关代码。...它通常与 #if、#ifdef #ifndef 结合使用,用于一系列条件中选择一个执行代码块。...它不需要像传统头文件保护那样每次包含头文件都执行条件判断和定义,而是在编译器内部使用一种更有效机制来管理头文件包含。

13810

彻底讲清 Java 泛型(上)

普通类和方法只能使用特定类型:基本数据类型类型。 如果编写代码需要应用于多种类型,这种严苛限制代码束缚就会很大。 多态是一种面向对象思想泛化机制。...随后你会发现 Java 中泛型实现并没有那么“泛”,你可能会质疑“泛型”这个词是否合适用来描述这一功能。 实例化一个类型参数编译器会负责转型并确保类型正确性。...1.2 误解 C++ 模板 Java 社区中,大家普遍 C++ 模板有一种误解,而这种误解可能会令你在理解泛型意图产生偏差。...一般来说,你可以认为泛型和其他类型差不多,只不过它们碰巧有类型参数。 使用泛型,只需要指定它们名称和类型参数列表。 3 一个元组类库 有时一个方法需要能返回多个对象。...同时,还获得了编译类型安全。 这称为 元组 将一组对象直接打包存储于单一象中。可以从该对象读取其中元素,但不允许向其中存储新对象(这个概念也称为 数据传输对象 信使 )。

61730

C u002F C++运算符

运算符是任何编程语言基础。因此,如果不使用运算符,C/C++ 编程语言功能是不完整。我们可以将运算符定义为帮助我们操作数执行特定数学和逻辑计算符号。换句话说,我们可以说操作操作操作数。 ...例如: (+ , – , * , /) 关系运算符:它们用于比较两个操作值。例如,检查一个操作是否等于另一个操作数,一个操作是否大于另一个操作数等等。...逻辑运算符:逻辑运算符用于组合两个多个条件/约束补充考虑原始条件评估。逻辑运算符运算结果是一个布尔值,真假。...例如, C C++ 中表示为 & 运算符按位 AND将两个数字作为操作数,并两个数字每一位执行 AND。仅当两个位都为 1 ,AND 结果才为 1。...它是一个编译一元运算符,可用于计算其操作大小。sizeof 结果是无符号整数类型,通常用 size_t 表示。基本上,sizeof 运算符用于计算变量大小。

52830
领券