c++部分题

news/2024/4/27 21:39:29/文章来源:https://blog.csdn.net/weixin_45626953/article/details/137076705

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.luyixian.cn/news_show_1026988.aspx

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

相关文章

OpenHarmony实战开发-滑动容器组件Swiper的使用

介绍 本篇Codelab主要介绍了滑动容器组件Swiper的几种常见的应用场景&#xff0c;包括顶部导航、轮播图以及视频滑动播放。 相关概念 Swiper&#xff1a;滑动容器&#xff0c;提供子组件切换滑动的能力。Stack&#xff1a;堆叠容器&#xff0c;子组件按照顺序依次入栈&#x…

训练svm并部署树莓派

训练svm并部署树莓派 开发环境1. 准备数据集2. 训练模型3. 部署模型开发环境 vscode python 3.8 用到的库: scikit-learn==1.3.2 pickle torch pandas matplotlib 1. 准备数据集 数据为xls文件,如下格式 2. 训练模型 文件结构 执行训练 python代码 import pickle &…

【计算机网络】IP 协议

网络层IP协议 一、认识 IP 地址二、IP 协议报头格式三、网段划分1. 初识子网划分2. 理解子网划分3. 子网掩码4. 特殊的 IP 地址5. IP 地址的数量限制6. 私有 IP 地址和公网 IP 地址7. 理解全球网络&#xff08;1&#xff09;理解公网&#xff08;2&#xff09;理解私网&#xf…

Git 常用命令速查

Git 是一个分布式版本控制系统&#xff0c;用于管理代码和其他文件。它允许您跟踪代码的更改&#xff0c;并在必要时回滚到以前的版本。 本文将介绍一些 Git 常用命令&#xff0c;帮助您快速上手 Git。 初始化 Git 仓库 git init添加文件到暂存区 git add <file_name>…

【正版特惠】IDM 永久授权 优惠低至109元!

尽管小编有修改版IDM&#xff0c;但是由于软件太好用了&#xff0c;很多同学干脆就直接购买了正版&#xff0c;现在正版也不贵&#xff0c;并且授权码绑定自己的邮箱&#xff0c;直接官方下载激活&#xff0c;无需其他的绿化修改之类的操作&#xff0c;不喜欢那么麻烦的&#x…

简易指南:国内ip切换手机软件怎么弄

在网络访问受到地域限制的情况下&#xff0c;使用国内IP切换手机软件可以帮助用户轻松访问被屏蔽的内容&#xff0c;扩展网络体验。以下是虎观代理小二分享的使用国内IP切换手机软件的简易指南。并提供一些注意事项。 如何在手机上使用国内IP切换软件 步骤一&#xff1a;选择I…

16.JRE和JDK

程序员在编写代码的时候其实是需要一些环境&#xff0c;例如我们之前写的HelloWorld。我们需要的东西有JVM、核心类库、开发工具。 1、JVM&#xff08;Java Virtual Machine&#xff09;&#xff1a;Java虚拟机&#xff0c;真正运行Java程序的地方。没有虚拟机&#xff0c;代码…

R使用netmeta程序包实现对罕见事件(Rare events)的网状meta分析

在进行网状meta分析过程中&#xff0c;一些试验经常会出现罕见事件&#xff08;Rare event&#xff09;。尤其是在安全性评价中&#xff0c;由于一些不良事件发生率低、样本量不充足&#xff0c;导致试验组和对照组的事件发生例数少&#xff0c;甚至出现0事件。针对出现0事件的…

【任职资格】某大型制造型企业任职资格体系项目纪实

该企业以业绩、责任、能力为导向&#xff0c;确定了分层分类的整体薪酬模式&#xff0c;但是每一名员工到底应该拿多少工资&#xff0c;同一个岗位的人员是否应该拿同样的工资是管理人员比较头疼的事情。华恒智信顾问认为&#xff0c;通过任职资格评价能实现真正的人岗匹配&…

java注解的实现原理

首先我们常用的注解是通过元注解去编写的&#xff0c; 比如&#xff1a; 元注解有Target 用来限定目标注解所能标注的java结构&#xff0c;比如标注方法&#xff0c;标注类&#xff1b; Retention则用来标注当前注解的生命周期&#xff1b;比如source&#xff0c;class&…

