QT实操中遇到的一些(C++)疑惑点汇总

QT实操中 遇到的一些C++疑惑点汇总

1.实例化对象的两种方法及其访问方式

1.1 示例
1.2 总结

2.基类成员的访问

2.1 直接访问继承的基类成员

2.1.1示例代码
2.1.2 输出结果

2.2 使用作用域解析符来显式调用基类成员函数

2.2.1 示例代码
2.2.2 输出结果

2.3 使用 this 指针访问基类成员

2.3.1 示例代码
2.3.2 输出结果

2.4 总结

3.枚举 与 运算符 :: 的使用

3.1 困惑的引入

3.2 C++枚举的总结

3.2.1 枚举的走义
3.2.2 枚举的使用
1>声明
2>条件语句中使用
3.2.3 使用枚举的例子(类名::枚举成员)
3.2.3 枚举的范围和作用域
3.2.4 强枚举的优点

3.3 运算符::的使用

3.3.1 静态成员
3.3.2 命名空间成员
3.3.3 枚举或常量
3.3.4 基类成员
3.3.5 总结

1. 实例化对象的两种方法及其访问方式

在C++中,如果对象是通过new关键字创建的,那它的类型就是指针,需要使用->来访问其成员。而如果对象是直接实例化的(不使用new),那它是一个具体的对象实例,用.来访问成员。
在这里插入图片描述

1.1 示例
  1. 使用new创建对象指针

    QRadioButton* radioButton = new QRadioButton(this); // 创建一个指针指向 QRadioButton 对象
    radioButton->setText("开关一"); // 使用 "->" 来访问成员
    
  2. 直接实例化对象

    QRadioButton radioButton; 		  // 创建一个 QRadioButton 的实例对象
    radioButton.setText("开关一"); 	// 使用 "." 来访问成员
    
1.2 总结
  • 使用new:对象是指针类型,成员访问使用->
  • 直接实例化:对象是值类型(直接实例),成员访问使用.

->.的选择取决于对象是指针还是实例化的具体对象。


2. 基类成员的访问

  • 在 C++ 中,如果你有一个派生类的对象,并希望引用该对象的基类成员(包括变量或函数),可以通过直接访问显式调用基类作用域的方式实现。

  • 本质都是通过::,注意区别于继承的操作符,继承使用,以下是一些常见方法:

    • 直接访问:如果基类成员是publicprotected,可直接通过::访问。
    • 作用域解析符:通过Base::成员名形式访问同名基类成员。
    • this指针:使用this->Base::成员名可以更显式地标明访问基类成员。
2.1 直接访问继承的基类成员

如果基类成员是publicprotected,并且派生类是通过publicprotected继承基类,可以直接在派生类的对象中访问这些成员。

2.1.1 示例代码
#include <iostream>
#include <string>

class Base {
public:
    int baseVar;  // 基类的变量成员

    Base(int val) : baseVar(val) {} // 基类构造函数初始化成员变量

    void showBaseVar() const {
        std::cout << "基类成员 baseVar: " << baseVar << std::endl;
    }
};

class Derived : public Base {
public:
    int derivedVar;

    Derived(int baseVal, int derivedVal) 
        : Base(baseVal), derivedVar(derivedVal) {}

    void showValues() {
        // 直接访问基类成员变量
        std::cout << "基类成员 baseVar: " << baseVar << std::endl;

        // 直接调用基类成员函数
        showBaseVar();

        // 使用派生类成员变量
        std::cout << "派生类成员 derivedVar: " << derivedVar << std::endl;
    }
};

int main() {
    Derived derivedObj(10, 20);  // 创建派生类对象
    derivedObj.showValues();     // 输出基类和派生类成员
    return 0;
}
2.1.2 输出结果
基类成员 baseVar: 10
基类成员 baseVar: 10
派生类成员 derivedVar: 20

showValues 方法中,我们直接使用 baseVarshowBaseVar() 来访问基类的成员变量和函数。

