c++部分题

const关键字与宏定义的区别是什么?

const关键字和宏定义在功能上有相似之处,但在实现和使用上有很大的区别。

  1. 作用域和类型安全性

    • const关键字定义的常量具有作用域和类型安全性。它们的作用域仅限于声明它们的块,并且在编译时会进行类型检查。
    • 宏定义创建的常量是全局的,不受作用域限制,并且在编译时仅进行简单的文本替换,不进行类型检查,可能导致错误。
  2. 编译时和运行时

    • const定义的常量在编译时分配内存,并且在程序的整个生命周期内保持不变。
    • 宏定义创建的常量是在预处理阶段进行文本替换的,不会在编译时分配内存,也不会在程序的其他阶段保持不变。
  3. 调试和可读性

    • const定义的常量可以被调试器识别,并且具有更好的可读性,因为它们具有有意义的名称。
    • 宏定义的常量在调试时不容易识别,并且可能会降低代码的可读性,因为它们通常是简单的文本替换。
  4. 函数和方法

    • const关键字还可用于声明函数和方法,表示这些函数和方法是常量成员函数,即它们不会修改对象的状态。
    • 宏定义不能用于声明函数或方法。

malloc的底层实现是怎样的?free是怎么回收内存的?

malloc采用的时内存池的管理方式,为了减少内存碎片和系统调用的开销,malloc会先申请大块的内存作为堆区,然后将堆区分为多个内存开,以块作为内存管理的基本单位。当用户申请内存时,直接从堆区分配一块合适的空闲块。

用户 free 掉的内存并不是都会马上归还给系统,ptmalloc 会统一管理 heap 和 mmap 映射区域中的空闲的 chunk,当用户进行下一次分配请求时,ptmalloc 会首先试图在空闲的chunk 中挑选一块给用户,这样就避免了频繁的系统调用,降低了内存分配的开销。

new/delete与malloc/free的区别与联系是什么?

  • malloc/free 是c/c++语言的标准库函数,new/delete是c++运算符或表达式
  • new能够自动分配空间大小,malloc需要传入参数,
  • new能开辟空间同时还能对空间做初始化操作,而malloc不行
  • new/delete能对对象进行构造和析构函数的调用,进而对内存进行更加详细的工作,而malloc/free不能

区分以下概念:内存泄漏、内存溢出、内存踩踏、野指针?

  • 内存泄露memory leak是一种资源泄露,主要原因是计算机程序对存储配置管理的失当,造成失去对一段已分配内存空间的控制,造成程序持续占用已经不再使用的空间,或者是存贮器所存储的对象无法透过执行代码访问而令内存资源空耗——————————一般一次内存泄漏不会有很大的影响,但内存泄漏堆积后后果就是内存溢出。

  • 内存溢出out of memory值得就是应用系统中无法回收的内存或者是使用的内存过多,最终使得程序运行要用的内存大于能够提供的最大内存,此时程序就运行不了了,系统会挺行内存溢出,简单的说就是想要的空间大于可以分配的弓箭大小

以上两者的关系内存泄漏的堆积最终会导致内存溢出

内存踩踏也称为内存重叠,踩内存
1.数组访问越界 2.字符串操作越界
指访问了不合法的地址(访问了不属于自己的地址),如果访问的地址是其他变量的地址,就会破坏别人的数据,从而导致程序运行的异常

野指针也称为悬空指针,值得是不指向任何合法的对象的指针
指针的只想位置是不可知的(随机的,不正确的,没有明确限制的)指针变量在定义时没有进行初始化,其值是随机的,意味着指针指向了一个地址不确定的变量。简单说的野指针是指向一个已经删除的对象或未申请访问受限内存区域的指针

引用与指针的区别是什么?并且将"引用"作为函数参数有哪些特点?在什么时候需要使用"常引用"?

区别

  • 引用必须被初始化,但是不分配存储空间,指针不声明时初始化,在初始时候需要分配存储空间

  • 引用初始化后不能被改变,阵阵可以改变所指的对象
    不存在指向空指的引用,但是存在都指向空指的指针

  • 当引用作为函数参数时,其效果和用指针作为函数菜蔬的效果相当。当调用函数时,函数中的形参就会被当成参数变量或者对象的一个别名来使用,也就是说此时函数中对形参的各种操作实际上时对形参本身进行操作,而非简单的将实参变量或者对象的指拷贝给形参,

  • 使用指针作为函数的形参虽然达到的效果和使用引用一样,但当调用函数时应需要将形参指针变量在内存中分配空间,而引用则不需要这样。

既要提高程序效率又要保护传递给函数的数据不再函数中被改变就需要使用常引用

