C++八股(一)

一、newmalloc ⭐

  • new是C++的关键字,用于动态分配内存并创建对象。它可以根据类型自动计算所需内存空间,并调用对象的构造函数进行初始化。在使用new分配内存后,需要使用delete来释放这些内存空间,以防止内存泄漏。
  • malloc是C语言的库函数,用于动态分配一块指定大小的内存块,并返回其地址。需要注意的是,使用malloc分配内存后,需要使用free来释放这些内存空间,以防止内存泄漏。

C++
#include <iostream>
#include <cstdlib>

int main() {
    //
使用new进行动态内存分配和释放
    int* newPtr = new int(10);
    std::cout << "Value allocated with new: " << *newPtr << std::endl;
    delete newPtr;

    // 使用malloc进行内存分配和释放
    int* mallocPtr = (int*)malloc(sizeof(int));
    if (mallocPtr != nullptr) {
        *mallocPtr = 20;
        std::cout << "Value allocated with malloc: " << *mallocPtr << std::endl;
        free(mallocPtr);
    }

    return 0;
}

二、classstruct的区别

C++
struct StructExample {
    int publicMember; //
默认public,可以直接访问
};

class ClassExample {
    int privateMember; // 默认private,不能直接访问

public:
    // 公共接口,允许外部访问privateMember
    int getPrivateMember() const {
        return privateMember;
    }

    void setPrivateMember(int value) {
        privateMember = value;
    }
};

int main() {
    StructExample se;
    se.publicMember = 10; // 直接访问

    ClassExample ce;
    ce.setPrivateMember(20); // 通过公共成员函数设置私有成员
    int value = ce.getPrivateMember(); // 通过公共成员函数获取私有成员
}

三、charint之间的转换

C++
char c = 'A';
int i = c;  //
将字符'A'的ASCII码值赋给i

int i = 65;
char c = static_cast<char>(i);  // 将整数65转换为对应的字符'A'

需要注意的是,对于转换为charint值,如果超出了char类型的范围(-128127),将会发生溢出,只保留最低位字节的值。

四、什么是野指针和悬挂指针

  • 野指针(Dangling Pointer):指的是没有初始化过的指针,它指向的地址是未知的、不确定的、随机的。

产生野指针的原因主要是指针未初始化,防止的措施就是指针初始化(包括及时初始化或置空)。

C++
int main() {
    int* ptr; //
未初始化的指针,成为野指针

    // 使用野指针会导致未定义的行为
    *ptr = 5; // 解引用野指针,可能导致程序崩溃

    return 0;
}

  • 悬挂指针(Dangling Reference):指针最初指向的内存已经被释放了的一种指针。指针指向的内存已释放,但指针的值没有被清零,对悬空指针操作的结果不可预知。

C++
int* createInt() {
    int value = 5;
    int* ptr = &value;
    return ptr; //
返回指向局部变量的指针
}

int main() {
    int* danglingPtr = createInt(); // 指向已释放的内存

    // 对悬挂指针操作的结果不可预知
    int value = *danglingPtr; // 解引用悬挂指针,可能导致未定义的行为

    return 0;
}

局部变量 value 会在 createInt 函数执行完毕后,离开其作用域时被销毁。此时,value 占用的内存将不再被 value 所拥有,但是通过 ptr 返回的指针依然指向这块内存。由于这块内存已经被释放,再通过 ptr 访问它将会导致未定义行为(Undefined Behavior),可能引起程序崩溃或其他不可预知的错误。

重要的是要理解,局部变量 value 的生命周期仅限于 createInt 函数的作用域内。一旦函数返回,value 的生命周期结束,它所占用的内存可以被系统回收或重新分配给其他变量。

在C++中,正确处理这类情况的一种方法是使用动态内存分配,例如使用 new 关键字分配内存,并在适当的时候使用 delete 来释放内存:

C++
int* createInt() {
    int* ptr = new int(5); //
使用new分配内存,并初始化为5
    return ptr; // 返回指向这块内存的指针
}