2.2 使用作用域解析符来显式调用基类成员函数

当派生类有与基类同名的成员函数或变量时,可以使用作用域解析符(::)来访问基类的成员,以避免名称冲突。

2.2.1 示例代码
#include <iostream>

class Base {
public:
    void display() {
        std::cout << "Base 类的 display() 函数" << std::endl;
    }
};

class Derived : public Base {
public:
    void display() {
        std::cout << "Derived 类的 display() 函数" << std::endl;
    }

    void show() {
        // 调用派生类的 display() 函数
        display();

        // 调用基类的 display() 函数
        Base::display();
    }
};

int main() {
    Derived derivedObj;
    derivedObj.show();
    return 0;
}
2.2.2 输出结果
Derived 类的 display() 函数
Base 类的 display() 函数

Derived::show 中,通过 Base::display() 显式调用基类的 display() 函数。

2.3 使用 this 指针访问基类成员

当基类成员与派生类成员同名时,可以用this指针加上作用域解析符来明确访问基类成员。

2.3.1 示例代码
#include <iostream>

class Base {
public:
    int var = 5;
};

class Derived : public Base {
public:
    int var = 10;

    void show() {
        std::cout << "派生类 var: " << var << std::endl;           // 访问派生类的 var
        std::cout << "基类 var: " << this->Base::var << std::endl;  // 显式访问基类的 var
    }
};

int main() {
    Derived derivedObj;
    derivedObj.show();
    return 0;
}
2.3.2 输出结果
派生类 var: 10
基类 var: 5
2.4 总结
  • 直接访问:如果基类成员是publicprotected,可直接访问。
  • 作用域解析符:通过Base::成员名形式访问同名基类成员。
  • this指针:使用this->Base::成员名可以更显式地标明访问基类成员。

3. 枚举 与 运算符::的使用

3.1 困惑的引入

上代码片段:

	/* 判断文件是否存在 */
    if (file.exists() )
    {
        /* 以只读的方式打开 */
        file.open(QFile::ReadOnly);     // 参数为QFile的枚举值ReadOnly
        /* 以字符串的方式保存读出的结果 */
        QString styleSheet = QLatin1String(file.readAll());
        /* 设置全局样式 */
        qApp->setStyleSheet(styleSheet);
        /* 关闭文件 */
        file.close();
    }

一个类中定义了枚举成员,类的实例化对象可通过 类名::枚举成员 的方式来引用该枚举值。

ps:我还以为有点钻牛角尖了,巨困惑QFile::ReadOnly到底是个啥?
	1> 开始还理解成继承,一想这个作为一个参数,怎么可能是一个类;
	2> 后面想着肯定是参数,又知道::是引用成员变量,那么类咋还能直接一个常量?
		( 查了ReadOnly是一个八进制数进行的替换 )
	3> 然后就查了C++枚举,后觉得没理解错啊,一查,还真”**一个类中定义了枚举成员,类的实例化对象可以通过 `类名::枚举成员` 的方式来引用该枚举值**。“!

因此,特来进行C++枚举的总结,和**::运算符的使用**!

3.2 C++枚举的总结

枚举(enum)在 C++ 中是一种用户自定义的数据类型,用于定义一组具名的整型常量。它可以使代码更易读、易维护,并能提供更强的类型安全性。以下是枚举的定义与使用的详细讲解:

3.2.1 枚举的定义

枚举可以通过 enum 关键字进行定义。基本的枚举定义如下:

enum Color {
    Red,
    Green,
    Blue
};

在这个示例中,Color 是枚举类型的名称,RedGreenBlue 是枚举值。默认情况下,Red 的值为 0Green 的值为 1Blue 的值为 2

自定义枚举值

你还可以为枚举值指定特定的整数值:

