c++ 常见类内的关键字

1. override

override 是一个关键字,用于显式地标记派生类中重写(覆盖)基类虚函数的意图。
override 并不会影响程序的执行结果,仅仅是作用于编译阶段,用于检查子类是否真的重写父类函数

  • 作用
  1. 帮助发现错误:使用override关键字可以帮助开发者在编译时检测到派生类中虚函数重写的错误。如果派生类中的函数签名与基类的虚函数不匹配,编译器会报错,从而避免潜在的bug。
  2. 代码维护:在大型项目中,当基类的虚函数发生变化时,使用override关键字可以确保派生类中对应的函数得到正确的更新。如果派生类中的函数名与基类的虚函数不匹配,则编译器会产生错误,提醒开发者更新派生类的函数实现。
  • 代码展示
#include <iostream>// 基类 Animal
class Animal {
public:virtual void makeSound() {std::cout << "Animal makes a sound.\n";}
};// 派生类 Dog
class Dog : public Animal {
public:void makeSound() override {std::cout << "Dog barks.\n";}
};// 派生类 Cat
class Cat : public Animal {
public:void makeSound() override {std::cout << "Cat meows.\n";}
};int main() {// 创建 Animal 指针,并指向 Dog 对象Animal* animal = new Dog();animal->makeSound();  // 输出:Dog barks.// 将 Animal 指针指向 Cat 对象animal = new Cat();animal->makeSound();  // 输出:Cat meows.// 定义 Animal 指针数组,并存储 Dog 和 Cat 对象Animal* animals[] = {new Dog(), new Cat()};// 遍历指针数组,调用 makeSound() 函数for (int i = 0; i < 2; i++) {animals[i]->makeSound();}// 释放内存for (int i = 0; i < 2; i++) {delete animals[i];}return 0;
}

2. final

在C++中,final是一个关键字,用于限制类、成员函数或虚函数的进一步派生或重写。

  • 作用:
  1. 防止类被继承:通过在类声明中标记为final,可以显式地指示该类不可被继承。这在设计中可以用于限制类的层次结构或确保某个类的特定实现不被修改。
  2. 防止虚函数被重写:通过在虚函数声明中标记为final,可以阻止派生类对该虚函数进行重写。这在某些情况下可以用于确保基类的某个虚函数的实现不被修改或被误重写。
  • 代码展示:
#include <iostream>using namespace std;class father{
public:virtual void done() final {}};class son  final : public father{
public://void done() {}   报错 Declaration of 'done' overrides a 'final' function};// class grandson: public son{ }; 报错 Base 'son' is marked 'final' 'son' declared hereint main() {father * f = new son();f->done();return 0;
}

3. delete

在C++中,delete是一个类内关键字,用于显式 禁用 | 删除 特殊成员函数或运算符。它的作用是阻止编译器自动生成该函数或运算符。

  • 作用
  1. 防止函数的使用:通过将某个函数声明为 delete,可以防止该函数被意外调用,从而避免潜在的错误或不正确的使用。
  2. 禁用默认函数:通过将特殊成员函数(如拷贝构造函数和拷贝赋值运算符)声明为 delete,可以禁用类的默认实现,强制用户提供自定义的实现或禁用特定的行为。
  3. 禁止拷贝和赋值:通过将拷贝构造函数和拷贝赋值运算符声明为 delete,可以禁止对象的拷贝和赋值操作,以确保对象的唯一性或禁止不必要的资源管理。
  • 使用场景:
  1. 禁止拷贝和赋值:当某个类的对象不应该被拷贝或赋值时,可以将拷贝构造函数拷贝赋值运算符声明为 delete。这在单例模式具有独占资源的类中很常见。