// 使用完毕后,需要使用delete释放内存
int* ptr = createInt();
// ... 使用ptr ...
delete ptr; // 释放ptr指向的内存
ptr = nullptr; // 将ptr设置为nullptr,避免悬挂指针问题

五、NULLnullptr区别

  • 在C++11之前,NULL 是一个宏,通常被定义为 0 或 (void*)0。在C++11及以后,NULL 被定义为 nullptr。
  • nullptr 是C++11引入的一个更现代、更安全的方式来表示空指针。尽管 NULL 在旧代码中仍然广泛使用,但在新的C++代码中,推荐使用 nullptr

六、指针常量和常量指针有何区别

  • 指针常量:指针本身的值不可改变(即不能让它指向另一个地址),但可以改变它所指向的数据(除非数据本身是常量)。指针地址不可变,值可变注:指针常量在定义时要赋初值。

C++
int a = 0,b = 0;
int* const p = &a;
*p = 1; //正确,可以修改值
*p = &b; //错误,不可改变地址

  • 常量指针:指针可以改变指向的地址,但它所指向的数据是不可修改的(即数据是常量)。

指针地址可以变,值不能变

C++
int a = 0,b = 0;
const int *p = &a;
*p = 1; //错误,不可修改常量值
*p = &b; //正确,可以指向另一个常量

