突破编程_C++_面试(函数(1))

面试题1:函数定义与声明有什么区别?

函数定义与声明的区别主要体现在以下几个方面:
内存分配:
定义:函数定义会为函数分配内存空间,并且可能会为函数内部的局部变量分配内存。定义提供了函数在程序中的唯一描述,包括函数的实现细节,如函数体中的代码。
声明:函数声明不会分配内存空间。它仅仅告诉编译器函数的名称、返回类型和参数类型,但不会提供函数的实际实现。
实现与原型:
定义:函数定义包含了函数的实现,即函数体中的代码,这是函数具体执行的操作。
声明:函数声明通常称为函数原型,它提供了函数的签名,包括函数名、返回类型和参数列表,但不包括函数体。
出现次数:
定义:在C++程序中,函数的定义只能出现一次。如果尝试在多个地方定义相同的函数,会导致编译错误。
声明:函数声明可以在程序中多次出现。通常,函数声明会放在头文件中,而定义会放在源文件中。这样,当其他文件包含这个头文件时,就可以使用这个函数,而不需要知道它的具体实现。
作用域:
定义:函数定义具有作用域,它定义了函数在程序中的可见性和可访问性。
声明:函数声明也具有作用域,但它只是告诉编译器函数的存在和它的接口,而不涉及具体的实现。
总结来说,函数定义提供了函数的完整实现,包括函数体中的代码,而函数声明则提供了函数的接口信息,包括函数名、返回类型和参数列表,但不包括函数体。在 C++ 程序中,函数定义只能出现一次,而函数声明可以多次出现,通常用于在其他文件中声明函数的存在和接口。

面试题2:什么是函数重载?它有什么作用?

函数重载( Function Overloading )是 C++ 中一种重要的编程特性,它允许在同一作用域内定义多个同名函数,但这些函数的参数列表(即参数的个数、类型或顺序)必须不同。通过函数重载,我们可以使用相同的函数名来表示不同的操作,从而提高代码的可读性和可维护性。
函数重载的作用主要体现在以下几个方面:
提高代码的可读性和可维护性
重载函数使得程序员可以根据函数名来推测函数的功能,而不需要记住每个函数的具体细节。这有助于减少代码中的错误,并提高代码的可读性和可维护性。
避免命名冲突
通过函数重载,我们可以使用相同的函数名来表示不同的操作,而无需为每个操作创建不同的函数名。这有助于避免命名冲突,并使代码更加整洁和易于理解。
提供更灵活的函数调用方式
函数重载允许根据实际需求选择不同的函数。例如,我们可以根据参数的类型、个数或顺序来调用不同的函数,从而实现更灵活的函数调用方式。
需要注意的是,函数重载并不是通过函数的返回值类型来区分的(在函数调用时,编译器需要根据提供的参数来确定应该调用哪个重载函数。如果允许通过返回值类型来重载函数,编译器在编译时可能无法确定应该调用哪个函数,因为返回值类型是在函数执行后才知道的。这会导致编译时的歧义和不确定性)。也就是说,如果两个函数的参数列表完全相同,但返回值类型不同,那么它们将被视为两个不同的函数,而不是重载函数。这是因为函数的返回值类型不参与函数调用的过程,因此不能作为区分重载函数的依据。
总的来说,函数重载是 C++ 中一种非常有用的特性,它允许定义多个同名函数,并通过参数列表的不同来区分这些函数。这有助于提高代码的可读性和可维护性,避免命名冲突,并提供更灵活的函数调用方式。

面试题3:什么是内联函数?为什么使用它?

内联函数( Inline Function )是 C++ 中的一种特殊函数,它通过在编译时将函数体直接插入到函数调用点处,而不是通过常规的函数调用机制来执行。这样可以消除函数调用的开销,提高程序的执行效率。
内联函数通常用于频繁执行的小函数,这些函数体代码较小,但调用次数很多。由于每次函数调用都会带来一定的开销,如参数传递、栈帧创建和销毁等,因此使用内联函数可以减少这些开销,提高程序的执行效率。
内联函数的使用通过在函数定义前添加 inline 关键字来声明。然而,是否真正将函数内联展开是由编译器决定的,编译器会根据函数的实现和调用情况来决定是否进行内联展开。
使用内联函数的好处主要包括:
提高执行效率:通过消除函数调用的开销,内联函数可以提高程序的执行效率,特别是对于那些频繁执行的小函数。
减少函数调用的开销:内联函数避免了函数调用的开销,包括参数传递、栈帧创建和销毁等,从而减少了程序的时间消耗。
然而,使用内联函数也需要注意以下几点:
代码膨胀:由于内联函数会将函数体直接插入到调用点处,这可能导致编译后的代码体积增大,从而可能增加缓存未命中的概率,降低程序的执行效率。
不适用于复杂函数:内联函数通常只适用于简单的小函数,对于复杂的大型函数,内联可能会导致代码膨胀和编译时间增加。
内联函数的声明和定义:内联函数必须在调用之前被声明或定义,否则编译器无法知道它是内联函数。同时,内联函数的定义通常放在头文件中,以便在多个源文件中共享。
下面是一个简单的内联函数样例:

