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.mzph.cn/news/777051.shtml

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

相关文章

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;安装完…

结构体,联合体,枚举( 1 )

目录 前言 1.结构体 1.1结构体的声明 1.2结构体变量的创建和初始化 1.3结构体成员的访问字符 1.4结构体的内存大小 1.4.1对齐规则 1.5结构体传参 前言 在编程的世界里&#xff0c;数据结构的选择对于程序的效率和可读性有着至关重要的影响。不同的数据结构适用于不同的…

19. 变量

文章目录 一、变量二、变量的定义格式 一、变量 变量&#xff1a;程序中临时存储数据的容器&#xff0c;在程序执行过程中&#xff0c;其值有可能发生改变的量&#xff08;数据&#xff09;。但是这个容器中只能存一个值。 应用场景&#xff1a;在我们登录页面的时候&#xf…

2024最新华为OD机试试题库全 -【符号运算】- C卷

1. 🌈题目详情 1.1 ⚠️题目 给定一个表达式,求其分数计算结果。 表达式的限制如下: 所有的输入数字皆为正整数(包括0)仅支持四则运算(*/)和括号结果为整数或分数,分数必须化为最简格式(比如6,3/4,7/8,90/7)除数可能为0,如果遇到这种情况,直接输出"ERR…

C++多重继承与虚继承

多重继承的原理 多重继承(multiple inheritance)是指从多个直接基类中产生派生类的能力。 多重继承的派生类继承了所有父类的属性。 在面向对象的编程中&#xff0c;多重继承意味着一个类可以从多个父类继承属性和方法。 就像你有一杯混合果汁&#xff0c;它是由多种水果榨取…

Spring Boot(一)— Maven

Maven是一个跨平台的项目管理工具&#xff0c;主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。通过其项目对象模型&#xff08;POM&#xff09;&#xff0c;可以自动下载和管理项目所需的库和插件。 1 Maven 以上的pom.xml 包含了在开发中常用的标签与功能。 &…

KY7 质因数的个数(用Java实现)

描述 求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如1202*2*2*3*5&#xff0c;共有5个质因数。 输入描述&#xff1a; 可能有多组测试数据&#xff0c;每组测试数据的输入是一个正整数N&#xff0c;(1<N<10^9)。 输出描述&#xff1a; 对于每组数…

46.continue语句

目录 一.continue语句 二.视频教程 一.continue语句 continue语句的作用和break语句很像&#xff0c;break语句会跳出当前循环&#xff0c;而continue语句则是跳出本次循环&#xff0c;继续执行下一次循环。 举个例子&#xff1a; #include <stdio.h>void main(void)…

蓝桥杯练习题总结(三)线性dp题(摆花、数字三角形加强版)

目录 一、摆花 思路一&#xff1a; 确定状态&#xff1a; 初始化&#xff1a; 思路二&#xff1a; 确定状态&#xff1a; 初始化&#xff1a; 循环遍历&#xff1a; 状态转移方程&#xff1a; 二、数字三角形加强版 一、摆花 题目描述 小明的花店新开张&#xff0c;为了吸…

计算机组成原理 — 指令系统

指令系统 指令系统指令的概述指令的格式指令的字长取决于 操作数类型和操作种类操作数的类型数据在存储器中的存放方式操作类型 寻址方式指令寻址数据寻址立即寻址直接寻址隐含寻址间接寻址寄存器寻址寄存器间接寻址基址寻址变址寻址堆栈寻址 RISC 和 CISC 技术RISC 即精简指令…

软件测试之单元测试详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是单元测试&#xff1f; 单元测试是指&#xf…

「AI作曲家」Suno 使用 v3 在几秒钟内创作完整的两分钟歌曲

Suno 被誉为“音乐界的 ChatGPT”,它的独特之处在于能够根据简单的提示,自主创作包括歌词、人声和配器在内的完整音乐作品。更令人惊叹的是,你可以引导它精确地选择任何想要的音乐风格,从古老的三角洲蓝调到现代的电子寒潮,它还能灵活运用各种方言。 Suno 正在开启一个全…

【学习笔记】java项目—苍穹外卖day01

文章目录 苍穹外卖-day01课程内容1. 软件开发整体介绍1.1 软件开发流程1.2 角色分工1.3 软件环境 2. 苍穹外卖项目介绍2.1 项目介绍2.2 产品原型2.3 技术选型 3. 开发环境搭建3.1 前端环境搭建3.2 后端环境搭建3.2.1 熟悉项目结构3.2.2 Git版本控制3.2.3 数据库环境搭建3.2.4 前…

1-java运算符试题

一、选择题&#xff08;10个&#xff09; 下列哪个是Java中的赋值运算符&#xff1f; A. B. - C. D. * 答案&#xff1a;C对于表达式a 5; b 10; a b * 2&#xff0c;其结果是&#xff1f; A. 15 B. 20 C. 25 D. 30 答案&#xff1a;C下列哪个符号表示短路逻辑与&#xff…

使用certbot为网站启用https

1. 安装certbot客户端 cd /usr/local/bin wget https://dl.eff.org/certbot-auto chmod ax ./certbot-auto 2. 创建目录和配置nginx用于验证域名 mkdir -p /data/www/letsencryptserver {listen 80;server_name ~^(?<subdomain>.).ninvfeng.com;location /.well-known…

【Linux】 centos7安装卸载SQL server(2017、2019)

一、安装配置 准备一个基础Linux配置&#xff1a; 内存为20GB 运行内存为2GB的系统&#xff08;数据库小于2GB安装不了&#xff09; 1、网络配置 我们需要进行网络的连接 进入 cd /ect/sysconfig/network-script/ 编辑文件ifcfg-ens33 vi ifcfg-ens33 Insert键进行编辑 把ONBOO…

2024最新Win系统下VSCode下载安装与配置C/C++教程

2024最新Win系统下VSCode下载安装与配置C/C教程 文章目录 2024最新Win系统下VSCode下载安装与配置C/C教程1、下载安装VSCode2、安装运行时环境GCGC的环境配置 3、安装VSCode插件4、配置程序调试环境4.1确定文件存储路径4.2新建文件夹【.vscode】4.3在.vscode文件夹里新建四个配…

学透Spring Boot — [二] Spring 和 Spring Boot的比较

欢迎关注我们的专栏 学透 Spring Boot 一、创建一个简单Web应用 本篇文章&#xff0c;我们将会比较 Spring 框架和 Spring Boot 的区别。 什么是 Spring? 也许你在项目中已经可以很熟练的使用 Spring 了&#xff0c;但是当被问到这个问题时&#xff0c;会不会犹豫一下&#…

轻松赚钱,精彩生活:上班族副业赚钱新攻略大揭秘!

薪水总是捉襟见肘&#xff0c;每月账单总让人倍感压力。你是否曾在静谧的夜晚&#xff0c;躺在床上&#xff0c;思索如何为家庭多赚一分钱&#xff1f;其实&#xff0c;你并不孤单。在这个充满机遇与挑战的时代&#xff0c;越来越多的人开始寻找副业&#xff0c;以期望让生活更…

QT控件之显示控件

Qt Designer显示窗口部件提供的面板中&#xff0c;提供了10种显示小部件 &#xff08;1&#xff09; Label标签 &#xff08;2&#xff09; Text Browser文本浏览器 &#xff08;3&#xff09; Graphics View图形视图 &#xff08;4&#xff09; Calendar Widget日历 &…