class NonCopyable {
public:NonCopyable() = default;~NonCopyable() = default;// 禁用拷贝构造函数NonCopyable(const NonCopyable&) = delete;// 禁用拷贝赋值运算符NonCopyable& operator=(const NonCopyable&) = delete;
};int main() {NonCopyable obj1;NonCopyable obj2(obj1); // 错误!无法调用被删除的拷贝构造函数NonCopyable obj3;obj3 = obj1; // 错误!无法调用被删除的拷贝赋值运算符return 0;
}
  1. 禁用默认函数:当类的默认实现不符合需求时,可以将特殊成员函数(如拷贝构造函数和拷贝赋值运算符)声明为 delete,以禁用类的默认实现。这在禁止对象拷贝、禁止对象拷贝到容器等场景中很有用。
class NoDefaultConstructor {
public:// 禁用默认构造函数NoDefaultConstructor() = delete;// 自定义构造函数NoDefaultConstructor(int value) {// 构造函数实现}
};int main() {NoDefaultConstructor obj1; // 错误!无法调用被删除的默认构造函数NoDefaultConstructor obj2(42); // 正确,调用自定义构造函数return 0;
}

NoDefaultConstructor 类禁用了默认构造函数,通过将其声明为 delete。这意味着无法创建没有参数的对象,但可以通过自定义构造函数创建对象。

  1. 特定条件下的函数禁用:当某个函数在特定情况下不应该被调用时,可以将该函数声明为 delete。例如,当类的某个函数在特定的模板参数下无效时,可以将其声明为 delete。
#include <iostream>template <typename T>
class ConditionalFunction {
public:// 删除函数,当 T 是指针类型时禁用void Process(T value) {static_assert(!std::is_pointer_v<T>, "This function is disabled for pointer types.");// 函数实现}
};int main() {ConditionalFunction<int> obj1;obj1.Process(42); // 正确,T 不是指针类型ConditionalFunction<int*> obj2;
//    obj2.Process(nullptr); // 错误!无法调用被删除的函数return 0;
}

or :

#include <iostream>template <typename T>
class ConditionalFunction {
public:// 默认实现void Process(T value) {// 函数实现}
};// 针对指针类型的部分模板特化
template <typename T>
class ConditionalFunction<T*> {
public:// 禁用函数void Process(T* value) = delete;
};int main() {ConditionalFunction<int> obj1;obj1.Process(42); // 正确,T 不是指针类型ConditionalFunction<int*> obj2;// obj2.Process(nullptr); // 错误!无法调用被删除的函数return 0;
}

4. default

在C++中,default是一个关键字,用于指定默认的特殊成员函数的行为。它可以应用于以下特殊成员函数:默认构造函数析构函数拷贝构造函数拷贝赋值运算符

default的作用是告诉编译器使用默认的实现来生成相应的特殊成员函数。默认实现遵循特定规则,并且会执行合适的行为,比如调用基类或成员变量的对应函数。

  • 使用场景:

显式请求编译器生成默认函数:当用户自定义类中没有显式定义上述特殊成员函数时,编译器会自动生成默认版本的函数。但是,如果显式使用default关键字声明这些函数,可以明确表示希望使用编译器生成的默认实现。这在需要默认行为的情况下非常有用,可以减少代码量。

class MyClass {
public:// 默认构造函数的默认实现MyClass() = default;// 析构函数的默认实现~MyClass() = default;// 拷贝构造函数的默认实现MyClass(const MyClass&) = default;// 拷贝赋值运算符的默认实现MyClass& operator=(const MyClass&) = default;
};

5. explicit

adj. 明确的;坦率的;
n. (手稿、早期印刷品或礼拜仪式上唱诗的)结束语

在 C++ 中,explicit 关键字用于修饰单参数构造函数,用于禁止隐式类型转换。它的作用是防止编译器执行隐式的构造函数调用,只允许显式地调用构造函数。

  • 使用 explicit 关键字的场景包括

防止隐式类型转换:当类的构造函数只有一个参数时,如果没有使用 explicit 关键字修饰,那么编译器将允许隐式地将该参数类型转换为类的对象。但是,使用 explicit 关键字修饰后,只能使用显式的方式调用构造函数,防止了隐式类型转换。