#include <iostream>  // 声明内联函数  
inline int add(int x, int y) 
{  return x + y;  
}  int main() 
{  // 调用内联函数  int result = add(1, 2);  std::cout << "the result is: " << result << std::endl;  return 0;  
}

由于 add 函数被定义为内联函数,编译器在编译时会尝试将 add 函数的调用替换为函数体的直接拷贝。这意味着在 main 函数中调用 add(1, 2) 时,编译器可能会直接将其替换为 return 1 + 2; ,从而消除函数调用的开销。

面试题4:什么是 const 函数和 const 参数?

const 函数
const 函数是指那些不会修改任何成员变量的函数。也就是说, const 成员函数只能调用其他的 const 成员函数,并且不能修改任何类的成员变量(除非这些变量被声明为 mutable )。
这样的函数通常在两种情况下使用:
(1)不希望修改对象的状态:例如,你可能有一个代表矩形的类,该类有一个计算面积的方法。这个方法不应该修改矩形的任何属性(如长度或宽度),因此,它可以被声明为 const 。
(2)对象是一个常量: const 修饰的对象只能调用该对象的 const 成员函数。
下面是一个 const 函数的例子:

class MyClass {  
public:  int getVal() const {  //m_val=2;		//错误: const 函数不能修改任何成员变量return m_val;  }  private:  int m_val;  
};

在这个例子中, getVal 函数是 MyClass 类的一个成员函数,并且被声明为 const 函数。由于 getVal 是 const 的,它不能修改类的任何成员变量(除非这些变量被声明为 mutable )。需要注意的是, const 函数并不意味着函数的返回值不能被修改。实际上, const 函数可以返回任何类型的值,包括可以被修改的类型。 const 关键字仅表示该函数不会修改调用它的对象的状态。
const参数
const 参数是指那些在函数体内不能被修改的参数。当将一个参数声明为 const 时,意味着这个参数在函数体内不会被修改,这有助于编译器进行更好的优化。
此外, const 参数也可以提高代码的可读性和可维护性,因为它清晰地表明了这个参数在函数体内不会被修改。
下面是一个使用 const 参数的例子:

int getStrLength(const std::string& str) // const参数
{ return str.length(); // 不能修改str
}

在这个例子中, str 是一个 const 引用参数,这意味着不能在 getStrLength 函数内部修改 str 。如果尝试这样做,编译器会报错。
总结, const 函数和 const 参数都是 C++ 中重要的编程概念,它们有助于编写更安全、更可读的代码,并允许编译器进行更好的优化。

面试题5:函数返回多个值的方法有哪些?

在C++中,函数通常只能返回一个值。然而,有几种方法可以模拟函数返回多个值的情况:
(1)使用结构体或类
可以创建一个结构体或类来封装多个值,并将这个结构体或类作为函数的返回值。这样,函数就可以"返回"多个值,实际上是返回了一个包含多个值的对象。

struct MyStruct 
{int val1;double val2;
};MyStruct getMultipleValues() 
{MyStruct res;res.val1 = 1;res.val2 = 1.2;return res;
}

(2)使用指针或引用
可以通过指针或引用传递一个变量到函数中,让函数修改这个变量的值。此时,函数"返回"多个值的方式是通过修改这些变量的值。

void getMultipleValues(char* val1, double& val2) 
{*val1 = 1;val2 = 1.2;
}int main() {int val1;double val2;getMultipleValues(val1, val2);// 现在 val1, val2 包含了函数返回的值
}

(3)使用 std::tuple
C++11 引入了 std::tuple ,它允许将不同类型的值组合在一起。可以返回一个 std::tuple ,并通过 std::tie 或解构赋值来获取返回值。

#include <tuple>std::tuple<int, double> getMultipleValues()
{return std::make_tuple(1, 1.2);
}int main() {auto result = getMultipleValues();int val1;double val2;std::tie(val1, val2) = result;// 现在 val1, val2 包含了函数返回的值
}

(4)使用 std::pair
对于两个值的情况,可以使用 std::pair 。

#include <utility>std::pair<int, double> getMultipleValues() {return std::make_pair(1, 1.2);
}int main() 
{auto result = getMultipleValues();int val1 = result.first;double val2 = result.second;// 现在 val1, val2 包含了函数返回的值
}

