[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)

     

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901351.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    网络安全之-信息收集

    域名收集 域名注册信息 站长之家 https://whois.chinaz.com/ whois 查询的相关网站有:中国万网域名WHOIS信息查询地址: https://whois.aliyun.com/西部数码域名WHOIS信息查询地址: https://whois.west.cn/新网域名WHOIS信息查询地址: http://whois.xinnet.com/domain/whois/in…

    Linux网络http与https

    应用层协议HTTP 提示 因为现在大多数都是https&#xff0c;所以就用https来介绍http&#xff0c;https比http多了一个加密功能&#xff0c;不影响介绍http。 什么是http 虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的…

    讲解贪心算法

    贪心算法是一种常用的算法思想&#xff0c;其在解决问题时每一步都做出在当前状态下看起来最优的选择&#xff0c;从而希望最终能够获得全局最优解。C作为一种流行的编程语言&#xff0c;可以很好地应用于贪心算法的实现。下面我们来讲一篇关于C贪心算法的文章。 目录 贪心算法…

    vue3中watch的使用示例

    使用情况说明&#xff1a; 1、父组件中有个表格&#xff0c;点击表格行的修改基础信息&#xff0c;弹出修改对话框&#xff1b; 2、修改内容点击确认&#xff0c;发送请求&#xff0c;后端更新数据&#xff1b;不修改内容不发送请求&#xff1b; 3、可以连续修改&#xff1b…

    Spring MVC 请求类型注解详解

    Spring MVC 请求类型注解详解 1. 核心注解分类 Spring MVC 中的请求处理注解分为以下几类&#xff1a; 类别注解示例作用范围方法级注解RequestMapping, GetMapping 等方法级别参数级注解RequestParam, RequestBody方法参数模型/会话注解ModelAttribute, SessionAttributes方…

    C#: DxF文件中Spline解析

    以下是使用C#解析DXF文件中Spline(样条曲线)的完整代码示例&#xff0c;使用流行的netDxf库来处理DXF文件&#xff1a; 1. 安装netDxf库 首先通过NuGet安装netDxf库&#xff1a; Install-Package netDxf 2. 完整Spline解析代码 using System; using System.Collections.Ge…

    【软考系统架构设计师】系统架构设计知识点

    1、 从需求分析到软件设计之间的过渡过程称为软件架构。 软件架构为软件系统提供了一个结构、行为和属性的高级抽象&#xff0c;由构件的描述、构件的相互作用&#xff08;连接件&#xff09;、指导构件集成的模式以及这些模式的约束组成。 软件架构不仅指定了系统的组织结构和…

    二.springBoot项目集成ElasticSearch及使用

    二.springBoot项目集成ElasticSearch及使用 1.依赖引入2.ElasticSearch常见用法 1.依赖引入 <!--elasticsearch搜索引擎--> <!--高版本7.0后TransportClient已被淘汰&#xff0c;用rest-high-level-client代替--> <dependency><groupId>org.elasticse…

    微服务多模块构建feign项目过程与一些报错(2025详细版)

    目录 1.eureka-server的注意事项 2.eureka-feign的注意事项 3.多模块构建feign项目过程 3.1创建父项目 3.2创建子项目eureka-server 3.3创建子项目eureka-provider 3.4创建子项目eureka-feign 3.5运行 给个点赞谢谢 1.eureka-server的注意事项 eureka-server的yml文件…

    第十一届 蓝桥杯 嵌入式 省赛

    一、分析 本届的风格又变了一番&#xff0c;但是难度也降低了些。 又是考察了 PWM 和 ADC。 第八、九届也考察了 PWM。建议先复习这两届&#xff0c;再回来模拟。 LCD的显示也提了额外的要求。 1. 功能概述 电位器 R37 输出的模拟电压信号 PA6输出频率固定&#xff0c;占…

    小试牛刀-抽奖程序

    编写抽奖程序 需求&#xff1a;设计一个抽奖程序&#xff0c;点击抽奖按钮随机抽取一个名字作为中奖者 目标&#xff1a;了解项目结构&#xff0c;简单UI布局&#xff0c;属性方法、事件方法&#xff0c;程序运行及调试 界面原型 ​ 待抽奖&#xff1a; 点击抽奖按钮&#x…

    代码随想录算法训练营day2(数组)

    华子目录 长度最小的子数组思路 螺旋矩阵思路总结 长度最小的子数组 https://leetcode.cn/problems/minimum-size-subarray-sum/ 思路 使用滑动窗口&#xff0c;left表示滑动窗口的起始点&#xff0c;right表示滑动窗口的终点 class Solution:def minSubArrayLen(self, targ…

    6.1 GitHub亿级数据采集实战:双通道架构+三级容灾设计,破解API限制与反爬难题

    GitHub 项目数据获取功能设计与实现 关键词:GitHub API 集成、网页爬虫开发、数据存储设计、定时任务调度、异常处理机制 1. 数据获取架构设计 采用双通道数据采集策略,同时使用 GitHub 官方 API 和网页爬虫技术确保数据完整性: #mermaid-svg-XUg7xhHrzFAozG4J {font-fami…

    设计模式(结构型)-桥接模式

    目录 摘要 定义 类图 角色 具体实现 优缺点 优点 缺点 使用场景 使用案例 JDBC 和桥接模式 总结 摘要 在软件开发领域&#xff0c;随着系统规模和复杂性的不断攀升&#xff0c;如何设计出具有良好扩展性、灵活性以及可维护性的软件架构成为关键挑战。桥接模式作为一…

    Go 微服务框架 | 中间件

    文章目录 定义中间件前置中间件后置中间件路由级别中间件 定义中间件 中间件的作用是给应用添加一些额外的功能&#xff0c;但是不会影响原有应用的编码方式&#xff0c;想用的时候直接添加&#xff0c;不想用的时候也可以轻松去除&#xff0c;实现所谓的可插拔。中间件的实现…

    leetcode 198. House Robber

    本题是动态规划问题。 第一步&#xff0c;明确并理解dp数组以及下标的含义 dp[i]表示从第0号房间一直到第i号房间(包含第i号房间)可以偷到的最大金额&#xff0c;具体怎么偷这里不考虑&#xff0c;第i1号及之后的房间也不考虑。换句话说&#xff0c;dp[i]也就是只考虑[0,i]号…

    掌趣科技前端面试题及参考答案

    你使用 Vue 的频率如何,用得比较多吗? 在前端开发工作中,我对 Vue 的使用较为频繁。Vue 作为一款轻量级、易于上手且功能强大的前端框架,在众多项目里都发挥着重要作用。 在日常的项目里,Vue 的组件化开发特性为我带来了极大的便利。组件化能够将页面拆分成多个小的、可复…

    深入解析Python爬虫技术:从基础到实战的功能工具开发指南

    一、引言:Python 爬虫技术的核心价值 在数据驱动的时代,网络爬虫作为获取公开数据的重要工具,正发挥着越来越关键的作用。Python 凭借其简洁的语法、丰富的生态工具以及强大的扩展性,成为爬虫开发的首选语言。根据 Stack Overflow 2024 年开发者调查,68% 的专业爬虫开发者…

    CSS 笔记——Flexbox(弹性盒布局)

    目录 1. Flex 容器与 Flex 项目 2. 主轴与交叉轴 3. Flex 容器的属性 display flex-direction justify-content align-items align-content flex-wrap 4. Flex 项目的属性 flex-grow flex-shrink flex-basis flex align-self 5. Flexbox 的优点 6. Flexbox 的…

    Java学习手册:Java反射与注解

    Java反射&#xff08;Reflection&#xff09;和注解&#xff08;Annotation&#xff09;是Java语言中两个强大的特性&#xff0c;它们在框架开发和复杂应用中扮演着重要角色。反射允许程序在运行时检查和操作类、对象、接口、字段和方法&#xff0c;而注解则提供了一种元数据形…