当前位置: 首页 > article >正文

[C++面试] 初始化相关面试点深究

一、入门

1、C++中基础类型的初始化方式有哪些?请举例说明

默认初始化

对于全局变量和静态变量,基础类型(如intfloatdouble等)会被初始化为 0;而对于局部变量,其值是未定义的,包含随机的垃圾值。

全局变量初始化为0,局部变量值未定义

#include <iostream>int global_x; // 全局变量,默认初始化为 0void testDefaultInitialization() {int local_x; // 局部变量,值未定义std::cout << "Global x: " << global_x << std::endl;std::cout << "Local x: " << local_x << std::endl; // 输出值不确定
}

​拷贝初始化—— 有赋值符

int y = 5;(通过等号赋值初始化,支持隐式类型转换)

int main() {int y = 5; // 常规拷贝初始化double d = 3.14;int z = d; // 隐式类型转换,d 从 double 转为 int,小数部分被截断std::cout << "y: " << y << ", z: " << z << std::endl;return 0;
}

隐式转换陷阱:若目标类型存在单参数构造函数,可能触发隐式类型转换(如MyClass obj = 10会调用MyClass(int)构造函数)

直接初始化 —— ()构造函数

  • int z(6); 或 
  • std::vector<int> v(10, 5); 生成10个5,调用 vector 的构造函数 vector(size_type count, const T& value) 实现的
  • 当编译器遇到 vector<int> v(10) 时,会优先调用 vector(size_type count),生成 ​10 个 0
  • vector<int> v{10};  // 实际调用 initializer_list 构造函数,生成 1 个元素 10
初始化方式预期行为实际可能行为(未正确处理时)
vector<int> v(10, 5);生成 ​10 个 int 类型的 5正常调用数值型构造函数
vector<int> v(10, 5.0)预期同上5.0 转 int若匹配到模板构造函数,导致 ​编译错误​ 或 ​非法内存访问

 显式调用构造函数,避免隐式转换

#include <iostream>class MyInt {
public:MyInt(int value) : data(value) {}int getData() const { return data; }
private:int data;
};int main() {MyInt obj(6); // 直接初始化,显式调用构造函数std::cout << "Object data: " << obj.getData() << std::endl;return 0;
}

列表初始化(C++11)​

int a{7}; 或 int b = {8};(统一语法,禁止窄化转换)

#include <iostream>int main() {int a{7}; // 列表初始化int b = {8}; // 另一种列表初始化形式// int c{3.14}; // 错误,禁止窄化转换std::cout << "a: " << a << ", b: " << b << std::endl;return 0;
}
  • 统一初始化语法,适用于基本类型、数组、容器(如std::map<int, std::string> m{{1, "one"}, {2, "two"}}
  • 优先匹配std::initializer_list构造函数(如vector<int>{3,5}生成[3,5]而非[5,5,5]

 

2、类对象的默认构造函数何时会被调用?

当对象声明不带参数时自动调用:MyClass obj;—— 默认构造函数

class MyClass {
public:MyClass() {std::cout << "Default constructor called" << std::endl;}
};int main() {MyClass obj; // 自动调用默认构造函数return 0;
}

STL 容器(如 vector<MyClass>)或数组(如 MyClass arr[5])要求元素类型必须具有默认构造函数,否则无法初始化

#include <iostream>
#include <vector>class MyClass {
public:MyClass() {std::cout << "Default constructor called" << std::endl;}
};int main() {std::vector<MyClass> vec(3); // 调用 3 次默认构造函数MyClass arr[2]; // 调用 2 次默认构造函数return 0;
}
std::vector<MyClass> vec(10);  // 错误:若 MyClass 无默认构造函数// 没有默认构造函数的时候
MyClass obj;  // 错误:找不到默认构造函数

若基类未显式定义默认构造函数,派生类的默认构造函数会因无法调用基类默认构造函数而报错 

#include <iostream>class Base {
public:Base(int x) {std::cout << "Base constructor called with x: " << x << std::endl;}
};class Derived : public Base {
public:// 错误:Derived 的默认构造无法调用 Base 的默认构造// Derived() {} 
};int main() {// Derived obj; // 编译错误return 0;
}

