C++ Learning explicit关键字•静态成员

news2024/12/22 9:58:01

explicit关键字

explicit 是 C++ 中的一个关键字,用于修饰构造函数或转换运算符,目的是防止编译器进行隐式类型转换。它主要用于防止构造函数或转换运算符在不明确的情况下被自动调用。

防止隐式类型转换

当没有 explicit 关键字时,C++ 编译器可以在某些情况下自动将一个类型转换为另一个类型,这就是所谓的隐式类型转换。比如:

class MyClass {
public:
    MyClass(int val) {
        // 构造函数
    }
};

void func(MyClass obj) {
    //...
}

int main() {
    func(10);  // 这里10会隐式地转换为MyClass(10)
    return 0;
}

在上面的代码中,func 函数期望一个 MyClass 类型的参数,编译器会自动使用 MyClass(int) 构造函数将 10 转换为 MyClass 对象。这种隐式转换有时会导致意外的行为,特别是当有多个重载构造函数时。

为了防止这种隐式类型转换,可以使用 explicit 关键字修饰构造函数:

class MyClass {
public:
    explicit MyClass(int val) {
        // 构造函数
    }
};

在这个例子中,MyClass(int) 被标记为 explicit,所以编译器不会允许隐式地将 int 转换为 MyClass 类型。如果你需要手动进行转换,可以显式调用构造函数:

func(MyClass(10));  // 显式调用构造函数

什么时候使用 explicit

  • 避免意外的隐式转换:一个单参数的构造函数,尤其是当它可以与其他类型的构造函数重载时,应该使用 explicit 以防止自动类型转换带来意外的行为。
  • 控制类型转换的时机:希望类型转换只在明确的情况下进行,而不是编译器自动推断时,就应该使用 explicit

静态成员

在 C++ 中,static 关键字用于定义静态成员变量和静态成员函数。static 成员具有一些独特的属性

静态成员变量

定义

  • 静态成员变量属于类,而不属于类的任何特定对象。这意味着静态成员变量对于所有对象是共享的,而不是每个对象都有自己的副本。
  • 静态成员变量必须在类外部进行定义,否则编译器会报错。

特性

  • 共享性:所有类的对象都共享静态成员变量。无论创建多少个对象,它们都访问同一个静态成员变量。
  • 生命周期:静态成员变量的生命周期与程序的生命周期相同,它在整个程序运行期间存在。
  • 内存分配:静态成员变量只会在程序启动时分配一次内存,不同对象之间共享这一块内存。

静态成员函数

定义

  • 静态成员函数是属于类本身的函数,而不是属于类的对象。静态成员函数只能访问类的静态成员变量和静态成员函数,因为它们与具体的对象无关。
  • 静态成员函数不能访问非静态成员变量和非静态成员函数,因为静态函数没有 this 指针。

特性

  • 不需要对象:静态成员函数可以直接通过类名调用,而不需要实例化对象。
  • 访问限制:静态成员函数只能访问静态成员变量或其他静态成员函数,无法访问普通的非静态成员。

静态数据成员的初始化

  • 静态数据成员在类内声明时可以指定默认值,但它必须在类外进行定义和初始化。
  • 静态成员变量的定义通常在类外进行,而不能仅仅在类内部声明。

静态成员变量的作用

  • 共享数据:静态成员变量对于所有的类对象是共享的。这使得它非常适合存储那些与类的所有实例共享的数据,如类的实例计数、全局配置等。
  • 对象间共享状态:静态成员变量可以用于在多个对象之间共享状态。例如,创建一个计数器来记录类的对象数。

总结

  • 静态成员变量是类的共享变量,在所有对象间共享,可以通过类名直接访问。
  • 静态成员函数只能访问静态成员,不能访问非静态成员。
  • 静态成员变量必须在类外定义。

一个例子

创建一个计数器来记录类的对象数

class MyClass
{
public:
	MyClass()
	{
		_count++;// 每次创建对象,_count++
	}
	static int GetCount()
	{
		return _count;
	}
private:
	static int _count;// 静态成员变量
};
int MyClass::_count = 0;// 静态成员变量初始化
int main() {
	MyClass m1, m2, m3;
	cout << MyClass::GetCount() << endl;
	return 0;
}

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

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