enum Status {
    Success = 0,
    Error = 1,
    Unknown = -1
};
3.2.2 枚举的使用
1> 声明
Color myColor;
myColor = Red;  // 将枚举值赋给变量
2> 条件语句中使用
if (myColor == Green) 
{
    // 处理绿色的情况
}
3.2.3 使用枚举的例子( 类名::枚举成员 )
  • 一个类中定义了枚举成员,类的实例化对象可以通过 类名::枚举成员 的方式来引用该枚举值

  • 这种方式能够清晰地表明枚举值的所属类,有助于提高代码的可读性。

下面是一个具体的示例:

#include <iostream>

class MyClass 
{
public:
    // 定义枚举类型 Color
    enum Color 
    {
        Red,
        Green,
        Blue
    };
};

int main() {
    // 直接通过类名引用枚举值
    MyClass::Color myColor = MyClass::Green;

    // 根据颜色值输出不同的信息
    switch (myColor) {
        case MyClass::Red:
            std::cout << "The color is Red." << std::endl;
            break;
        case MyClass::Green:
            std::cout << "The color is Green." << std::endl;
            break;
        case MyClass::Blue:
            std::cout << "The color is Blue." << std::endl;
            break;
    }
    return 0;
}
3.2.3 枚举的范围和作用域

在 C++11 及之后的版本中,可以使用 强枚举enum class),它提供了更好的作用域控制和类型安全:

enum class Fruit 
{
    Apple,
    Banana,
    Orange
};

Fruit myFruit = Fruit::Apple;  // 访问枚举值需要指定作用域
3.2.4 强枚举的优点
  • 类型安全:强枚举不会隐式转换为整数类型,防止错误使用。
  • 作用域控制:枚举值属于其定义的枚举类型,避免名称冲突。
3.3 运算符::的使用
  • 运算符 :: 的分类总结,涵盖静态成员、命名空间成员、枚举或常量、基类成员,并进行了合并说明。

  • 运算符::作用域解析运算符,用于访问特定作用域中的成员,如类、命名空间、枚举等

3.3.1 静态成员
  • 定义: 属于类本身而非某个实例的成员,所有实例共享同一份数据。

  • 访问方式: 类名::静态成员名

  • 示例:

    cpp复制代码class MyClass {
    public:
        static int count;  // 静态成员变量声明
    };
    
    int MyClass::count = 0;  // 静态成员变量定义
    
3.3.2 命名空间成员
  • 定义: 用于组织代码,避免命名冲突,可以包含函数、变量等。

  • 访问方式: 命名空间名::成员名

  • 示例:

    cpp复制代码namespace MyNamespace {
        int value = 42;  // 命名空间中的变量
    }
    
    int val = MyNamespace::value;  // 访问命名空间中的变量
    
3.3.3 枚举或常量
  • 定义: 枚举是一种用户自定义类型,包含一组命名的整型常量。常量是固定值。

  • 访问方式: 类名::枚举值命名空间名::枚举值

  • 示例

    :

    class MyClass {
    public:
        enum Color { Red, Green, Blue };  // 枚举定义
    };
    
    MyClass::Color c = MyClass::Red;  // 访问枚举值
    
3.3.4 基类成员
  • 定义: 基类是派生类的父类,基类成员可以是数据成员或成员函数。

  • 访问方式: 基类名::成员名(特别是在派生类中使用)

  • 示例:

    class Base {
    public:
        void show() { std::cout << "Base" << std::endl; }
    };
    
    class Derived : public Base {
    public:
        void show() { std::cout << "Derived" << std::endl; }
    
        void display() {
            Base::show();  // 访问基类的 show 方法
        }
    };
    