【CSS】CSS基础1(CSS基本介绍+常见样式设计)

目录 什么是CSS&#xff1f; 语法规范 常见样式 例子 代码展示 什么是CSS&#xff1f; 点击以下链接了解更多&#xff1a; ​​​​​​​ ​​​​​https://baike.baidu.com/item/%E5%B1%82%E5%8F%A0%E6%A0%B7%E5%BC%8F%E8%A1%A8/524980?fromModulelemma_inlink(英文…

项目四-图书管理系统

1.创建项目 流程与之前的项目一致&#xff0c;不再进行赘述。 2.需求定义 需求: 1. 登录: ⽤⼾输⼊账号,密码完成登录功能 2. 列表展⽰: 展⽰图书 3.前端界面测试 无法启动&#xff01;&#xff01;&#xff01;--->记得加入mysql相关操作记得在yml进行配置 配置后启动…

java常用IO流功能——转换流,打印流,数据流,序列化流概述

前言&#xff1a; 整理下IO流的相关知识点笔记&#xff0c;打好基础&#xff0c;daydayup!!! 之前整理了下 字节流&#xff0c;字符流和缓冲流&#xff0c;有需要的可以看这里 java常用应用程序编程接口&#xff08;API&#xff09;——IO流概述及字节流的使用 java常用IO流功…

Spring:面试八股

文章目录 参考Spring模块CoreContainerAOP 参考 JavaGuide Spring模块 CoreContainer Spring框架的核心模块&#xff0c;主要提供IoC依赖注入功能的支持。内含四个子模块&#xff1a; Core&#xff1a;基本的核心工具类。Beans&#xff1a;提供对bean的创建、配置、管理功能…

❤ leetCode简易题1-两数之和、简易2--回文数判断、简易14-最长公共前缀

❤ leetCode简易题1-两数之和、简易题14- 最长公共前缀 1、简易1-两数之和 ① 题目要求 数字A B target&#xff0c;以target为求和结果&#xff0c;找出数组中符合的A、B数字下标。 第一次做的时候完全脑子一片蒙&#xff0c;随后认真看了看题目发现是发现找符合target和…

论文导读 | 漫谈编辑问题

摘要 本文着眼于深度学习模型在各个领域中的编辑问题&#xff0c;从通用的分类器编辑算法切入&#xff0c;展开介绍针对扩散模型的图像编辑问题和针对大语言模型的知识编辑问题&#xff0c;希望能为读者关于“修改模型的行为”这一话题提供一些启发。 引言 当我们训练好一个…

【问题分析】InputDispatcher无焦点窗口ANR问题【Android 14】

1 问题描述 Monkey跑出的无焦点窗口的ANR问题。 特点&#xff1a; 1&#xff09;、上层WMS有焦点窗口&#xff0c;为Launcher。 2&#xff09;、native层InputDispacher无焦点窗口&#xff0c;上层为”recents_animation_input_consumer“请求了焦点&#xff0c;但是”rece…

高防DNS和高防IP一样吗?

高防DNS和高防IP在功能和目标上有所不同&#xff0c;因此它们并不完全相同。 高防DNS是一种针对DNS服务的防护措施&#xff0c;旨在保护域名解析免受DDoS攻击等网络威胁的影响。它利用高防服务器和高防机房的资源&#xff0c;对无效流量进行清洗&#xff0c;保障DNS服务器的安…

零基础学习挖掘PHP网站漏洞

教程介绍 本套课程&#xff0c;分为三个阶段&#xff1a;第一阶段&#xff1a;基础篇 学习PHP开发的基础知识&#xff0c;对PHP常见的漏洞进行分析&#xff0c;第二阶段&#xff1a;进阶篇 实战PHP漏洞靶场&#xff0c;了解市面上的PHP主流网站开发技术&#xff0c;并对市面上…

图解MySQL目录

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) 一 .图解MySQL介绍 重点突击 MySQL 索引、事务、锁、日志等面试常问知识。 二 . 基础篇 执行一条 select 语句&#xff0c;期间发生了什么&#xff1f; : 执行一条 select 语句&#xff0c;期间发生了什…