区分记忆:比较const*谁离ptr更近,如果const更近则表示指针本身是常量,是指针常量;如果*ptr更近则表示指向的值value不能更改,是常量指针;否则是指向常量的指针常量(const int * const p = &a

七、物理内存和虚拟内存的区别

  • 本质:物理内存是实际存在的硬件资源,而虚拟内存是操作系统提供的一种抽象和扩展。
  • 大小:物理内存的大小受限于硬件,虚拟内存的大小受限于物理内存和磁盘空间。
  • 访问速度:物理内存的访问速度通常远快于虚拟内存,因为硬盘的读写速度远低于RAM。
  • 目的:物理内存用于存储当前活跃的程序和数据,虚拟内存用于扩展可用的内存空间,允许更多的程序并发运行或处理更大的数据集。
  • 管理:物理内存由硬件直接管理,而虚拟内存由操作系统通过复杂的内存管理算法进行管理。

虚拟内存的使用可以提高系统的多任务处理能力,但过度依赖虚拟内存可能导致性能下降,因为频繁的页面交换(也称为页面抖动抖动)会增加对硬盘的访问,从而降低程序的响应速度。

八、重载、重写和隐藏的区别

1、重载(Overloading

  • 重载是在同一个作用域内定义多个相同名称但参数列表不同的函数或方法。
  • 重载提供相同功能但接受不同参数的函数版本。

C++
#include <iostream>

void printNumber(int num) {
    std::cout << "Integer number: " << num << std::endl;
}

void printNumber(double num) {
    std::cout << "Floating-point number: " << num << std::endl;
}

int main() {
    printNumber(10);
    printNumber(3.14);
    return 0;
}

2、重写(override

  • 重写是指子类重新定义从父类继承的虚函数,使其具有不同的实现。
  • 重写的函数签名(函数名、参数列表和返回类型)必须与被重写函数相同。

C++
#include <iostream>

class Base {
public:
    virtual void sayHello() {
        std::cout << "Hello from Base class!" << std::endl;
    }
};

class Derived : public Base {
public:
    void sayHello() override {  //
使用 override 关键字表明重写了父类的函数
        std::cout << "Hello from Derived class!" << std::endl;
    }
};

int main() {
    Base* basePtr = new Derived();
    basePtr->sayHello();  // Output: "Hello from Derived class!"
    delete basePtr;
    return 0;
}

3、隐藏(Hiding

  • 隐藏发生在派生类中,当派生类中的一个成员(可以是函数或变量)与基类中的成员名称相同,但又不是重写(即函数签名不匹配)时,就会发生隐藏。
  • 隐藏的成员可以通过基类类型的引用或指针来访问,或者在派生类中使用 using 声明来解决名称冲突。

C++
#include <iostream>

class Base {
public:
    void sayHello() {
        std::cout << "Hello from Base class!" << std::endl;
    }
};

class Derived : public Base {
public:
    void sayHello() {
        std::cout << "Hello from Derived class!" << std::endl;
    }
};

int main() {
    Base baseObj;
    Derived derivedObj;
   
    baseObj.sayHello();    // Output: "Hello from Base class!"
    derivedObj.sayHello(); // Output: "Hello from Derived class!"
   
    Base* basePtr = new Derived();
    basePtr->sayHello();   // Output: "Hello from Base class!"
   
    delete basePtr;
    return 0;
}

4、总结

重载和重写是多态性的重要体现,而隐藏更多是名称冲突的一种情况。正确理解这些概念有助于更好地设计和实现面向对象的程序。

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

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

相关文章

南方CASS:测绘工作者的得力助手

初识南方CASS 南方CASS&#xff0c;这款软件在我的工作和生活中扮演了不可或缺的角色。作为一名长期的使用者&#xff0c;我深感它的功能之强大与便捷。今天&#xff0c;我愿以季羡林先生的口吻&#xff0c;带大家走进南方CASS的世界&#xff0c;分享我与它的点滴故事。 功能…

不同编程环境中GPU调用代码

在编程中&#xff0c;调用 集成显卡&#xff08;集显&#xff09; 和 独立显卡&#xff08;独显&#xff09; 通常涉及设置GPU设备和执行计算任务。以下是一些示例代码&#xff0c;展示了如何在不同编程环境中使用 集显 和 独显 。 文章目录 1. 使用CUDA和PyTorch调用GPU检查可…

天线介绍简略

天线在无线通信中是必不可少的组件&#xff0c;作为基础部分为无线通信所需&#xff0c;天线的形式从方向上有全向和定向&#xff0c;从实现上有微带、对称振子、阵列天线等&#xff0c;极化上有垂直极化、水平极化、圆极化等&#xff0c;天线的指标有增益、驻波、带宽等&#…

股票软件中的L2行情是什么意思?什么是level2行情以及如何获取level2行情

行情接入方法 level2行情websocket接入方法-CSDN博客 level2行情是什么意思&#xff1f; L2行情&#xff0c;即Level 2行情&#xff0c;是股票市场中一个不可或缺的高级术语&#xff0c;它代表着比基础Level 1行情更为详尽的市场洞察力。Level 2行情解锁了市场深度的新维度&…

大模型推理:vllm多机多卡分布式本地部署

文章目录 1、vLLM分布式部署docker镜像构建通信环境配置 2、其他大模型部署工具3、问题记录参考文献 单台机器GPU资源不足以执行推理任务时&#xff0c;一个方法是模型蒸馏量化&#xff0c;结果就是会牺牲些效果。另一种方式是采用多台机器多个GPU进行推理&#xff0c;资源不足…

前端跨域问题解决方案

跨域产生的原因是由于浏览器的同源策略&#xff0c;即当页面的源和页面运行过程中加载的源不一致时&#xff0c;浏览器会出于安全考虑对跨域的资源访问进行限制。这种限制特别是对​ajax的影响最为明显&#xff0c;默认情况下&#xff0c;它不允许ajax访问跨域资源。 跨域问题…

深入解析【C++ list 容器】:高效数据管理的秘密武器

目录 1. list 的介绍及使用 1.1 list 的介绍 知识点&#xff1a; 小李的理解&#xff1a; 1.2 list 的使用 1.2.1 list 的构造 知识点&#xff1a; 小李的理解&#xff1a; 代码示例&#xff1a; 1.2.2 list 迭代器的使用 知识点&#xff1a; 小李的理解&#xff1…

基于STM32的气压检测报警proteus仿真设计(仿真+程序+设计报告+讲解视频)

基于STM32的气压检测报警proteus仿真设计 1.主要功能2.仿真3. 程序4. 设计报告5. 资料清单&下载链接资料下载链接&#xff1a; 基于STM32的气压检测报警proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言…

cadence许可管理策略

在数字化时代&#xff0c;软件已成为企业运营的核心要素。随着软件种类的不断增加和业务需求的不断变化&#xff0c;cadence许可管理面临着诸多挑战。为了确保软件合规性和优化资源利用&#xff0c;制定一套合理有效的cadence许可管理策略至关重要。本文将为您揭示cadence许可管…

【Linux】多线程_1

文章目录 九、多线程1. 线程概念2. 线程的控制 未完待续 九、多线程 1. 线程概念 我们知道&#xff1a;进程 内核数据结构 进程代码和数据 。那什么是线程呢&#xff1f;线程是进程内部的一个执行分支。一个进程内部可以有多个执行流&#xff08;内核数据结构&#xff09;&…

如何用Vue3和Plotly.js创建交互式平行坐标图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Vue.js 中使用 Plotly.js 创建平行坐标图 应用场景介绍 平行坐标图是一种可视化高维数据集的强大技术。它可以帮助我们探索不同维度之间的关系&#xff0c;并识别模式和异常值。在 Vue.js 应用程序中&#xf…

ORB-SLAM2的优缺点

ORB-SLAM2作为一种基于单目、双目和RGB-D相机的实时视觉SLAM系统&#xff0c;具有显著的优点和一定的局限性。以下是对其优缺点的详细介绍&#xff1a; 优点 1.高精度与实时性&#xff1a;ORB-SLAM2采用了ORB特征点提取和描述符匹配技术&#xff0c;这些技术在保证高效率的同时…

调度的艺术:Eureka在分布式任务调度中的妙用

调度的艺术&#xff1a;Eureka在分布式任务调度中的妙用 引言 在微服务架构中&#xff0c;任务调度是确保服务高效运行的关键机制。Eureka作为Netflix开源的服务发现框架&#xff0c;提供了服务注册与发现的功能&#xff0c;可以与分布式任务调度方案相结合&#xff0c;实现服…

python的列表推导式

文章目录 前言一、解释列表推导式二、在这句代码中的应用三、示例四、使用 for 循环的等价代码总结 前言 看看这一行代码&#xff1a;questions [q.strip() for q in examples["question"]] &#xff0c;问题是最外层的 中括号是做什么的&#xff1f; 最外层的中括…

telnet在windows和linux上的使用方法

telnet在windows上使用 ‘telnet’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 windows上有自带的telnet工具的&#xff0c;这只是没有安装添加进来而已。 处理 方法&#xff1a; 打开控制面板-点击程序与功能 进到程序与功能界面&#xff0c;点击启用或…

linux之core文件如何查看和调试

让我们通过一个具体的例子来演示如何使用GDB调试器来分析一个简单的C程序产生的core文件。 首先&#xff0c;假设我们有一个简单的C程序&#xff0c;example.c&#xff0c;如下所示&#xff1a; #include <stdio.h> void function_b() { char *ptr NULL; *ptr 0; //…

S32V234平台开发(一)快速使用

快速使用 准备供电复位选择串口通信启动选择显示登陆系统 准备供电 s32v234可以使用两种电源供电 一种是左边电源端子&#xff0c;一种是右边电源适配器(12V 3A) 注意:不要同时使用两种电源同时供电 复位选择 Pressing POR RESET pulls active low EXT_POR signal on S32V2…

deepstream段错误

&#x1f610; 错误&#xff1a; 探针中由于使用了pyds.get_nvds_buf_surface(hash(gst_buffer), frame_meta.batch_id)导致的段错误&#xff08;segmentation fault&#xff09;。 解决方式&#xff1a;

关于美国服务器IP的几个常见问题

在租用美国服务器时&#xff0c;与之密切相关的一个要素就是IP&#xff0c;关于IP的问题总是有人问起&#xff0c;这里列举几项常见的问题&#xff0c;以供参考。 一、IP收费吗&#xff1f; 一般情况下&#xff0c;在租用服务器时&#xff0c;会赠送几个IP&#xff0c;因为这些…

职场中的3个误区,你踩坑了吗?

1、个人发展比工资待遇更重要 这句话也不能说是完全错的&#xff0c;但是你要明白能给你提供发展空间的公司&#xff0c;待遇也不会差到哪里去&#xff0c;而且随着你个人能力的提升&#xff0c;发展也会越来越好&#xff0c;你的待遇也自然水涨船高&#xff0c;这个道理其实大…