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

C++11QT复习 (六)

类型转换函数和类域

    • **Day6-3 类型转换函数和类域**
      • **1. 类型转换函数(Type Conversion Functions)**
        • **1.1 概述**
        • **1.2 代码示例**
        • **1.3 关键优化**
      • **2. 类域(Class Scope)**
        • **2.1 作用域 vs 可见域**
        • **2.2 代码示例**
        • **2.3 关键优化**
      • **3. 内部类(Nested Class)**
        • **3.1 内部类的定义**
        • **3.2 访问外部类的 `private` 成员**
        • **3.3 静态内部类**
      • **4. 作用域运算符(Scope Resolution Operator `::`)**
        • **4.1 访问全局变量**
        • **4.2 访问命名空间内的变量**
        • **4.3 访问类的静态成员**
      • **5. 类型转换运算符(Type Casting Operators)**
        • **5.1 `static_cast` 用法**
        • **5.2 `dynamic_cast` 用法**
        • **5.3 `const_cast` 用法**
        • **5.4 `reinterpret_cast` 用法**
      • **6. 关键字 `explicit` 与类型转换**
        • **6.1 隐式转换**
        • **6.2 使用 `explicit` 禁止隐式转换**
      • **7. 总结**

Day6-3 类型转换函数和类域

1. 类型转换函数(Type Conversion Functions)

1.1 概述

类型转换函数用于将类的对象转换为其他类型,满足以下特点:

  • 类的成员函数,不能是友元函数或非成员函数。
  • 没有参数列表(即必须是 () 空参数)。
  • 没有返回类型声明,即不能显式声明 void 或其他返回类型。
  • 使用 return 语句返回目标类型的变量
1.2 代码示例
#include <iostream>using namespace std;class Complex
{friend std::ostream& operator<<(std::ostream& os, const Complex& rhs);public:Complex(int real = 0, int imag = 0)  : _real(real), _imag(imag){cout << "Complex(int, int) 构造函数" << endl;}~Complex(){cout << "~Complex 析构函数" << endl;}void display() const{cout << _real << " + " << _imag << "i" << endl;}int getReal() const { return _real; }int getImag() const { return _imag; }private:int _real;int _imag;
};// 重载输出运算符,使 Complex 可以被 cout 直接输出
std::ostream& operator<<(std::ostream& os, const Complex& rhs)
{os << rhs._real << " + " << rhs._imag << "i";return os;
}class Point
{friend std::ostream& operator<<(std::ostream& os, const Point& rhs);public:Point(int x = 0, int y = 0) : _x(x), _y(y){cout << "Point(int, int) 构造函数" << endl;}// **类型转换函数**operator int() const{cout << "operator int()" << endl;return _x + _y;}operator double() const{cout << "operator double()" << endl;return _y == 0 ? 0.0 : static_cast<double>(_x) / _y;}operator Complex() const{cout << "operator Complex()" << endl;return Complex(_x, _y);}~Point(){cout << "~Point 析构函数" << endl;}// **类型转换构造函数**explicit Point(const Complex& rhs): _x(rhs.getReal()), _y(rhs.getImag()){cout << "Point(const Complex&) 类型转换构造函数" << endl;}void print() const{cout << "(" << _x << ", " << _y << ")" << endl;}private:int _x;int _y;
};// 重载输出运算符,使 Point 可以被 cout 直接输出
std::ostream& operator<<(std::ostream& os, const Point& rhs)
{os << "(" << rhs._x << ", " << rhs._y << ")";return os;
}void testTypeConversion()
{Point pt(3, 4);cout << "Point pt: " << pt << endl;int intValue = pt;  cout << "转换为 int: " << intValue << endl;double doubleValue = pt;cout << "转换为 double: " << doubleValue << endl;Complex comValue = pt;cout << "转换为 Complex: " << comValue << endl;
}int main()
{testTypeConversion();return 0;
}
1.3 关键优化

类型转换构造函数增加 explicit,防止隐式转换导致潜在错误。
类型转换函数添加 const,保证 Point 的成员变量不会被修改。
operator double() 处理 _y == 0 情况,避免除零异常。
优化 Complex 相关代码,消除 friend 冗余,提高可读性。


2. 类域(Class Scope)

2.1 作用域 vs 可见域
  • 作用域(Scope):指变量在代码中的可访问范围,影响变量的解析方式。
  • 可见域(Visibility):变量是否在当前上下文可见,受 privateprotectedpublic 修饰符影响。
  • 作用域 ≥ 可见域,如果没有命名冲突,二者相等。