(5)使用 std::array 或 std::vector
对于固定大小或可变大小的多个相同类型的值,可以使用 std::array 或 std::vector 。

#include <array>std::array<int, 2> getMultipleValues() {return {1, 2};
}int main() {auto res = getMultipleValues();int val1 = res[0];int val2 = res[1];// 现在 val1, val2 包含了函数返回的值
}

在实际编程中,选择哪种方法取决于具体的使用场景和个人偏好。 std::tuple 和 std::pair 通常用于返回不同类型值的场景,而结构体或类则更适合于返回逻辑上紧密相关的多个值。使用引用或指针作为输出参数可以避免额外的内存分配开销,但可能会使代码更难阅读和理解。

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

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

相关文章

Mysql运维篇(五) 部署MHA--主机环境配置

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。如有侵权&#xff0c;请留言&#xff0c;我及时删除&#xff01; 大佬博文 https://www.cnblogs.com/gomysql/p/3675429.html MySQL 高可用&#xff08;MHA&#x…

SpringMVC 学习(五)之域对象

目录 1 域对象介绍 2 向 request 域对象共享数据 2.1 通过 ServletAPI (HttpServletRequest) 向 request 域对象共享数据 2.2 通过 ModelAndView 向 request 域对象共享数据 2.3 通过 Model 向 request 域对象共享数据 2.4 通过 map 向 request 域对象共享数据 2.5 通过…

【前端素材】推荐优质后台管理系统Jampack平台模板(附源码)

一、需求分析 后台管理系统&#xff08;或称作管理后台、管理系统、后台管理平台&#xff09;是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成&#xff0c;为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…

macOS系统下载IDEA的操作流程

第一步 进入官网 Download IntelliJ IDEA – The Leading Java and Kotlin IDE 第二步 根据mac的芯片选择版本下载 芯片的查看位置是【设置】-【通用】-【关于本机】-第二个&#xff0c;我的是Apple芯片&#xff0c;选Apple Silicon -- 第三步 右上角下载处打开安装包&…

C++——基础复习——双色球

跟着哔站的视频复习一遍基础知识&#xff0c;根据老师的思路写双色球项目。相较老师的程序加入了一些功能。没有用到模板知识&#xff0c;欢迎交流。 1、6个红球1个蓝球&#xff0c;红球号码1-33&#xff0c;号码不重复&#xff1b;篮球号码1-15. 2、自选号码功能&#xff1a…

Seata 入门知识

目录 概述 工作流程 工作模式 AT模式 TCC模式 概述 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 AT模式是阿里首推…

CUDA C++ 编程指南

目录 1. Introduction1.1. The Benefits of Using GPUs1.2. CUDA: A General-Purpose Parallel Computing1.3. A Scalable Programming Model CUDA C Programming Guide 1. Introduction 1.1. The Benefits of Using GPUs 在相似的价格和功耗范围内&#xff0c;图形处理单…

9个最受欢迎的开源自动化测试框架盘点!

自动化测试框架可以帮助测试人员评估多个Web和移动应用程序的功能&#xff0c;安全性&#xff0c;可用性和可访问性。尽管团队可以自己构建复杂的自动化测试框架&#xff0c;但是当他们可以使用现有的开源工具&#xff0c;库和测试框架获得相同甚至更好的结果时&#xff0c;通常…

Github开源贡献者的狂欢——教你如何免费领取价值$200的Starknet空投

前言&#xff1a; 2024 又迎来了四年一度的 BTC 减半时刻&#xff0c;币圈仿佛一下又热闹了起来&#xff0c;这几天有一个新的基于 ETH 的项目诞生了&#xff1a;StarkNet&#xff0c;代号 STRK&#xff0c;凡是在前 5000 个开源项目贡献过至少 3 个 commit 的程序猿都会被空投…

dhtml图片白色区域透明