3.3.5 总结
  • 作用域: :: 运算符用于明确访问不同作用域中的成员,避免命名冲突。

  • 共享性: 静态成员是类共享的,命名空间和枚举值是全局可见的,基类成员可通过派生类访问。
    名`(特别是在派生类中使用)

  • 示例:

    class Base {
    public:
        void show() { std::cout << "Base" << std::endl; }
    };
    
    class Derived : public Base {
    public:
        void show() { std::cout << "Derived" << std::endl; }
    
        void display() {
            Base::show();  // 访问基类的 show 方法
        }
    };
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【运维自动化-作业平台】如何使用全局变量之数组类型?

数组类型的全局变量也是作业平台里常用的&#xff0c;支持关联数组和索引数组&#xff0c;目前仅支持shell&#xff0c;语法跟shell一致。索引数组 语法 arry(1 2 3 a b c) ---定义一个数组arry ${arry[*]} ---获取所有数组元素 ${arry[]} ---获取所有数组元素 ${arry[0]} --…

docker安装zabbix +grafana

安装zabbix grafana 1、部署 mkdir -p /opt/zabbix/{data,backups}mkdir -p /opt/grafanasudo chown -R 472:472 /opt/grafanasudo chmod -R 755 /opt/grafanacat > docker-compose.yml <<-EOF version: 3.3services:mysql-server:image: mysql:8.1container_name: m…

容器安全检测和渗透测试工具

《Java代码审计》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484219&idx1&sn73564e316a4c9794019f15dd6b3ba9f6&chksmc0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene21#wechat_redirect Docker-bench-…

GB 35114-2017 学习笔记(规避版权阉割版)

GB 35114-2017 学习笔记&#xff08;规避版权阉割版&#xff09; openstd.samr.gov.cn 国家标准全文公开系统 这个政府网站提供GB 35114-2017标准的的预览和下载&#xff0c;有需要的自行下载 GB 35114-2017作为一个国家强制标准&#xff0c;在国家标准全文公开系统 自己做个…

高校企业数据挖掘平台推荐

TipDM数据挖掘建模平台是由广东泰迪智能科技股份有限公司自主研发打造的可视化、一站式、高性能的数据挖掘与人工智能建模服务平台&#xff0c;致力于为使用者打通从数据接入、数据预处理、模型开发训练、模型评估比较、模型应用部署到模型任务调度的全链路。平台内置丰富的机器…

ROSSERIAL与Arduino IDE交叉开发(UBUNTU环境,包含ESP32、arduino nano)

ROSSERIAL与Arduino IDE交叉开发 一、简介二、安装1、Ubuntu下的Arduino IDE安装 **针对ESP32报错问题原因溯源和修改**三、运行结点 一、简介 这个教程展示在ubuntu环境下如何利用Arduino IDE配合rosserial开发机器人部件。通过Arduino IDErosserial实现arduino/esp32开发板通…

word-毕业论文的每一章节的页眉单独设置为该章的题目怎么设置

在Microsoft Word中&#xff0c;为毕业论文的每个章节设置不同的页眉&#xff0c;通常需要使用“分节符”来分隔各个章节&#xff0c;然后在每个章节中单独设置页眉。以下是详细步骤&#xff1a; 使用分节符 插入分节符&#xff1a; 将光标放在每个章节的末尾&#xff08;注意…

Flutter:SlideTransition位移动画,Interval动画延迟

配置vsync&#xff0c;需要实现一下with SingleTickerProviderStateMixinclass _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin{// 定义 AnimationControllerlate AnimationController _controller;overridevoid initState() {super.…

H.265流媒体播放器EasyPlayer.js网页全终端安防视频流媒体播放器可以播放本地视频吗

H.264/H.265播放器EasyPlayer.js主要用于在网页上实现视频播放功能&#xff0c;特别是针对RTSP流的播放。它允许开发者在不需要安装额外插件或软件的情况下&#xff0c;直接在网页中嵌入和播放来自监控摄像头或其他RTSP源的视频流。 可以播放本地视频吗&#xff1f; 回答&…

Linux: 任务的定时与延期

概述 ls 这种命令是立刻执行的命令&#xff0c;在linux中命令还可以延时执行&#xff0c;它们都涉及到时间的观念 常用命令 先来看下有关系统时间的规格 1 &#xff09; date 命令调节时间 $ date 显示当前时间还可以去定制 date 的一个输出, $ man date 可自定义输出 $ d…

RBAC——基于角色的访问控制

目录 一、RBAC核心概念 1. 角色&#xff08;Role&#xff09; 2. 用户&#xff08;User&#xff09; 3. 权限&#xff08;Permission&#xff09; 4. 会话&#xff08;Session&#xff09; 二、RBAC模型的演进 1. RBAC0&#xff1a;基本模型 2. RBAC1&#xff1a;角色…

OceanBase V4.x应用实践:如何排查表被锁问题

DBA在日常工作中常常会面临以下两种常见情况&#xff1a; 业务人员会提出问题&#xff1a;“表被锁了&#xff0c;导致业务受阻&#xff0c;请帮忙解决。” 业务人员还会反馈&#xff1a;“某个程序通常几秒内就能执行完毕&#xff0c;但现在却运行了好几分钟&#xff0c;不清楚…

同三维T80003JEHS 4K/60帧HDMI/SDI超高清H.265解码器

1路HDMI和1路SDI输出&#xff0c;1路3.5音频输入和1路3.5音频输出&#xff0c;1个USB2.0口1个USB3.0口&#xff0c;带1个RS232串口&#xff0c;2个网口&#xff0c;支持1路4K60或4路4K30或16路1080P或32路720P解码输出。4种画面分割显示模式。 产品简介&#xff1a; 同三维T80…

【更新中】《硬件架构的艺术》笔记(五):低功耗设计

介绍 能量以热量形式消耗&#xff0c;温度升高芯片失效率也会增加&#xff0c;增加散热片或风扇会增加整体重量和成本&#xff0c;在SoC级别对功耗进行控制就可以减少甚至可能消除掉这些开支&#xff0c;产品也更小更便宜更可靠。本章描述了减少动态功耗和静态功耗的各种技术。…

网络安全审计概述与分类

目录 网络安全审计概述等保五个级别对审计要求网络安全审计系统组成网络安全审计系统类型 网络安全审计概述 4A分别是认证、授权、账号、审计 网络安全审计是指对网络信息系统的安全相关活动信息进行获取、记录、存储分析和利用的工作。 网络安全审计的作用在于建立“事后”…

安宝特方案 | AR助力紧急救援,科技守卫生命每一刻!

在生死时速的紧急救援战场上&#xff0c;每一秒都至关重要&#xff01;随着科技的发展&#xff0c;增强现实&#xff08;AR&#xff09;技术正在逐步渗透到医疗健康领域&#xff0c;改变着传统的医疗服务模式。 安宝特AR远程协助解决方案&#xff0c;凭借其先进的技术支持和创新…

IDEA:2023版远程服务器debug

很简单&#xff0c;但是很多文档没有写清楚&#xff0c;wocao 一、首先新建一个远程jvm 二、配置 三、把上面的参数复制出来 -agentlib:jdwptransportdt_socket,servery,suspendn,address5005 四、然后把这串代码放到服务器中&#xff08;这里的0.0.0.0意思是所有IP都能访问&a…

Midjourney基础命令和提示词

1 基础命令 1.1 /imagine prompt 生成图片的核心命令&#xff0c;prompt 后输入描述。 /imagine prompt: A majestic dragon flying over a misty mountain, cinematic lighting, 4K resolution 高级提示 1.1.1 基本参数 图片比例 --ar 图片比例 混乱 Aspect Ratios --…

ElasticSearch7.x入门教程之索引概念和基础操作(三)

文章目录 前言一、索引基本概念二、索引基本使用elasticsearch-head插件Kibana使用 总结 前言 要想熟悉使用ES的索引&#xff0c;则必须理解索引相关的概念&#xff0c;尤其是在工作当中。 在此记录&#xff0c;方便开展工作。 一、索引基本概念 尽量以通俗的话语。 1、集群…