相关文章

令牌(token)+加密(加盐)

目录 一,令牌技术 1,不使用session的原因: 2,有两种解决方案: (1)服务器层面的 (2)客户端层面的(JWT令牌) 生成签名: 生成jwt令牌: 验证令牌是否合法: (3)令牌实际运用 二,加密加盐: 进行加密: 进行验证: 一,令牌技术 1,不使用session的原因: 登录页面,用户会将密…

Flask入门:打造简易投票系统

目录 准备工作 创建项目结构 编写HTML模板 编写Flask应用 代码解读 进一步优化 结语 Flask,这个轻量级的Python Web框架,因其简洁和易用性,成为很多开发者入门Web开发的首选。今天,我们就用Flask来做一个简单的投票系统,让你快速上手Web开发,同时理解Flask的核心概…

阿里巴巴前端面试经验

阿里巴巴面经&#xff08;新零售事业群-CBU技术部&#xff09; 笔试 /*** 1. 查找落单的数字* 描述&#xff1a;给定一个非空的数字数组&#xff0c;数组有且只有一个非重复项&#xff0c;实现一个方法获取落单项* 示例:* getSingleNumber([1, 2, 1, 2, 0]); // 0* getSingle…

指针的深入讲解

本章重点&#xff1a; 字符指针数组指针指针数组数组传参和指针传参函数指针函数指针数组指向函数指针数组的指针回调函数 我们在指针的初阶的时候主要讲了&#xff1a; 1.指针就是变量&#xff0c;用来存放地址&#xff0c;地址唯一标识一块内存空间 2.指针的大小是固定4个…

网络多层的协议详述

网络层 1&#xff09;地址管理&#xff1a;制定一系列的规则&#xff0c;通过地址&#xff0c;在网络上描述出一个设备的位置 2&#xff09;路由选择&#xff1a;网络环境比较复杂&#xff0c;从一个节点到另一个节点&#xff0c;存在很多条不同的路径&#xff0c;需要规划出…

Zabbix6.0升级为6.4

为了体验一些新的功能&#xff0c;比如 Webhook 和问题抑制等&#xff0c;升级个小版本。 一、环境信息 1. 版本要求 一定要事先查看官方文档&#xff0c;确认组件要求的版本&#xff0c;否则版本过高或者过低都会出现问题。 2. 升级前后信息 环境升级前升级后操作系统CentOS…

UML复习题

用例与用户的4种关系对象图和类图有什么关系:对象图是类图某一时刻的快照组件图&#xff0c;体现的是静态图部署图&#xff0c;涉及到硬件的结点&#xff0c;实线链接 以上都是静态图 时序图&#xff0c;消息先后协作图 &#xff0c;谁和谁交互&#xff0c;对象之间的交互某一…

【MFC】多工具栏如何保存状态

MFC中的工具栏本来只有一个&#xff0c;如果想增加几个工具栏是比较简单&#xff0c;但现在一个重要的问题是&#xff0c;状态无法保存&#xff0c;导致每次打开&#xff0c;工具栏就会出现问题&#xff0c;要么偏移位置要么显示不出。 经过研究&#xff0c;发现是MFC框架中的…

Buck开关电源闭环控制的仿真研究15V/5V[Matlab/simulink源码+Word文档]

课题设计要求 ⑴输入直流电压(VIN)&#xff1a;15V ⑵输出电压(VO)&#xff1a;5.0V ⑶负载电阻&#xff1a;R2欧 ⑷输出电压纹波峰-峰值 Vpp≤50mV &#xff0c;电感电流脉动&#xff1a;输出电流的10% ⑸开关频率(fs)&#xff1a;100kHz ⑹BUCK主电路二极管的通态压降VD0.5V…

鸿蒙项目云捐助第十八讲云捐助我的页面下半部分的实现

鸿蒙项目云捐助第十八讲云捐助我的页面下半部分的实现 在一般的应用app中都会有一个“我的”页面&#xff0c;在“我的”页面中可以完成某些设置&#xff0c;也可以完成某些附加功能&#xff0c;如“修改密码”等相关功能。这里的鸿蒙云捐助也有一个“我的”功能页面。这里对“…