什么是inline函数?inline与带参数的宏定义之间的区别是什么?

inline函数时内联函数,通常和类一起使用。用于取代c语言中的菜参数的宏定义

在C语言中使用宏可以提高执行效率,但宏本身并不是函数。

  1. 使用宏最大的缺点就是容易出错,预处理器在拷贝在红代码时常常会产生意想不到的边际效应。
  2. 另外宏另一个缺点就是不可调试,而内联函数可以调试。
  3. c++而言使用红代码还有一种缺点,无法操作类的私有数据成员。
  4. 内联函数的的另一个优点是,,函数被内敛后编译器可以通过上下文相关的优化技术对结果代码执行更加深入的优化

如何判断一段程序是由C 编译程序还是由C++编译程序编译的

(1)如果是要你的代码在编译时发现编译器类型,就判断_cplusplus或_STDC_宏,通常许多编译器还有其他编译标志宏,

#ifdef __cplusplus

   cout<<"c++";

#else

   cout<<"c";

#endif

    如果要判断已经编译的代码的编译类型,就用nm查一下输出函数符号是否和函数名相同。(相同为c,不同为c++。详解见下面)

(2)

简单是说,由于c语言是没有重载函数的概念的,所以c编译器编译的程序里,所有函数只有函数名对应的入口。而由于c++语言有重载函数

的概念,如果只有函数名对应的入口,则会出现混淆,所以c++编译器编译的程序,应该是函数名+参数类型列表对应到入口。

注意,因为main函数是整个程序的入口,所以main是不能有重载的,所以,如果一个程序只有main函数,是无法确认是c还是c++编译器

编译的
可以通过nm来查看函数名入口
如一个函数
int foo(int i, float j)

c编译的程序通过nm查看

foo 0x567xxxxxx (地址)

c++编译程序,通过nm查看

foo(int, float) 0x567xxxxxx

另外,如果要在c++编译器里使用通过c编译的目标文件,必须通知c++编译器,我使用的函数是c风格的,不需要列出参数列表的,这样c++编译才能正确的连接

extern “c” foo;

来源 网址

函数重载的原理是什么?

c++进行函数重载的实现原理叫做名字改编(name mangling),具体规则是

1.函数名必须相同
2.参数列表必须不同(参数的类型不同,个数不同,顺序不同)任意一项不同即可
3.函数的返回值类型可以相同也可以不相同
4.仅仅返回类型不同不足以成为函数的重载

inline函数与带参数的宏定义的区别?

内联函数在编译时展开,宏在预编译时展开;
内联函数直接潜逃到目标代码中,宏时简单的做文本替换
内联函数由类型检测语法判断等功能,而宏没有
inline函数时函数,宏不是;
宏定义时要注意书写(参数要括起来)否则容易出现歧义,内联函数不会产生歧义

std::stringconst char * 有什么区别?

string是类,const char是指针,一个是字符串对象,一个是c风格的字符串
string可以看作是对const char
的封装,string有完善的接口

一个空类占据的空间有多大?会自动创建哪些函数呢?

空类的空间大小是1
为什么会占据1而不是0?
因为类需要有不同的地址表示,每个类的地址独一无二

c++一个类中6个默认的函数分别是构造,拷贝构造,赋值运算符重载,析构,以及取地址操作符重载以及const修饰的取地址操作符重载

设A为Test类的对象且赋有初值,则语句Test B(A); 表示什么意思?

将a的值拷贝给b

什么是拷贝构造函数,其形态是什么,参数可以修改吗?

拷贝沟槽函数是一个特殊的构造函数,他在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于
通过使用同一个类型的对象来初始化新创建的对象
赋值对象把他作为参数传递给函数
复制对象,并将函数返回给这个函数
如果在类中没有定义一个拷贝构造函数,编译器会自行定义一个,若类中带有指针变量,并有动态分配,则它必须有一个拷贝构造函数

classname (const classname &obj) {
   // 构造函数的主体
}

obj 是一个对象引用,该对象是用于初始化另一个对象的。

什么情况下,会调用拷贝构造函数?

当一个已经存在的对象初始化另一个新对象时,会调用拷贝构造函数
当实参和形参都是对象,进行实参和形参的结合的时候,会调用拷贝构造函数
当函数的返回值都是对象,函数调用完成返回时,会调用拷贝构造函数

什么是赋值运算符函数,其形态是什么?什么情况下需要手动提供赋值运算符函数呢?

赋值运算符是将一个对象的值复制给另一个已存在的对象

返回类型 类名::operator=(参数列表)
{
//...
}

当对象存在指向堆空间的指针数据成员是,需要提供赋值运算函数

浅拷贝与深拷贝区别?