作为类的成员变量初始化:如果一个类包含另一个类类型的成员变量,并且在该类的构造函数中没有显式初始化这个成员变量,那么会调用该成员变量类型的默认构造函数。 

class InnerClass {
public:InnerClass() {std::cout << "InnerClass default constructor called" << std::endl;}
};class OuterClass {
public:InnerClass inner;OuterClass() {std::cout << "OuterClass constructor called" << std::endl;}
};int main() {OuterClass obj;return 0;
}

     

    二、进阶

    1、类的成员变量有哪些初始化方式?优先级如何?

    初始化方式执行阶段优先级示例
    类内初始值编译期最低int m_val = 10;
    初始化列表构造函数体执行前最高MyClass(int x) : m_val(x) {}
    构造函数体内赋值构造函数体执行时中等MyClass(int x) { m_val = x; }
    • 类内初始值(C++11)​
      int m_val = 10;(声明时直接赋值,优先级最低)
    class MyClass {
    public:int m_val = 10; // 类内初始值MyClass() {std::cout << "m_val in constructor: " << m_val << std::endl;}
    };int main() {MyClass obj;return 0;
    }
    • 构造函数初始化列表
      MyClass(int x) : m_val(x) {}优先级最高,先于构造函数体执行)
    class MyClass {
    public:int m_val;MyClass(int x) : m_val(x) {std::cout << "m_val in constructor: " << m_val << std::endl;}
    };int main() {MyClass obj(20);return 0;
    }
    • 构造函数体内赋值
      MyClass(int x) { m_val = x; }(会覆盖前两种初始化)
    class MyClass {
    public:int m_val = 10; // 类内初始值MyClass(int x) {m_val = x; // 构造函数体内赋值std::cout << "m_val in constructor: " << m_val << std::endl;}
    };int main() {MyClass obj(30);return 0;
    }
    • 初始化顺序​:按成员声明顺序执行,与初始化列表顺序无关(如A() : y(10), x(y)可能导致x使用未初始化的y
    • 性能对比​:初始化列表直接构造,而构造函数体内赋值需先默认构造再赋值(对复杂对象有性能差异)

    2、静态成员变量的初始化方式是怎样的?

    静态成员变量属于类而不是类的某个对象,需要在类外进行初始化。

    class MyClass {
    public:static int s_val;
    };int MyClass::s_val = 10; // 类外初始化

    如果静态成员变量是常量整数类型(如const int),可以在类内进行初始化。 

    class MyClass {
    public:static const int s_const_val = 20;
    };
    

    三、高阶

    1、列表初始化的底层原理是什么?何时会触发std::initializer_list构造函数?

    编译器将{1,2,3}转换为临时数组const int[3],并生成std::initializer_list对象(包含数组指针和大小)

    触发条件​:

    • 类定义了std::initializer_list参数的构造函数
    • 优先匹配规则​:当存在initializer_list构造函数时,{}语法会强制优先调用该版本
    vector<int> v1(3,5);   // 生成[5,5,5]
    vector<int> v2{3,5};   // 生成[3,5],优先调用initializer_list版本

    在模板编程中,列表初始化可以让模板函数或类更灵活地处理不同类型的初始化列表。另外,当使用列表初始化创建对象时,如果类没有合适的std::initializer_list构造函数,但有其他可以接受相应参数的构造函数,编译器会尝试进行普通的构造函数匹配。

    template<typename T>
    void printList(const std::initializer_list<T>& list) {for (const auto& element : list) {std::cout << element << " ";}std::cout << std::endl;
    }int main() {printList({1, 2, 3, 4});printList({'a', 'b', 'c'});return 0;
    }

    2、C++17对枚举类型的初始化有何优化?请举例说明

    C++17允许直接通过整型值列表初始化枚举类型,无需显式转换

    enum class Month : int { Jan=1, Dec=12 };
    Month m{12};  // C++17合法,等同于static_cast<Month>(12)

     

    相关文章:

    [C++面试] 初始化相关面试点深究

    一、入门 1、C中基础类型的初始化方式有哪些&#xff1f;请举例说明 ​默认初始化​ 对于全局变量和静态变量&#xff0c;基础类型&#xff08;如int、float、double等&#xff09;会被初始化为 0&#xff1b;而对于局部变量&#xff0c;其值是未定义的&#xff0c;包含随机…...

    在线地图支持天地图和腾讯地图,仪表板和数据大屏支持发布功能,DataEase开源BI工具v2.10.7 LTS版本发布

    2025年4月11日&#xff0c;人人可用的开源BI工具DataEase正式发布v2.10.7 LTS版本。 这一版本的功能变动包括&#xff1a;数据源方面&#xff0c;Oracle数据源支持获取和查询物化视图&#xff1b;图表方面&#xff0c;在线地图支持天地图、腾讯地图&#xff1b;新增子弹图&…...

    粉末冶金齿轮学习笔记分享

    有一段小段时间没有更新了&#xff0c;不知道小伙们有没有忘记我。最近总听到粉末冶金齿轮这个概念&#xff0c;花点时间来学习一下&#xff0c;总结一篇笔记分享给大家。废话不多说&#xff0c;直接开始&#xff1a; “粉末冶金”是一种制造工艺&#xff0c;包括在高压下压实…...

    Retina:部署在神经硬件的SNN眼动追踪算法

    论文链接&#xff1a;Retina : Low-Power Eye Tracking with Event Camera and Spiking Hardware 这是一篇发表在2024CVPRW上的文章&#xff0c;做了三个contribution&#xff1a; 将SNN放在Eye Tracking任务上。提出了Ini-30数据集部署到了Spike硬件上 还是挺有趣的。但是由于…...

    OCR API识别对比

    OCR 识别DEMO OCR识别 demo 文档由来 最开始想使用百度开源的 paddlepaddle大模型 研究了几天&#xff0c;发现表格识别会跨行&#xff0c;手写识别的也不很准确。最终还是得使用现成提供的api。。 文档说明 三个体验下来 腾讯的识别度比较高&#xff0c;不论是手写还是识别表…...

    nodejs构建项目

    从零到一搭建 Node.js 框架 搭建一个 Node.js 框架是理解 Web 应用架构的绝佳方式。本指南将带您完成创建一个轻量级但功能完善的 Node.js 框架的全过程&#xff0c;类似于 Express 或 Koa&#xff0c;但规模更小&#xff0c;便于理解。 目录 项目初始化创建核心应用类路由系…...

    flutter 桌面应用之右键菜单

    ​在 Flutter 桌面应用开发中&#xff0c;context_menu 和 contextual_menu 是两款常用的右键菜单插件&#xff0c;各有特色。以下是对它们的对比分析&#xff1a;​ context_menu 集成方式&#xff1a;​通过 ContextMenuArea 组件包裹目标组件&#xff0c;定义菜单项。​掘金…...

    Cygwin编译安装Acise

    本文记录Windows下使用Cygwin编译安装Acise的流程。 零、环境 操作系统Windows11Visual Studio CodeVisual Studio Code 1.92.0Cygwin 一、工具及依赖 1.1 Visual Studio Code 下载并安装Visual Studio Code, 同时安装以下插件&#xff0c; Task Explorer Output Colorizer …...

    基于STM32、HAL库的IP6525S快充协议芯片简介及驱动程序设计

    一、简介: IP6525S是一款高性能的同步降压DC-DC转换器芯片,具有以下特点: 输入电压范围:4.5V至32V 输出电压范围:0.8V至30V 最大输出电流:5A 效率高达95% 可编程开关频率(100kHz-1MHz) 支持PWM和PFM模式 内置过流保护、过温保护等功能 该芯片常用于工业控制、通信设备…...

    RabbitMQ惰性队列的工作原理、消息持久化机制、同步刷盘的概念、延迟插件的使用方法

    惰性队列工作原理 惰性队列通过尽可能多地将消息存储到磁盘上来减少内存的使用。与传统队列相比&#xff0c;惰性队列不会主动将消息加载到内存中&#xff0c;而是尽量让消息停留在磁盘上&#xff0c;从而降低内存占用。尽管如此&#xff0c;它并不保证所有操作都是同步写入磁…...

    MySQL与Oracle深度对比

    MySQL与Oracle深度对比&#xff1a;数据类型与SQL差异 一、数据类型差异 1. 数值类型对比 数据类型MySQLOracle整数TINYINT, SMALLINT, MEDIUMINT, INT, BIGINTNUMBER(精度) 或直接INT(内部仍为NUMBER)小数DECIMAL(p,s), FLOAT, DOUBLENUMBER(p,s), FLOAT, BINARY_FLOAT, BI…...

    【Leetcode 每日一题】1922. 统计好数字的数目

    问题背景 我们称一个数字字符串是 好数字 当它满足&#xff08;下标从 0 0 0 开始&#xff09;偶数 下标处的数字为 偶数 且 奇数 下标处的数字为 质数 ( 2 , 3 , 5 (2, \ 3, \ 5 (2, 3, 5 或 7 ) 7) 7)。 比方说&#xff0c;“2582” 是好数字&#xff0c;因为偶数下标处…...

    pyqtgraph.opengl.items.GLSurfacePlotItem.GLSurfacePlotItem 报了一个错

    1. 需求是这个样子的 有一个 pyqtgraph.opengl.GLViewWidget &#xff0c;在应用启动时存在QMainWindow中&#xff0c;即父对象是QMainWindow&#xff0c;当业务需要时&#xff0c;修改它的父对象变为一个QDialog&#xff0c;可以让它从QMainWindow中弹出显示在QDialog里&#…...

    【C++初学】课后作业汇总复习(六) 函数模板

    1、函数模板 思考&#xff1a;如果重载的函数&#xff0c;其解决问题的逻辑是一致的、函数体语句相同&#xff0c;只是处理的数据类型不同&#xff0c;那么写多个相同的函数体&#xff0c;是重复劳动&#xff0c;而且还可能因为代码的冗余造成不一致性。 解决&#xff1a;使用…...

    【第16届蓝桥杯C++C组】--- 数位倍数

    Hello呀&#xff0c;小伙伴们&#xff0c;第16届蓝桥杯也完美结束了&#xff0c;无论大家考的如何&#xff0c;都要放平心态&#xff0c;今年我刚上大一&#xff0c;也第一次参加蓝桥杯&#xff0c;刷的算法题也只有200来道&#xff0c;但是还是考的不咋滴&#xff0c;但是拿不…...

    ASP.NET Core 性能优化:客户端响应缓存

    文章目录 前言一、什么是缓存二、客户端缓存核心机制&#xff1a;HTTP缓存头1&#xff09;使用[ResponseCache]属性&#xff08;推荐&#xff09;2&#xff09;预定义缓存配置&#xff08;CacheProfile&#xff09;3&#xff09;手动设置HTTP头4&#xff09;缓存验证机制&#…...

    Numpy和OpenCV库匹配查询,安装OpenCV ABI错误

    文章目录 地址opencv-python&#xff1a;4.x版本的对应numpyopencv-python&#xff1a;5.x版本的对应numpy方法2 ps&#xff1a;装个opencv遇到ABI错误无语了&#xff0c;翻了官网&#xff0c;github文档啥都没&#xff0c;记录下 地址 opencv-python&#xff1a;4.x版本的对应…...

    全球变暖(蓝桥杯 2018 年第九届省赛)

    题目描述 你有一张某海域 NN 像素的照片&#xff0c;. 表示海洋、 # 表示陆地&#xff0c;如下所示&#xff1a; ....... .##.... .##.... ....##. ..####. ...###. .......其中 "上下左右" 四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。 由…...

    ubuntu18.04安装miniforge3

    1.下载安装文件 略&#xff08;注&#xff1a;从同事哪里拖来的安装包&#xff09; 2.修改安装文件权限 chmod x Miniforge3-Linux-x86_64.sh 3.将它安装到指定位置 micromamba activate /home/xxx/fxp/fromDukto/miniforge3 4.激活 /home/xxx/fxp/fromDukto/miniforge3…...

    高并发短信系统设计:基于SharingJDBC的分库分表、大数据同步与实时计算方案

    高并发短信系统设计&#xff1a;基于SharingJDBC的分库分表、大数据同步与实时计算方案 一、概述 在当今互联网应用中&#xff0c;短信服务是极为重要的一环。面对每天发送2000万条短信的需求&#xff0c;我们需要一个能够处理海量数据&#xff08;一年下来达到数千万亿级别&…...

    OceanBase企业版集群部署:oatcli命令行方式

    OceanBase企业版集群部署&#xff1a;oatcli命令行方式 安装包准备服务器准备最低资源配置是否部署ODP组件&#xff1f;仲裁服务器 服务器配置操作系统内核参数BIOS设置磁盘挂载网卡设置 安装OAT部署工具初始化OBServer服务器使用oatcli部署三副本集群安装OceanBase软件初始化O…...

    SQL 查询中涉及的表及其作用说明

    SQL 查询中涉及的表及其作用说明&#xff1a; 涉及的数据库表 表名别名/用途关联关系dbo.s_orderSO&#xff08;主表&#xff09;存储订单主信息&#xff08;订单号、日期、客户等&#xff09;dbo.s_orderdetailSoD&#xff08;订单明细&#xff09;通过 billid SO.billid 关…...

    智能手机功耗测试

    随着智能手机发展,用户体验对手机的续航功耗要求越来越高。需要对手机进行功耗测试及分解优化,将手机的性能与功耗平衡。低功耗技术推动了手机的用户体验。手机功耗测试可以采用powermonitor或者NI仪表在功耗版上进行测试与优化。作为一个多功能的智能终端,手机的功耗组成极…...

    UNIX域套接字(Unix Domain Sockets, UDS) 的两种接口

    目录 1. 流式套接字&#xff08;SOCK_STREAM&#xff09;特点类比典型使用场景代码示例&#xff08;伪代码&#xff09; 2. 数据报套接字&#xff08;SOCK_DGRAM&#xff09;特点类比典型使用场景代码示例&#xff08;伪代码&#xff09; 3. 两者的核心区别对比4. 为什么 UNIX …...

    使用U盘安装 ubuntu 系统

    1. 准备U 盘制作镜像 1.1 下载 ubuntu iso https://ubuntu.com/download/ 这里有多个版本以供下载&#xff0c;本文选择桌面版。 1.2 下载rufus https://rufus.ie/downloads/ 1.3 以管理员身份运行 rufus 设备选择你用来制作启动项的U盘&#xff0c;不能选错了&#xff1b;点…...

    安全厂商安全理念分析

    奇安信&#xff08;toB企业安全&#xff09; 安全理念&#xff1a;率先提出 “内生安全” 理念。即把安全能力内置到信息化环境中&#xff0c;通过信息化系统和安全系统的聚合、业务数据和安全数据的聚合、IT 人才和安全人才的聚合&#xff0c;让安全系统像人的免疫系统一样&a…...

    Redis如何判断哨兵模式下节点之间数据是否一致

    在哨兵模式下判断两个Redis节点的数据一致性&#xff0c;可以通过以下几种方法实现&#xff1a; 一、检查主从复制偏移量 使用INFO replication命令 分别在主节点和从节点执行该命令&#xff0c;比较两者的master_repl_offset&#xff08;主节点&#xff09;和slave_repl_offs…...

    HarmonyOS-ArkUI V2装饰器: @Provider和@Consumer装饰器:跨组件层级双向同步

    作用 我们在之前学习的那些控件中,各有特点,也各有缺陷,至今没有痛痛快快的出现过真正能跨组件的双向绑定的装饰器。 比如 @Local装饰器,不能跨组件@Param装饰器呢,能跨组件传递,但是仅仅就是下一层组件接收参数。另外,它是单向传递,不可被重新赋值。如果您非要改值则…...

    oracle 并行度(Parallel Degree)

    在Oracle数据库中&#xff0c;并行度&#xff08;Parallel Degree&#xff09; 是用于控制并行处理任务的关键配置&#xff0c;旨在通过多进程协作加速大规模数据处 一、并行度的核心概念 并行度&#xff08;DOP, Degree of Parallelism&#xff09; 表示一个操作同时使用的并…...

    Redis-场景缓存+秒杀+管道+消息队列

    缓存一致性 1.两次更新 先更新数据库&#xff0c;再更新缓存&#xff1b;先更新缓存&#xff0c;再更新数据库&#xff1b; 出现不一致问题场景&#xff1a; 先更新数据库&#xff0c;再更新缓存&#xff1b; 先更新缓存&#xff0c;再更新数据库&#xff1b; 两次更新的适…...