#include <iostream>class Distance {
private:double meters;
public:explicit Distance(double m) : meters(m) {}double getMeters() const { return meters; }
};void printDistance(const Distance& d) {std::cout << d.getMeters() << " meters" << std::endl;
}int main() {//Distance dist = 10.5; // 错误!禁止隐式类型转换Distance dist(10.5);//printDistance(20.3); // 错误!禁止隐式类型转换printDistance(Distance(20.3));return 0;
}

6.

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

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

相关文章

基于Java的图书商城管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

Hive用户中文使用手册系列(一)

Apache Hive 在标题为“Information Platforms and the Rise of the Data Scientist”的文章一文中&#xff0c;Jeff Hammerbacher把“信息平台”描述为“企业摄取(ingest)、处理(process)、生成(generate)信息的行为”与“帮助加速从经验数据中学习”的“中心”。 在Facebook…

Linux之I2C应用编程

I2C-Tools的交叉编译 tar xvf i2c-tools-4.2.tar.xz 首先解压下压缩包 cd i2c-tools-4.2 进入 i2c-tools-4.2目录 make USE_STATIC_LIB1 执行 make 将i2cset ,i2cget ,i2cdump,i2cdetect,i2ctransfer放到板子上 命令直接操作IIC设备 命令行直接操作iic向AP3216C传感器获取数据…

即时通讯或者推送消息的守护进程?开启几个进程?

进程根据状态可以分为三种进程&#xff0c;守护进程&#xff0c;僵尸进程&#xff0c;孤儿进程。今天我们着重来分析下守护进程。 1.daemon? &#xff08;1&#xff09;概念 守护进程 (daemon) 是一类在后台运行的特殊进程&#xff0c;用于执行特定的系统任务。很多守护进程…

初出茅庐的小李博客之Windows11运行Linux记录

安装教程 超简单&#xff0c;不安装虚拟机&#xff0c;Windows11运行Linuxhttps://zhuanlan.zhihu.com/p/393484912 注意事项 出现错误有可能是少了驱动 驱动下载地址 https://link.zhihu.com/?targethttps%3A//wslstorestorage.blob.core.windows.net/wslblob/wsl_updat…

Django和jQuery,实现Ajax表格数据分页展示

1.需求描述 当存在重新请求接口才能返回数据的功能时&#xff0c;若页面的内容很长&#xff0c;每次点击一个功能&#xff0c;页面又回到了顶部&#xff0c;对于用户的体验感不太友好&#xff0c;我们希望当用户点击这类的功能时&#xff0c;能直接加载到数据&#xff0c;请求…

牛客网---活动运营刷题笔记

## 第一次 1.以下哪个活动玩法&#xff0c;不是为了给APP带来新增用户&#xff1f; A打折促销 B用户认证 C裂变活动 D有奖下载 正确答案&#xff1a;B 官方解析&#xff1a;本题主要考查活动拉新的方式 打折促销&#xff0c;即通过降低商品价格&#xff0c;促进商品销售&#…

安防视频监控系统EasyCVR视频汇聚存储平台定制化开发:新增kafka配置

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台可拓展性强、…

【算法训练-回溯算法 零】回溯算法解题框架

抽象地说&#xff0c;解决一个回溯问题&#xff0c;实际上就是遍历一棵决策树的过程&#xff0c;树的每个叶子节点存放着一个合法答案。你把整棵树遍历一遍&#xff0c;把叶子节点上的答案都收集起来&#xff0c;就能得到所有的合法答案。站在回溯树的一个节点上&#xff0c;你…

QT学习笔记-QT访问各种关系数据库笔记汇总

QT学习笔记-QT访问各种关系数据库笔记汇总 1、QT访问Oracle数据库2、QT访问SQLServer数据库3、QT访问MySQL数据库4、QT访问PostgreSQL数据库5、QT访问Access数据库6、QT多线程中访问数据库的要点 在使用QT进行应用开发过程中&#xff0c;不可避免的会涉及到访问关系数据库&…