2011-3-15 关于透明色别人已经讲的很好了&#xff0c;这里记录了一个测试例子。 gif只支持索引色透明&#xff0c;比如规定#FFFFFF为透明&#xff0c;那么图片中所有白色区域都完全透明。 而png支持alpha透明&#xff0c;任何颜色都可以透明&#xff0c;而且有透明度这样一个…

Linux系统网络服务部分拓展练习

1&#xff09;网关服务器&#xff1a;ens36&#xff1a;12.0.0.254/24&#xff0c;ens33&#xff1a;192.168.241.254/24&#xff1b;Server1&#xff1a;192.168.241.0/24&#xff1b;PC1和server2&#xff1a;自动获取IP&#xff1b;交换机无需配置。要求能够使用Xshell等远程…

MySQL - 事务日志

目录 1. redo日志 1.1 为什么需要REDO日志 1.2 REDO日志的好处、特点 1. 好处 2. 特点 1.3 redo的组成 1.4 redo的整体流程 1.5 redo log的刷盘策略 1.6 不同刷盘策略演示 1. 流程图 ​编辑2. 举例 1.7 写入redo log buffer 过程 1.8 redo log file 1. 相关参数…

matlab倒立摆小车LQR控制动画

1、内容简介 略 54-可以交流、咨询、答疑 2、内容说明 略 摆杆长度为 L&#xff0c;质量为 m 的单级倒立摆(摆杆的质心在杆的中心处)&#xff0c;小车的质量为 M。在水平方向施加控制力 u&#xff0c;相对参考系产生位移为 y。为了简化问题并且保其实质不变&#xff0c;忽…

【SelectIO】bitslice原语学习记录

基本概念 在Ultrascale (plus)系列上的FPGA中&#xff0c;Xilinx引入了bitslice硬核&#xff0c;它取代了7系列上的IDELAYCTRL/IODELAY/IOSERDES/IODDR系列硬核&#xff0c;用于为HP&#xff08;High Performance&#xff09;类型Bank上的IO接口提供串并转化、信号延时、三态控…

【k8s资源调度-HPA(自动扩缩容)】

1、HPA可以做什么&#xff1f; 通过观察pod的cpu、内存使用率或自定义metrics指标进行自动的扩容或缩容pod的数量。通常用于Deployment&#xff0c;不适用于无法扩/缩容的对象&#xff0c;如DaemonSet。控制管理器每隔30s(可以通过-horizontal-pod-autoscaler–sync-period修改…

特征选择|一种提升预测模型性能的方法(原理及其优化实现,Matlab)

文章来源于我的个人公众号&#xff1a;KAU的云实验台&#xff0c;主要更新智能优化算法的原理、应用、改进 如今&#xff0c;生成的数据集呈指数级增长&#xff0c;这将产生具有大量特征和样本的数据集&#xff0c;而显然&#xff0c;某些特征是不相关/冗余的&#xff0c;它们…

springBoot整合Redis(一、Jedis操作Redis)

在springboot环境下连接redis的方法有很多&#xff0c;首先最简单的就是直接通过jedis类来连接&#xff0c;jedis类就相当于是redis的客户端表示。 但是因为现在比较常用的是&#xff1a;StringRedisTemplate和RedisTemplate&#xff0c;所以jedis只做简单的介绍。 一、Jedis…

powershell中安装git

以管理员权限打开 PowerShell。 在 PowerShell 中&#xff0c;你可以使用 winget 这个 Windows 的包管理器来安装 Git。下列命令会安装 Git&#xff1a; winget install --id Git.Git -e --source winget另一种方式是直接从 Git 官方网站下载安装程序&#xff0c;并运行它完…

Langchain-Chatchat部署总结

项目地址&#xff1a; https://github.com/chatchat-space/Langchain-Chatchat 整体安装比较方便&#xff0c;在阿里云购买云主机&#xff0c;购买的国外站点机器&#xff0c; 该项目运行最佳坏境为 Linux Ubuntu 22.04.5Python 版本 3.11.7CUDA 版本: 12.1torch2.1.2 使…

Spring的优点

1.方便解耦&#xff0c;简化开发 Spring就是一个容器&#xff0c;可以将所有对象创建和关系维护交给Spring管理。 2.AOP编程支持 面向切面编程&#xff0c;方便实现程序进行权限拦截&#xff0c;运行监控等功能。 3.声明式事务的支持 通过配置完成事务的管理&#xff0c;…