C++经典面试题目(十一)

1. final和override关键字

在C++中,finaloverride 是两个用于类继承和成员函数重写的关键字,它们主要在面向对象编程的上下文中使用,以增强代码的可读性和安全性。

1. final 关键字

final 关键字主要有两种用法:

  1. 用于类:如果一个类被声明为 final,那么它不能被继承。这可以防止其他类从该类派生新的类。
class Base final {// ...
};class Derived : public Base { // 错误:Base 是 final,不能被继承// ...
};
  1. 用于虚函数:如果一个虚函数被声明为 final,那么它在任何派生类中都不能被重写(override)。这确保了该函数的行为在继承链中保持不变。
class Base {
public:virtual void func() final {// ...}
};class Derived : public Base {
public:void func() override { // 错误:func() 在 Base 中是 final,不能被重写// ...}
};

2. override 关键字

override 关键字用于明确表示一个成员函数是重写基类中的虚函数。如果基类中没有相应的虚函数,编译器会报错。这有助于捕获由于拼写错误或签名不匹配而导致的重写错误。

class Base {
public:virtual void func() {// ...}
};class Derived : public Base {
public:void func() override { // 正确:明确地重写 Base 中的 func()// ...}
};

使用 override 关键字的好处是,如果基类中的函数签名发生变化(例如,参数类型或返回类型更改),或者该函数不再是虚函数,编译器会立即报错,从而帮助开发者及时发现和修复问题。

总的来说,finaloverride 关键字增强了C++中面向对象编程的安全性和代码的可读性。它们使得开发者能够更清晰地表达他们的意图,并减少由于继承和多态性而引起的潜在错误。

2. 宏定义和函数有何区别?

在C++中,宏定义和函数都是用于代码复用的重要工具,但它们之间存在一些重要的区别。

  1. 定义方式

    • 宏定义:使用预处理器指令#define进行定义。宏定义是在预处理阶段由预处理器处理的,仅仅是文本替换,不占用任何存储空间。
    • 函数:使用函数声明和函数定义进行定义。函数定义在编译阶段处理,并在内存中占用存储空间。
  2. 执行方式

    • 宏定义:宏在预处理阶段进行简单的文本替换,没有类型检查,也没有计算过程。因此,如果宏定义中存在错误,可能在编译阶段甚至运行时才能发现。
    • 函数:函数在调用时执行,有严格的类型检查,且在执行过程中会有计算过程。如果函数中存在错误,通常会在编译阶段发现。
  3. 性能

    • 宏定义:宏定义通常比函数调用更快,因为它只是简单的文本替换,没有函数调用的开销。然而,如果宏定义中的代码很复杂,可能会导致代码膨胀,从而影响性能。
    • 函数:函数调用通常比宏定义慢一些,因为涉及到函数调用和返回的开销。但是,如果函数被频繁调用,编译器可能会进行优化,减少这种开销。
  4. 调试

    • 宏定义:由于宏只是文本替换,所以调试起来可能比较困难。当宏中的代码出现问题时,错误可能出现在多个地方,使得调试变得复杂。
    • 函数:函数有明确的入口和出口,可以更容易地设置断点进行调试。
  5. 参数处理

    • 宏定义:宏的参数在替换时不会进行类型检查或计算,只是简单地进行文本替换。因此,如果宏的参数使用不当,可能会导致不可预见的结果。
    • 函数:函数的参数在调用时进行类型检查和计算,确保参数的有效性。

总的来说,宏定义和函数各有其优点和缺点。在选择使用宏定义还是函数时,需要根据具体的应用场景和需求进行权衡。一般来说,如果代码逻辑复杂或需要类型检查,建议使用函数;如果代码简单且需要高效执行,可以考虑使用宏定义。

3. sizeof 和strlen 的区别

sizeofstrlen在C++中的主要区别体现在以下三个方面:

  1. 定义与性质
  • sizeof是C++中的一个运算符,用于获取特定类型或对象在内存中所占的字节大小。其值在编译时就已经确定,并且与运行时无关。
  • strlen是一个函数,用于计算字符串的长度,即返回字符串中字符的个数,不包括字符串末尾的空字符’\0’。它是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。
  1. 参数与适用对象
  • sizeof的参数非常灵活,可以是数组、指针、类型、对象、函数等。它不仅可以用于基本数据类型,还可以用于结构体、类、联合体等复合数据类型,甚至还可以对表达式求值,编译器会根据表达式的最终结果类型来确定大小。
  • strlen则只能用char*类型的参数,且该字符串必须是以’\0’结尾的。
  1. 功能
  • sizeof的主要功能是获取保证能容纳实现所建立的最大对象的字节大小。
  • strlen的主要功能是返回字符串的长度。

总的来说,sizeofstrlen在C++中有着不同的定义、性质、参数和功能。sizeof主要用于获取内存大小,而strlen则主要用于计算字符串的长度。根据具体的使用场景和需求,开发者可以选择合适的函数或运算符。

4. 简述strcpy、sprintf 与memcpy 的区别

strcpy、sprintf和memcpy这三个函数在C++中都有其特定的用途,它们之间的主要区别体现在以下几个方面:

  1. 复制的内容与操作对象

    • strcpy,即string copy(字符串复制)的缩写,专门用于复制字符串。它的两个操作对象都是字符串,它将含有’\0’结束符的源字符串复制到目标地址空间。
    • sprintf主要用于格式化字符串并输出到字符数组中。其操作源对象可以是多种数据类型,而目的操作对象是字符串。它类似于printf,但打印的目的地是字符串而不是命令行。
    • memcpy则用于复制任意内容,如字符数组、整型、结构体、类等。其两个操作对象是两个任意可操作的内存地址,并不限于何种数据类型。
  2. 复制的方法与长度控制

    • strcpy在复制字符串时不需要指定长度,它会一直复制到遇到源字符串的结束符’\0’为止。因此,如果目标地址空间不足以容纳源字符串,可能会导致缓冲区溢出。
    • sprintf根据格式化字符串和参数列表来生成并复制字符串,其长度由格式化字符串和参数共同决定。
    • memcpy则是根据第三个参数来决定复制的字节数,从而控制复制的长度。它逐个字节地从源地址复制到目标地址,直到达到指定的字节数。
  3. 用途与返回值

    • strcpy主要用于字符串的复制操作,其返回值的类型为char*,指向目标地址空间。
    • sprintf主要用于生成格式化字符串,其返回值是格式化后的字符串长度(不包括末尾的空字符)。如果发生错误,它可能会返回一个负数。
    • memcpy用于内存内容的复制,其返回值为指向目标地址的指针。

综上所述,这三个函数在复制的内容、操作对象、复制方法、长度控制以及用途等方面存在明显的区别。在实际编程中,应根据具体需求选择适当的函数。

5. 结构体可以直接赋值吗

在C++中,结构体(struct)本身并不直接支持整体赋值操作,就像基本数据类型(如intfloat等)那样。然而,可以通过一些方法间接地实现结构体的赋值。

1. 逐个成员赋值

你可以通过逐个成员变量进行赋值来实现结构体的复制。例如:

struct Point {int x;int y;
};int main() {Point p1 = {1, 2};Point p2;p2.x = p1.x;p2.y = p1.y;// 现在 p2 是 p1 的一个副本return 0;
}
2. 构造函数赋值

你可以为结构体定义一个构造函数,以便在创建结构体实例时直接初始化其成员。例如:

struct Point {int x;int y;Point(int a, int b) : x(a), y(b) {} // 构造函数
};int main() {Point p1(1, 2);Point p2 = Point(p1.x, p1.y); // 使用构造函数进行赋值// 或者直接使用另一个 Point 对象进行初始化Point p3 = p1; // 这会调用复制构造函数return 0;
}

在上面的例子中,Point 结构体有一个构造函数,它接受两个整数参数并初始化 xy 成员。在 main 函数中,我们使用这个构造函数来创建一个新的 Point 对象 p2,它的值是 p1 的一个副本。

3. 复制构造函数和赋值运算符重载

C++ 允许你重载结构体的复制构造函数和赋值运算符(operator=),以实现自定义的复制和赋值行为。这通常在你需要执行一些额外的操作(如内存管理、深拷贝等)时非常有用。例如:

struct Point {int x;int y;// 复制构造函数Point(const Point& other) : x(other.x), y(other.y) {}// 赋值运算符重载Point& operator=(const Point& other) {if (this != &other) { // 防止自赋值x = other.x;y = other.y;}return *this;}
};int main() {Point p1(1, 2);Point p2 = p1; // 使用复制构造函数Point p3;p3 = p1; // 使用赋值运算符重载return 0;
}

在这个例子中,我们重载了 Point 结构体的复制构造函数和赋值运算符。这样,当我们创建 p2 并赋值为 p1 时,或者将 p1 赋值给 p3 时,就会调用这些自定义的函数。

总结

虽然C++中的结构体本身不支持直接的整体赋值,但你可以通过逐个成员赋值、使用构造函数、复制构造函数或赋值运算符重载等方法来实现结构体的复制和赋值。选择哪种方法取决于你的具体需求和设计考虑。

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

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

相关文章

最小公约数 最大公倍数 同余原理

1.最小公约数 int gcd(int a,int b) {return b0 ? a : gcd(b,a%b); }int main() {int x,y;cin>>x>>y;cout<<gcd(x,y);return 0; } 每一次调用gcd传进去的两个值&#xff0c;若b为零则输出a&#xff0c;否则再次调用gcd&#xff0c;传入b&#xff0c;a%b 2.最…

Mysql数据备份与恢复实战

文章目录 备份类型备份内容备份工具mysqldump备份 实战案例&#xff1a;恢复误删除的表准备工作2:30完全备份完全备份后更新数据表10:00误删students表需要恢复还原的状态开始还原恢复 为什么要备份&#xff1f; 备份是为了&#xff1a;灾难恢复&#xff1a;硬件故障、软件故障…

磁盘空间打爆以后恢复 journal日志,及用户手册

Systemd日志管理服务&#xff1a;Journald以及重要配置选项 https://www.cnblogs.com/morgan363/p/13957565.html Linux 日志管理介绍 https://blog.csdn.net/m0_49864110/article/details/129175745 linux下的系统日志管理 https://blog.csdn.net/chitung_hsu/article/de…

Leetcode的正确打开方式

很多新手朋友在学习完数据结构与算法之后&#xff0c;都想找个平台磨练自己的技艺。那么LeetCode绝对是不二之选。但是官网刷题不是很友好&#xff0c;那么今天给大家介绍一款刷LeetCode神器。也是未来工作之后的摸鱼神器。 leetcode-editor 本打工人的摸&#xff08;nei&am…

10分钟带你用openlab搭建web网站

准备工作 虚拟机恢复快照 关闭防火墙、下载httpd&#xff0c;启动httpd服务、显示httpd服务是否开启 [rootserver ~]# systemctl stop firewalld [rootserver ~]# yum install httpd -y [rootserver ~]# systemctl start httpd [rootserver ~]# systemctl enable httpd [root…

【Java初阶(六)下】封装 继承 多态

❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; 目录 1.前言2.多态2.1多态的概念2.2多态实现条件2.3重写2.3.1避免在构造方法中调用重写的方法 2.4向上转型和向下转型2.4.1向上转型2.4.2向下转型 3.抽象类3…

常见的数学方法

Math类表示数学类&#xff0c;其中的数学方法都被定义成为static形式&#xff0c;所以可以直接通过Math类的类名调用某个数学方法。语法格式&#xff1a; Math.xxx(参数)&#xff1b; 例题 输入n个整数a1,a2,a3,......an,求这n个数的最大值max&#xff0c;最小值min&#xff0…

QProcess详解

QProcess 是 Qt 库中的一个核心类&#xff0c;用于在 Qt 应用程序中启动外部进程&#xff08;如操作系统命令、可执行文件或脚本&#xff09;&#xff0c;并与其进行交互。下面详细介绍 QProcess 的使用方法和主要功能&#xff1a; 基本使用 标题创建 QProcess 对象 QProces…

记录个人学习golang路线(如何学习golang,如何转golang)

最近好久没更&#xff0c;在看兔兔的博客&#xff0c;学习golang&#xff0c;兔兔的文章&#xff0c;有一定的编程经验 && 初学golang者&#xff0c;一定要看&#xff0c;如果是其他语言转golang&#xff0c;那就必须要看了&#xff0c;可以帮助你了解golang的语法&…

再见 mysql_upgrade

在数据库管理的世界里&#xff0c;随着技术的不断进步和业务的不断发展&#xff0c;数据库的版本升级成为了一个不可避免的过程。 MySQL 作为业界领先的开源关系型数据库管理系统&#xff0c;其版本迭代与功能优化同样不容忽视。 而在这个过程中&#xff0c;升级工具就显得尤为…

C# EventHander

EventHandler 是在编程中&#xff0c;特别是在面向对象的编程中&#xff0c;用于处理事件的一个特殊类型的委托&#xff08;delegate&#xff09;。事件是当某个特定动作或情况发生时&#xff0c;对象通知其他对象的一种方式。而 EventHandler 就是一个允许你定义当这个事件发生…

政安晨:【Keras机器学习实践要点】(五)—— 通过子类化创建新层和模型

目录 介绍 安装 层级&#xff1a;状态&#xff08;权重&#xff09;与某些计算的组合 层可以有不可训练的重量 最佳实践&#xff1a;推迟权重的创建&#xff0c;直到输入的形状已知。 层可以递归组合 后端不可知层和特定后端层 add_loss()方法 可以选择在您的层上启用…

C语言goto语句介绍

在C语言中&#xff0c;goto语句是一种流程控制语句&#xff0c;用于无条件地转移到程序中的特定标签位置。尽管goto语句在编程中具有一定的争议&#xff0c;但在某些情况下&#xff0c;它可以提供一种简单有效的解决方案。本文将深入介绍C语言中的goto语句&#xff0c;包括其基…

前端小白的学习之路(webpack)

提示&#xff1a;webpack简介&#xff0c;nvm,npm配置环境,常用命令&#xff0c;基本web项目构建 目录 webpack 1.配置环境 1)node.js node常用命令 2)nvm nvm常用命令&#xff1a; 3)npm npm常用命令 2.构建简易web项目 1)创建目录 2)安装webpack依赖 3)配置 webpac…

安全算法 - 摘要算法

摘要算法是一种将任意长度的数据转换为固定长度字节串的算法。它具有以下特点和应用。 首先&#xff0c;摘要算法能够生成一个唯一且固定长度的摘要值&#xff0c;用于验证数据的完整性和一致性。无论输入数据有多长&#xff0c;生成的摘要值始终是固定长度的&#xff0c;且即…

4核32G轻量云服务器优惠价格65元/月、951元一年

京东云4核32G轻量服务器优惠价格65元/月、195元3个月、476元6个月、951元一年&#xff0c;配置4C32G-100G SSD系统盘-8M带宽-1500G月流量 华北-北京&#xff0c;京东云优惠活动 yunfuwuqiba.com/go/jd 活动链接打开如下图&#xff1a; 京东云4核32G轻量服务器优惠价格 京东云&a…

Vue基础配置、组件通信

基础配置 Vue框架已经集成了webpack配置 小注意点 vbase 快速生成vue模板 组件名必须是多词格式(驼峰模式) 具体三种写法: ①小驼峰:abcDef.vue ②大驼峰&#xff1a;AbcDef.vue ③中横线&#xff1a;abc-def.vue 假如文件名不符合多次格式的补救办法&#xff1a; 导出重命名…

写作类AI推荐(二)

本章要介绍的写作AI如下&#xff1a; 火山写作 主要功能&#xff1a; AI智能创作&#xff1a;告诉 AI 你想写什么&#xff0c;立即生成你理想中的文章AI智能改写&#xff1a;选中段落句子&#xff0c;可提升表达、修改语气、扩写、总结、缩写等文章内容优化&#xff1a;根据全文…

【Vue】手写Vue工具函数hasChanged源码

function hasChanged(x,y) {}hasChanged函数接受两个参数&#xff0c;判断参数是否发生变化&#xff0c;即两个参数是否完全相同&#xff0c;发生了改变返回true&#xff0c;否则返回flase。 对象类型数据先比较值&#xff0c;相同则比较址&#xff0c;址不同也返回true。 首先…

Java零基础-集合:函数式接口

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…