浅拷贝:只是增加一个指针指向已存在的内存地址

深拷贝:增建了一个指针并申请了一个新的内存,使这个增加的指针指向这个新的内存

浅拷贝仅仅使指向被复制的内存地址,原地址发生改变,那么浅复制出来的对象也会相应的改变。深复制在计算机中开辟了一块新的内存地址用于存放复制的对象。

什么是左值与右值,拷贝构造函数中的引用与const为什么不能去掉

左值(lvalue)表示了一个占据内存中某个可被识别的位置(也就是一个地址),所以左值可以是变量也可以是指向特定内存得治的指针解引用的结果
右值(rvalue)是一个不表示内存中的某个可识别位置对象的表达式。

不能去掉,如果去掉const会存在非const左值绑定到右值上

this指针是什么? 有什么作用呢?

this指针是所有成员函数的隐含参数,它存在与非静态成员函数中,指向被调用函数的所在对象

它的作用就是指向成员函数所作用的对象,所以非静态成员函数中可以直接使用this来代表所指向该函数作用的对象指针

必须在构造函数初始化列表中初始化有哪几种情况?

  • 当函数成员用const关键字进行修饰以后,就成为常量成员。一经初始化,该数据成员便具有“只读属性”,在程序中无法对其值修改,他们只能在构造函数初始化列表中进行初始化
  • 引用成员也必须在构造函数初始化例表中进行初始化,否则编译报错
  • 当数据成员本身是自定义类类型对象时,比如一个直线类line对象中包含两个point类对象,对point对象的创建就必须放在line的构造函数的初始化列表中进行。

静态数据成员的初始化在哪里,需要注意什么?

  1. 因为静态数据成员不属于类的任何一个对象,所以他们并不是在创建类对象时被定义的,所以意味着他们不是由类的构造函数初始化的。
  2. 不能再类的内部初始化静态数据成员,必须再类的外部定义和初始化静态数据成员,且不再包含static关键字

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PXE批量装centos7系统

1.环境准备&#xff1a; yum -y install tftp-server xinetd #安装并启用 TFTP 服务 #修改TFTP服务的配置文件 vim /etc/xinetd.d/tftp protocol udp # TFTP默认使用UDP协议 wait no # no表示客户机可以多台一起连接&…

通过Caliper进行压力测试程序,且汇总压力测试问题解决

环境要求 第一步. 配置基本环境 部署Caliper的计算机需要有外网权限;操作系统版本需要满足以下要求:Ubuntu >= 16.04、CentOS >= 7或MacOS >= 10.14;部署Caliper的计算机需要安装有以下软件:python 2.7、make、g++(gcc-c++)、gcc及git。第二步. 安装NodeJS # …

Linux用户及用户组权限

一、用户和用户组 功能项命令实例作用用户组cat /etc/group查看当前系统存在的用户组groupadd testing添加一个新的用户组testingcat /etc/group查看组是否被新增成功groupmod -n test testing将testing重命名成testgroupdel test删除组testgroups root查看用户root所在的所有…

爱上数据结构:顺序表和链表

一、线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条…

python知识点总结(十)

python知识点总结十 1、装饰器的理解、并实现一个计时器记录执行性能&#xff0c;并且将执行结果写入日志文件中2、队列和栈的区别&#xff0c;并且用python实现3、设计实现遍历目录与子目录4、CPU处理进程最慢的情况通常发生在以下几种情况下&#xff1a;5、CPU处理线程最慢的…

iOS客户端自动化UI自动化airtest+appium从0到1搭建macos+脚本设计demo演示+全网最全最详细保姆级有步骤有图

Android客户端自动化UI自动化airtest从0到1搭建macos脚本设计demo演示全网最全最详细保姆级有步骤有图-CSDN博客 避坑系列-必读&#xff1a; 不要安装iOS-Tagent &#xff0c;安装appium -这2个性质其实是差不多的都是为了安装wda。注意安装appium最新版本&#xff0c;安装完…

洛谷 P1379 八数码难题

代码如下&#xff1a; #include<bits/stdc.h> using namespace std; struct node{string s;int pos; }star,en; map<string,int>mp[2]; queue<node>q[2]; int main(){cin>>star.s;en.s"123804765";for(int i0;i<9;i){if(star.s[i]0) sta…

利用python搭建临时文件传输服务

场景 如果想从一台服务器上传输文件又多种方法&#xff0c;其中常见的是利用scp进行传输&#xff0c;但是需要知道服务器的账号密码才能进行传输&#xff0c;但有时候我们并不知道账号密码&#xff0c;这个时候我们就可以通过python -m SimpleHTTPServer 命令进行传输文件 启…

快速幂算法在Java中的应用