Flink2.0未来趋势中需要注意的一些问题

手机打字&#xff0c;篇幅不长&#xff0c;主要讲一下FFA中关于Flink2.0的未来趋势&#xff0c;直接看重点。 Flink Forward Asia 2024主会场有一场关于Flink2.0的演讲&#xff0c;很精彩&#xff0c;官方也发布了一些关于Flink2.0的展望和要解决的问题。 1.0时代和2.0时代避免…

《深入浅出Apache Spark》系列⑤:Spark SQL的表达式优化

导读&#xff1a;随着数据量的快速增长&#xff0c;传统的数据处理方法难以满足对计算速度、资源利用率以及查询响应时间的要求。为了应对这些挑战&#xff0c;Spark SQL 引入了多种优化技术&#xff0c;以提高查询效率&#xff0c;降低计算开销。本文从表达式层面探讨了 Spark…

在Tomcat中部署应用时,如何通过域名访问而不加端口号

--江上往来人&#xff0c;但爱鲈鱼美。 --君看一叶舟&#xff0c;出没风波里。 在Tomcat中部署应用时&#xff0c;如果你希望通过域名访问而不加端口号&#xff08;默认HTTP端口80或HTTPS端口443&#xff09;&#xff0c;你通常需要在前端使用一个反向代理服务器&#xff08;如…

如何测量分辨率

一、什么是分辨率&#xff1f; 分辨率指的是分清物体细节的能力。分辨率是一个成像系统还原空间频率的能力。一些人只是简单的用分辨率去描述极限分辨率&#xff0c;但是相机在在不同的对比度的情况下还原低&#xff0c;中和高频率的能力&#xff0c;也可以显示全面综合的信息。…

Leetcode分隔链表

java 实现 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ class …

maui开发成生安卓apk,运行提示该应用与此设备的CPU不兼容

在生成.NET MAUI安卓应用时遇到“该应用与此设备的CPU不兼容”的问题&#xff0c;确保你的.NET MAUI应用支持的Android目标框架与设备CPU架构相匹配。例如&#xff0c;如果你的应用是为ARM64架构编译的&#xff0c;而你的设备是x86架构&#xff0c;就会出现不兼容的问题。 一、…

在 Unity 6 中使用APV为您的世界创建全局照明的新方法(一)

Unity 6 中推出的新照明功能让您能够更快速、更高效的完成对烘焙场景的照明工作&#xff0c;在本文中我们将与大家详细分享在 Unity 6 中应用自适应探针卷创建快速全局光照的更多细节与具体应用方法。由于内容比较丰富&#xff0c;我们将把内容分为三篇文章&#xff0c;以便大家…

深度学习之超分辨率算法——FRCNN

– 对之前SRCNN算法的改进 输出层采用转置卷积层放大尺寸&#xff0c;这样可以直接将低分辨率图片输入模型中&#xff0c;解决了输入尺度问题。改变特征维数&#xff0c;使用更小的卷积核和使用更多的映射层。卷积核更小&#xff0c;加入了更多的激活层。共享其中的映射层&…

VSCode 搭建Python编程环境 2024新版图文安装教程(Python环境搭建+VSCode安装+运行测试+背景图设置)

名人说&#xff1a;一点浩然气&#xff0c;千里快哉风。—— 苏轼《水调歌头》 创作者&#xff1a;Code_流苏(CSDN) 目录 一、Python环境安装二、VScode下载及安装三、VSCode配置Python环境四、运行测试五、背景图设置 很高兴你打开了这篇博客&#xff0c;更多详细的安装教程&…

使用Docker启用MySQL8.0.11

目录 一、Docker减小镜像大小的方式 1、基础镜像选择 2、减少镜像层数 3、清理无用文件和缓存 4、优化文件复制&#xff08;COPY和ADD指令&#xff09; 二、Docker镜像多阶段构建 1、什么是dockers镜像多阶段构建 1.1 概念介绍 1.2 构建过程和优势 2、怎样在Dockerfil…