协同过滤推荐算法UserCF、ItemCF

目录 相似度计算基于用户的协同过滤&#xff08;UserCF&#xff09;算法评估基于物品的协同过滤&#xff08;ItemCF&#xff09;协同过滤算法的权重改进协同过滤算法的问题分析思考学习参考 相似度计算 杰卡德&#xff08;Jaccard&#xff09;相似系数 Jaccard 系数是衡量两个…

js库——Day.js、Big.js

Day.js 方便操作对时间解析 验证 对时间进行计算等操作。 官方文档&#xff1a;https://dayjs.fenxianglu.cn npm i -S dayjs 1. 给定时间戳或者时间格式&#xff0c;获取格式化后的日期 dayjs(new Date()).format(YYYY-MM-DD HH:mm:ss) 2. 获取固定开始和固定结束的时间da…

在win10上安装配置Hadoop的环境变量

一、背景 在windows10系统中运行seatunnel 二、安装部署 2.1. 下载 Hadoop包 从 Apache Hadoop 官网下载最新版本的 Hadoop&#xff0c;版本号保持与服务端的Hadoop版本一致。 https://hadoop.apache.org/releases.htmlIndex of /apache/hadoop/core/hadoop-3.2.3/ 2.2. 解…

Qt文件对话框的使用

本文介绍Qt文件对话框的使用。 Qt编程中通常会遇到对文件的操作&#xff0c;比如打开&#xff0c;保存等&#xff0c;这些操作通常是通过文件对话框来进行操作的&#xff0c;文件对话框通常具有固定的样式&#xff0c;通过它可以获取到文件名&#xff0c;进而通过文件名打开文…

IntelliJ IDEA 2020.2.1白票安装使用方法

先安装好idear Plugins 内手动添加第三方插件仓库地址&#xff1a;https://plugins.zhile.io 搜索&#xff1a;IDE Eval Reset插件进行安装 输入https://plugins.zhile.io 手动安装离线插件方法 安装包可以去笔者的CSDN资源库下载 安装mybaties插件

【leetcode报错】 leetcode格式问题解决:error: stray ‘\302’ in program [solution.c]

leetcode格式问题解决 一、情景再现二、报错原因三、解决方法四、修正结果 一、情景再现 二、报错原因 该错误是指 源程序中有非法字符&#xff0c;需要将非法字符去掉。 一般是由于coder 1.使用中文输入法 或者 2.从别的地方直接复制粘贴代码 造成的。 代码中出现了 中文空格&…

How to add a jar to a project in eclipse?

Project -> Properties -> Java Build Path -> Libraries -> Add External JARs

AI绘画使用Stable Diffusion(SDXL)绘制玉雕风格的龙

一、引言 灵感来源于在逛 LibLib 时&#xff0c;看到的 Lib 原创者「熊叁gaikan」发布的「翠玉白菜 sdxl&#xff5c;玉雕风格」 的 Lora 模型。简直太好看了&#xff0c;一下子就被吸引了&#xff01; 科普下「翠玉白菜」&#xff1a; 翠玉白菜是由翠玉所琢碾出白菜形状的清…

R语言:主成分分析PCA

文章目录 主成分分析处理步骤数据集code 主成分分析 主成分分析&#xff08;或称主分量分析&#xff0c;principal component analysis&#xff09;由皮尔逊&#xff08;Pearson,1901&#xff09;首先引入&#xff0c;后来被霍特林&#xff08;Hotelling,1933&#xff09;发展…

HTML 常用标签及练习

常用标签 <head>中的标签 概述 head中的内容不显示到页面上 标签说明<title>定义网页的标题<meta>定义网页的基本信息&#xff08;供搜索引擎&#xff09;<style>定义CSS样式<link>链接外部CSS文件或脚本文件<script>定义脚本语言<…