当前位置: 首页 > news >正文

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关键字

相关文章:

c++部分题

const关键字与宏定义的区别是什么&#xff1f; const关键字和宏定义在功能上有相似之处&#xff0c;但在实现和使用上有很大的区别。 作用域和类型安全性&#xff1a; const关键字定义的常量具有作用域和类型安全性。它们的作用域仅限于声明它们的块&#xff0c;并且在编译时会…...

验证回文串

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给定一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xff1b;否则&#…...

vue2高德地图选点

<template><el-dialog :title"!dataForm.id ? 新建 : isDetail ? 详情 : 编辑" :close-on-click-modal"false" :visible.sync"show" class"rv-dialog rv-dialog_center" lock-scroll width"74%" :before-close&q…...

Gitflow:一种依据 Git 构建的分支管理工作流程模式

文章目录 前言Gitflow 背景Gitflow 中的分支模型Gitflow 的版本号管理简单模拟 Gitflow 工作流 前言 Gitflow 工作流是一种版本控制流程&#xff0c;主要适用于较大规模的团队。这个流程在团队中进行合作时可以避免冲突&#xff0c;并能快速地完成项目&#xff0c;因此在很多软…...

利用云手机技术,开拓海外社交市场

近年来&#xff0c;随着科技的不断进步&#xff0c;云手机技术逐渐在海外社交营销领域崭露头角。其灵活性、成本效益和全球性特征使其成为海外社交营销的利器。那么&#xff0c;究竟云手机在海外社交营销中扮演了怎样的角色呢&#xff1f; 首先&#xff0c;云手机技术能够消除地…...

脚本实现Ubuntu设置屏幕无人操作,自动黑屏

使用 xrandr 命令可以实现对屏幕的控制&#xff0c;包括调整分辨率、旋转屏幕以及关闭屏幕等。要实现 Ubuntu 设置屏幕在无人操作一段时间后自动黑屏&#xff0c;非待机&#xff0c;并黑屏后点击触摸屏可以唤醒屏幕&#xff0c;可以借助 xrandr 命令来实现。 首先&#xff0c;…...

16.JRE和JDK

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

C++从入门到精通——命名空间

命名空间 前言一、命名空间引例什么是命名空间 二、命名空间定义正常的命名空间定义嵌套的命名空间多个相同名称的命名空间 三、命名空间使用加命名空间名称及作用域限定符使用using将命名空间中某个成员引入使用using namespace 命名空间名称引用引用命名空间和引用头文件有什…...

JAVA面试大全之JAVA新特性篇

目录 1、Java 8特性 1.1、什么是函数式编程?Lambda表达式? 1.2、Stream中常用方法? 1.3、什么是FunctionalInterface? 1.4、如何自定义函数接口?...

【ZZULIOJ】1008: 美元和人民币(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy code 题目描述 美元越来越贬值了&#xff0c;手上留有太多的美元似乎不是件好事。赶紧算算你的那些美元还值多少人民币吧。假设美元与人民币的汇率是1美元兑换6.5573元人民币&#xff0c;编写程序输入美元的金额&a…...

LeetCode刷题笔记之动态规划(三)

一、子序列/子数组问题 子序列&#xff1a;按原数组的顺序排列&#xff0c;不一定是原数组中的相邻元素组成的。即子序列可以是不连续的。 子数组&#xff1a;原数组中连续的几个元素组成的数组。 1. 300【最长递增子序列】 题目&#xff1a; 给你一个整数数组 nums &#xff…...

Unity编辑器功能将AB资源文件生成MD5码

将路径Application.dataPath/ArtRes/AB/PC文件夹下所有的Ab包文件生成MD5吗&#xff0c;通过文件名 文件长度MD5‘|’的格式拼接成字符串写入到资源对比文件abCompareInfo.txt中。 将路径pathFile扥文件生成MD5码...

【案例·增】获取当前时间、日期(含,SQL中DATE数据类型)

问题描述&#xff1a; 需要使用当前时间、日期&#xff0c;可以使用 SQL 中的 CURDATE() 、NOW()、CURTIME()运算符 案例&#xff1a; INSERT INTO table_name(current_time, column_name2,...) VALUES (NOW(),, ...)规则(Date 相关函数)&#xff1a; 规则(Date数据类型)...

什么是回调函数?回调函数有什么缺点?如何解决回调地狱问题?

什么是回调函数&#xff1f;回调函数有什么缺点&#xff1f;如何解决回调地狱问题&#xff1f; 以下代码就是一个回调函数的例子&#xff1a; ajax(url, () > {// 处理逻辑 })回调函数有一个致命的弱点&#xff0c;就是容易写出回调地狱&#xff08;Callback hell&#xff0…...

如何在Linux系统使用Docker本地部署Halo网站并实现无公网IP远程访问

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可…...

智能写作利器ChatGPT:提升论文写作效率

ChatGPT无限次数:点击直达 智能写作利器ChatGPT&#xff1a;提升论文写作效率 在当今信息爆炸的时代&#xff0c;快速高效地撰写论文对于科研工作者来说至关重要。智能写作工具ChatGPT的出现为我们提供了强大的支持&#xff0c;它不仅能够提升论文写作的效率&#xff0c;还能够…...

【iOS ARKit】3D文字

首先&#xff0c;3D场景中渲染的任何虚拟元素都必须具有网格&#xff08;顶点及顶点间的拓扑关系&#xff09;&#xff0c;没有网格的元素无法利用GPU 进行渲染&#xff0c;因此&#xff0c;在3D 场景申渲染 3D文字时&#xff0c;文字也必须具有网格。在计算机系统中&#xff0…...

第二百二十八回

文章目录 1. 概念介绍2. 修改方法2.1 修改形状2.2 修改颜色2.3 修改位置 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何创建以图片为背景的页面"相关的内容&#xff0c;本章回中将介绍如何修改按钮的形状.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. …...

Java设计模式之单例模式(多种实现方式)

虽然写了很多年代码&#xff0c;但是说真的对设计模式不是很熟练&#xff0c;虽然平时也会用到一些&#xff0c;但是都没有深入研究过&#xff0c;所以趁现在有空练下手 这章主要讲单例模式&#xff0c;也是最简单的一种模式&#xff0c;但是因为spring中bean的广泛应用&#…...

Miracast投屏探索

Miracast是一种Wi-Fi Alliance推出的无线显示技术&#xff0c;允许在支持Miracast标准的设备之间进行屏幕镜像和内容共享。在Miracast技术中&#xff0c;通常会涉及到两种角色&#xff1a;Source&#xff08;发送端&#xff09;和Sink&#xff08;接收端&#xff09;。 Source&…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...