2.2 代码示例
#include <iostream>using namespace std;int globalNumber = 50;  // **全局作用域变量**namespace ceshi
{int namespaceNumber = 20;  // **命名空间作用域**class Test{public:Test(int value = 100) : number(value) {}void print(int number){cout << "局部变量 number: " << number << endl;cout << "成员变量 number: " << this->number << endl;cout << "类作用域 number: " << Test::number << endl;cout << "命名空间 ceshi::number: " << ceshi::namespaceNumber << endl;cout << "全局变量 globalNumber: " << ::globalNumber << endl;}private:int number;  // **类成员变量**};
} // namespace ceshivoid testScope()
{int localValue = 3000;ceshi::Test obj;obj.print(localValue);
}int main()
{testScope();return 0;
}
2.3 关键优化

清晰划分不同作用域:全局作用域 ::、命名空间 ceshi::、类作用域 this->Test::
增强 print() 方法输出格式,更直观理解变量的作用域。
消除不必要的析构函数,提升代码简洁性。
代码格式调整,增强可读性。


3. 内部类(Nested Class)

内部类(Nested Class)是指在一个类的定义内部再定义一个类。内部类在逻辑上属于外部类的一部分,但具有自己的作用域。

3.1 内部类的定义
#include <iostream>
using namespace std;class Outer {
public:class Inner { // 内部类public:void display() {cout << "This is Inner class" << endl;}};
};void test() {Outer::Inner obj; // 创建内部类对象obj.display();
}int main() {test();return 0;
}

特点:

  1. 内部类的作用域受外部类的限制。
  2. 内部类的对象可以通过 外部类::内部类 的方式创建。
  3. 内部类可以访问外部类的 publicprotected 成员,但不能直接访问 private 成员(除非使用 friend 关键字)。
3.2 访问外部类的 private 成员

如果内部类需要访问外部类的 private 成员,可以将其声明为 friend

class Outer {
private:int _data = 10;public:class Inner {public:void display(Outer& obj) {cout << "Outer data: " << obj._data << endl;}};
};void test2() {Outer outerObj;Outer::Inner innerObj;innerObj.display(outerObj);
}
3.3 静态内部类

静态内部类不能访问外部类的非静态成员。

class Outer {
public:static class StaticInner {public:void show() {cout << "This is a static inner class" << endl;}};
};void test3() {Outer::StaticInner obj;obj.show();
}

4. 作用域运算符(Scope Resolution Operator ::

作用域运算符 :: 用于指定变量、函数或类所属的作用域,主要应用如下:

4.1 访问全局变量
#include <iostream>
using namespace std;int number = 100;void test() {int number = 50;cout << "Local number: " << number << endl;cout << "Global number: " << ::number << endl;
}
4.2 访问命名空间内的变量
namespace A {int value = 10;
}namespace B {int value = 20;
}void test2() {cout << "A::value = " << A::value << endl;cout << "B::value = " << B::value << endl;
}
4.3 访问类的静态成员
class Demo {
public:static int data;
};int Demo::data = 50;void test3() {cout << "Static data: " << Demo::data << endl;
}

5. 类型转换运算符(Type Casting Operators)

C++ 提供了四种类型转换运算符:

  1. static_cast:用于基本类型之间的转换。
  2. dynamic_cast:用于多态类型的安全转换。
  3. const_cast:用于去除 constvolatile 修饰符。
  4. reinterpret_cast:用于不同类型指针之间的转换。
5.1 static_cast 用法
void test_static_cast() {double num = 10.5;int intNum = static_cast<int>(num);cout << "Converted value: " << intNum << endl;
}
5.2 dynamic_cast 用法
class Base {
public:virtual void show() {}
};class Derived : public Base {
public:void show() {cout << "Derived class" << endl;}
};void test_dynamic_cast() {Base* basePtr = new Derived();Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);if (derivedPtr) {derivedPtr->show();}delete basePtr;
}
5.3 const_cast 用法
void test_const_cast() {const int num = 42;int* ptr = const_cast<int*>(&num);*ptr = 10;cout << "Modified value: " << *ptr << endl;
}
5.4 reinterpret_cast 用法
void test_reinterpret_cast() {int num = 65;char* ch = reinterpret_cast<char*>(&num);cout << "Reinterpreted value: " << *ch << endl;
}

6. 关键字 explicit 与类型转换

默认情况下,C++ 允许构造函数进行隐式类型转换,但 explicit 关键字可以禁止这种行为。

6.1 隐式转换
class Demo {
public:Demo(int x) { cout << "Demo(int)" << endl; }
};void test_implicit_conversion() {Demo obj = 10; // 隐式调用 Demo(int)
}
6.2 使用 explicit 禁止隐式转换
class Demo {
public:explicit Demo(int x) { cout << "Demo(int)" << endl; }
};void test_explicit() {// Demo obj = 10; // 错误!隐式转换被禁止Demo obj(10);    // 正确
}

7. 总结

  1. 内部类 是定义在另一个类内部的类,具有自己的作用域,并且可以是 static
  2. 作用域运算符 :: 用于访问不同作用域的变量或函数。
  3. 类型转换运算符 提供更安全、可控的转换方式。
  4. explicit 关键字 可以防止构造函数的隐式转换。

相关文章:

C++11QT复习 (六)

类型转换函数和类域 **Day6-3 类型转换函数和类域****1. 类型转换函数&#xff08;Type Conversion Functions&#xff09;****1.1 概述****1.2 代码示例****1.3 关键优化** **2. 类域&#xff08;Class Scope&#xff09;****2.1 作用域 vs 可见域****2.2 代码示例****2.3 关键…...

区块链技术在投票系统中的应用:安全、透明与去中心化

区块链技术在投票系统中的应用:安全、透明与去中心化 【引言】 近年来,电子投票系统因其便捷性受到广泛关注,但随之而来的安全问题也屡见不鲜,如选票篡改、重复投票、数据泄露等。如何确保投票的公平性、透明度和安全性? 区块链技术或许是解决方案之一! 区块链的 去中…...

CTF类题目复现总结-[MRCTF2020]ezmisc 1

一、题目地址 https://buuoj.cn/challenges#[MRCTF2020]ezmisc二、复现步骤 1、下载附件&#xff0c;得到一张图片&#xff1b; 2、利用010 Editor打开图片&#xff0c;提示CRC值校验错误&#xff0c;flag.png应该是宽和高被修改了&#xff0c;导致flag被隐藏掉&#xff1b;…...

MetInfo6.0.0目录遍历漏洞原理分析

所需进行代码审计的文件路径&#xff1a; C:\phpStudy\WWW\MetInfo6.0.0\include\thumb.php C:\phpStudy\WWW\MetInfo6.0.0\app\system\entrance.php C:\phpStudy\WWW\MetInfo6.0.0\app\system\include\class\load.class.php C:\phpStudy\WWW\MetInfo6.0.0\app\system\include…...

linux打包前端vue,后端springboot项目

第一步先对整个项目进行通过maven进行clean在进行compile 第二步直接进行打包package和install都可以 第三部把对应的jar放到服务器上 把jar包放到服务器上某个地址下&#xff0c;然后cd到这个目录下&#xff0c;然后执行命令 nohup java -jar ruoyi-admin.jar > springbo…...

Elasticsearch:使用 AI SDK 和 Elastic 构建 AI 代理

作者&#xff1a;来自 Elastic Carly Richmond 你是否经常听到 AI 代理&#xff08;AI agents&#xff09;这个词&#xff0c;但不太确定它们是什么&#xff0c;或者如何在 TypeScript&#xff08;或 JavaScript&#xff09;中构建一个&#xff1f;跟我一起深入了解 AI 代理的概…...

SQLAlchemy 支持特殊字符

postgresql 实践 pydantic 实践&#xff08;一&#xff09;基础 pydantic 实践&#xff08;二&#xff09;数据校验 SQLAlchemy 介绍与实践 SQLAlchemy 支持特殊字符 SQLAlchemy 支持特殊字符 1. 字符集介绍分析2. MySQL 支持特殊字符2.1. 更新 MySQL 字符集为 utf8mb42.2 更新…...

Docker 快速入门指南

Docker 快速入门指南 1. Docker 常用指令 Docker 是一个轻量级的容器化平台&#xff0c;可以帮助开发者快速构建、测试和部署应用程序。以下是一些常用的 Docker 命令。 1.1 镜像管理 # 搜索镜像 docker search <image_name># 拉取镜像 docker pull <image_name>…...

计算机网络 - OSI 七层模型

OSI 七层模型 OSI&#xff08;Open System Interconnection&#xff0c;开放系统互联&#xff09;模型由 ISO&#xff08;国际标准化组织&#xff09; 制定&#xff0c;目的是为不同计算机网络系统之间的通信提供一个标准化的框架。它将网络通信划分为 七个层次&#xff0c;每…...

如何调整yarn.nodemanager.vmem-pmem-ratio参数?

调整 yarn.nodemanager.vmem-pmem-ratio 参数的步骤如下&#xff1a; 1. 打开 YARN 配置文件 找到 yarn-site.xml 文件&#xff0c;该文件通常位于 Hadoop 配置目录中&#xff0c;例如 /etc/hadoop/conf 或 /opt/module/hadoop-3.1.3/etc/hadoop。 2. 找到并修改 yarn.nodemana…...

自顶向下学习K8S--部署Agones

本文在本人博客&#xff0c;原文地址&#xff1a;http://viogami.tech/index.php/blog/346/ 我是gopher&#xff0c;离不开云原生&#xff0c;自然也逃不了理解docker和K8S这俩。今天抽空想玩下agones&#xff0c;进而对K8S有实践性的理解。 学一个新事物从底层理论学肯定是最…...

unity中Xcharts图表鼠标悬浮表现异常

鼠标悬浮在面板附近&#xff0c;只显示单独的一个项目 而且无论鼠标如何移动&#xff0c;根本没有效果。 解决方案&#xff1a; 需要在对应的Canvas上绑定主相机才可以 鼠标移动到项目上就有信息展示了...

2025年最新自动化/控制保研夏令营预推免面试真题分享(东南大学苏州校区/华东理工/南航/天大)

笔者来2021级本科自动化专业&#xff0c;以下部分将介绍我在夏令营以及预推免期间发生经历和问题 东南大学苏州校区蒙纳士大学联培 东南大学苏州校区的项目算是一个比较小众的项目&#xff0c;是第一年在苏州校区&#xff0c;二三年到南京校区找导师&#xff08;不提供住宿自…...

【Java SE】包装类 Byte、Short、Integer、Long、Character、Float、Double、Boolean

参考笔记&#xff1a;java 包装类 万字详解&#xff08;通俗易懂)_java包装类-CSDN博客 目录 1.简介 2.包装类的继承关系图 3.装箱和拆箱 3.1 介绍 3.2 手动拆装箱 3.3. 自动拆装箱 ​4.关于String类型的转化问题 4.1 String类型和基本类型的相互转化 4.1.1 String —…...

口腔种植全流程AI导航系统及辅助诊疗与耗材智能化编程分析

一、系统架构与编程框架设计 口腔种植全流程人工智能导航系统的开发是一项高度复杂的多学科融合工程,其核心架构需在医学精准性、工程实时性与临床实用性之间实现平衡。系统设计以模块化分层架构为基础,结合高实时性数据流与多模态协同控制理念,覆盖从数据采集、智能决策到…...

小林coding-10道Java集合面试题

1.数组与集合区别&#xff0c;用过哪些&#xff1f;说说Java中的集合&#xff1f;Java中的线程安全的集合是什么&#xff1f;Collections和Collection的区别?集合遍历的方法有哪些&#xff1f; 2.List?讲一下java里面list的几种实现&#xff0c;几种实现有什么不同&#xff…...

Java 集合中ArrayList与LinkedList的性能比较

一、需求&#xff1a; 头部插入‌&#xff1a;向列表头部插入10万个整数。‌随机访问‌&#xff1a;从列表中间位置连续获取1万个元素。‌头部删除‌&#xff1a;从列表头部连续删除10万个元素。 二、 使用ArrayList与LinkedList测试 //常量定义&#xff0c;用于测试操作的次数…...

SQL问题分析与诊断(8)——前提

8.1. 前提 与其他关系库类似&#xff0c;SQL Server中&#xff0c;当我们对存在性能问题的SQL语句进行分析和诊断时&#xff0c;除了获取该SQL语句本身外&#xff0c;还需要获取SQL语句相应的查询计划及其相关的数据环境。这里&#xff0c;所谓数据环境&#xff0c;具体是指SQ…...

漏洞发现:AWVS 联动 XRAY 图形化工具.(主动+被动 双重扫描)

漏洞发现&#xff1a;AWVS 联动 XRAY 图形化工具. 漏洞发现是网络安全领域的关键环节&#xff0c;指通过技术手段识别计算机系统、网络设备或软件中存在的设计缺陷、配置错误或代码漏洞的过程。这些漏洞可能被攻击者利用&#xff0c;导致数据泄露、服务中断或权限提升等风险。…...

上门家政小程序实战,从0到1解决方案

一、逻辑分析 上门家政小程序主要涉及用户端和服务端两大部分。用户端需要实现服务浏览、预约下单、订单跟踪等功能&#xff1b;服务端则要处理订单管理、服务人员管理、数据统计等任务。以下是详细的功能模块分析&#xff1a; 用户注册与登录&#xff1a;用户通过手机号或第三…...

Linux ping/telnet/nc命令

在Linux操作系统中&#xff0c;ping命令用于测试网络连接和发送数据包到目的主机。 然而&#xff0c;ping命令默认情况下只能测试IP地址和域名&#xff0c;而无法直接测试端口号。 ping www.baidu.comping 192.168.0.1 测试端口 如果你想测试特定端口是否开放并响应&#xff…...

Netty - 从Nginx 四层(TCP/UDP)流量中获取客户端真实/网络出口IP

文章目录 一、背景与原理1.1 问题场景网络架构影响分析1.1 客户端与Nginx之间存在的NAT/VPN1.2 Nginx与RPC服务之间的NAT 1.2 技术原理 二、环境配置验证2.1 Nginx配置2.2 版本要求 三、Netty服务端实现3.1 Pipeline配置&#xff08;核心代码&#xff09;3.2 协议处理器实现3.3…...

【持续集成和持续部署】

大致流程&#xff1a; 提交代码--拉取下来新代码并自动构建与部署--应用接口探活--执行自动化测试--输出自动化测试报告 一、持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09; 持续集成是一种软件开发实践&#xff0c;开发团队成员频繁地将代码集成到…...

Transformers中的BertConfig、BertModel详解

目录 一、功能 二、用法 1.导入BertConfig 2. 初始化默认配置 3.使用配置初始化模型 使用场景&#xff1a; 1.自定义小型BERT模型 2.加载预训练模型配置 从 Hugging Face 模型库加载 bert-base-uncased 的默认配置&#xff1a; 通过 BertConfig&#xff0c;你可以灵活定义…...

Ubuntu下载docker、xshell

配置&#xff1a;VMware虚拟机、Ubuntu24.04.1 首先打开vm启动虚拟机 下载docker Ubuntu启动之后&#xff0c;按CTRLALTT 打开终端 1.更新软件包索引并安装依赖 sudo apt-get updatesudo apt-get install \ca-certificates \curl \gnupg \lsb-release 2.添加docker官方的GP…...

迅为iTOP-RK3576人工智能开发板Android 系统接口功能测试

2.1 开机启动 开发板接通电源&#xff0c;并按下电源开关&#xff0c;系统即启动&#xff0c;在启动过程中&#xff0c;系统会显示下图中的开机画面&#xff0c;它们分别是 Android 系统启动时的 Logo 画面&#xff1a; 最后会显示如下解锁画面&#xff1a; 2.2 命令终端 将…...

Android设计模式之工厂方法模式

一、定义&#xff1a; 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪个类。 二、组成&#xff1a; 1.抽象工厂&#xff1a;工厂模式的核心&#xff0c;声明工厂方法&#xff0c;返回抽象产品对象。 2.具体工厂&#xff1a;实现工厂方法&#xff0c;返还具体的产品…...

端侧设备(如路由器、家庭网关、边缘计算盒子、工业网关等)的典型系统、硬件配置和内存大小

🏠 家用/工业级边缘设备硬件概览 类型常见设备示例CPU 架构内存范围操作系统类型家用路由器TP-Link、小米、华硕、OpenWrtARM Cortex-A7/A964MB~256MBOpenWrt / DD-WRT / Embedded Linux智能家庭网关华为、绿米、天猫精灵、Aqara HubARM Cortex-M/R128MB~512MBEmbedded Lin…...

office_word中使用宏以及DeepSeek

前言 Word中可以利用DeepSeek来生成各种宏&#xff0c;从而生成我们需要各种数据和图表&#xff0c;这样可以大大减少我们手工的操作。 1、Office的版本 采用的是微软的office2016&#xff0c;如下图&#xff1a; 2、新建一个Word文档 3、开启开发工具 这样菜单中的“开发工具…...

数据结构day04

一 栈 1栈的基本概念 各位同学大家好&#xff0c;从这个小节开始&#xff0c;我们会正式进入第三章的学习&#xff0c;我们会学习栈和队列&#xff0c;那这个小节中我们会先认识栈的基本概念。我们会从栈的定义和栈的基本操作来认识栈这种数据结构&#xff0c;也就是要探讨栈的…...