引言&#xff1a; 在计算机科学和算法领域中&#xff0c;快速幂算法是一种用于高效计算幂运算的技术。在实际编程中&#xff0c;特别是在处理大数幂运算时&#xff0c;快速幂算法能够显著提高计算效率。本文将介绍如何在Java中实现快速幂算法&#xff0c;并给出一些示例代码和应…

灯哥驱动器端口讲解----foc电机驱动必看

CS:是电流采样的引脚&#xff0c;三项采样电流&#xff0c;现在只给了两路&#xff0c;另外一路算出来就行了 in:三项电流输入&#xff0c;驱动电机使用。 en:没有用 SDA,SCL&#xff1a;I2C的引脚用来读取编码器的计数值 tx,rx&#xff1a;引出来了一路串口&#xff0c;没有用…

P8623 [蓝桥杯 2015 省 B] 移动距离 Python

[蓝桥杯 2015 省 B] 移动距离 题目描述 X 星球居民小区的楼房全是一样的&#xff0c;并且按矩阵样式排列。其楼房的编号为 $1,2,3, \cdots $ 。 当排满一行时&#xff0c;从下一行相邻的楼往反方向排号。 比如&#xff1a;当小区排号宽度为 6 6 6 时&#xff0c;开始情形如…

JUC并发编程之常用方法

sleep() public void testSleepAndYield() {Thread t1 new Thread(() -> {try {log.debug("t1-sleep...");Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}}, "t1");log.debug("t1 start 前的状态&#…

【Linux】详解进程程序替换

一、替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支)&#xff0c;子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时&#xff0c;该进程的用户空间代码和数据完全被新程序替换&#xff0c;从新程序的启动例程开始执…

递增的三元子序列-数组334-c++

利用栈的暴力解法&#xff0c;O(n^2)的时间复杂度&#xff0c;但是leetcode报错超时。 #include <stack>class Solution { public:bool increasingTriplet(vector<int>& nums) {int m nums.size();int n 2;for (int i 0; i < m - 3; i) {stack<int&g…

如祺出行冲刺上市:三年被罚款270万元,销售费用远高于研发开支

3月26日&#xff0c;Chenqi Technology Limited&#xff08;如祺出行&#xff09;再次递交招股书&#xff0c;准备在港交所主板上市&#xff0c;中金公司、华泰国际、农银国际为其联席保荐人。据贝多财经了解&#xff0c;如祺出行曾于2023年8月递表。 相较于此前招股书&#xf…

Swagger3探索之游龙入海

引言 后端开发中常用的接口调用工具一般使用Postman、ApiPost工具&#xff0c;但后期需要与前端联调&#xff0c;要补充接口文档花费大量时间&#xff0c;此时Swagger3应运而生&#xff0c;大大提高沟通交流的效率。 引用依赖 <!-- Swagger3 调用方式 http://ip:port/swa…

Android Studio控制台输出中文乱码问题

控制台乱码现象 安卓在调试阶段&#xff0c;需要查看app运行时的输出信息、出错提示信息。 乱码&#xff0c;会极大的阻碍开发者前进的信心&#xff0c;不能及时的根据提示信息定位问题&#xff0c;因此我们需要查看没有乱码的打印信息。 解决步骤&#xff1a; step1: 找到st…

Jetson Orin NX 安装 anaconda、cuda、torch、torchvision

第一次接触踩了不少坑&#xff0c;切忌不要按照常见服务器、电脑的思路安装。 安装 JetPack 套件 JetPack 是 Nvidia为 Jetson 系列开发板开发的一款软件开发包&#xff0c;常用的开发工具基本都有&#xff0c;安装 Jetson 会自动的将匹配版本的CUDA、cuDNN、TensorRT等安装好…

day04_JDBC_课后练习(创建数据库,表格,添加模拟数据,搭建开发环境,编写实体类,实现接口,测试)

文章目录 day04_JDBC_课后练习1、创建数据库2、创建如下表格3、添加模拟数据4、搭建开发环境&#xff0c;准备各个工具组件&#xff08;1&#xff09;使用druid&#xff08;德鲁伊&#xff09;数据库连接池&#xff08;2&#xff09;使用尚硅谷的JDBCTools工具类&#xff08;直…

【虚幻引擎】DTWebSocketServer 蓝图创建WebSocket服务器插件使用说明

本插件可以使用蓝图创建WebSocket服务器&#xff0c;并监听响应数据。 1. 节点说明 Create Web Socket Server – 创建WebSocket服务器对象并开启监听 创建一个WebSocket服务器对象&#xff0c;并监听相应端口&#xff0c;连接地址为 ws://IP:PORT, 比如ws://192.168.1.5:9001…
最新文章