Qt之C++

news2024/11/24 1:54:56

Qt之C++

类的定义

C语言的灵魂是指针
C++的灵魂是类,类可以看出C语言结构体的升级版,类的成员可以是变量,也可是函数。
在这里插入图片描述

class Box
{
public://确定类成员的访问属性
    double length;//长
    double breadth;//宽度
    double heigth;//高度
};

定义对象

对象是类的实例化

直接定义

Box mybox;//Box是类,mybox是对象

在堆中定义

    Box *youbox = new Box;//在堆中定义对象youbox
    delete youbox;//删除对象,释放堆里面的内存

访问对象中的成员

类的对象的公共数据成员可以使用直接成员访问运算符 . 来访问。

//普通变量通过. 指针通过->
    Box mybox;//Box是类,mybox是对象
    mybox.length = 10;
    
    Box *youbox = new Box;//在堆中定义对象youbox
    youbox->length = 20;
    delete youbox;//删除对象,释放堆里面的内存

类成员函数

类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。类成员函数是类的一个成员,它可以操作类的任意对象,可以访问对象中的所有成员。

类成员函数可以在类内部定义,也可以在类外部定义

内部定义

class Box
{
public://确定类成员的访问属性
    double length;//长
    double breadth;//宽度
    double heigth;//高度
    
    //函数-表行为
    double getVolume(void)
    {
        return length * breadth * heigth;
    }
};

外部定义(使用比较多)

class Box
{
public://确定类成员的访问属性
    double length;//长
    double breadth;//宽度
    double heigth;//高度
    
    //函数-表行为
    double getVolume(void);

};
//:: 运算符之前必须使用类名
double Box::getVolume(void)
{
    return length * breadth * heigth;
}

例子

#include <iostream>

using namespace std;

class Box
{
public://确定类成员的访问属性
    double length;//长
    double breadth;//宽度
    double heigth;//高度

    //函数-表行为
    double getVolume(void);
    void setLength(double len);
    void setBreadth(double bre);
    void setHeight(double hei);

};
//:: 运算符之前必须使用类名
double Box::getVolume(void)
{
    return length * breadth * heigth;
}

void Box::setLength(double len)
{
    length = len;
}

void Box::setBreadth(double bre)
{
    breadth = bre;
}

void Box::setHeight(double hei)
{
    heigth = hei;
}

int main()
{
    double volume = 0.0;//用于存储体积
    Box *youbox = new Box;//在堆中定义对象youbox
    youbox->setLength(6.0);
    youbox->setHeight(7.0);
    youbox->setBreadth(8.0);

    volume = youbox->getVolume();
    cout << "youbox的体积: " << volume << endl;

    delete youbox;//删除对象,释放堆里面的内存
    return 0;
}

类的访问修饰符

关键字 public、private、protected 称为访问修饰符。

class Base {
 
   public:
 
  // 公有成员
  //公有成员在程序中类的外部是可访问的。您可以不使用任何成员函数来设置和获取公有变量的值
 
   protected:
 
  // 受保护成员
 //私有成员变量或函数在类的外部是不可访问的,甚至是不可查看的。只有类和友元函数可以访问私有成员。
   private:
 
  // 私有成员
 //protected(受保护)成员变量或函数与私有成员十分相似,但有一点不同,protected(受保护)成员在派生类(即子类)中是可访问的。
};

在这里插入图片描述

类的构造函数和析构函数

构造函数

类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。

构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。

构造函数:假如我们定义了构造函数,就会触发这个构造函数。

构造函数也可以进行重载。

#include <iostream>

using namespace std;

class Box
{
public://确定类成员的访问属性
    double length;//长
    double breadth;//宽度
    double heigth;//高度
    Box()//构造函数(没有带参数)
    {
        length = 1;
        breadth = 1;
        heigth = 1;
    }

    Box(int a)//带参数的构造函数(重载)
    {
        length = 2;
        breadth = 2;
        heigth = 2;
    }

    //函数-表行为
    double getVolume(void);
    void setLength(double len);
    void setBreadth(double bre);
    void setHeight(double hei);

};
//:: 运算符之前必须使用类名
double Box::getVolume(void)
{
    return length * breadth * heigth;
}

void Box::setLength(double len)
{
    length = len;
}

void Box::setBreadth(double bre)
{
    breadth = bre;
}

void Box::setHeight(double hei)
{
    heigth = hei;
}

int main()
{
    double volume = 0.0;//用于存储体积
   // Box *youbox = new Box;//在堆中定义对象youbox
    //想要初始化时使用带参数的构造函数时
    int a;
    Box *youbox = new Box(a);//在堆中定义对象youbox
    volume = youbox->getVolume();//使用的默认值
    cout << "youbox的体积: " << volume << endl;

    youbox->setLength(6.0);
    youbox->setHeight(7.0);
    youbox->setBreadth(8.0);

    volume = youbox->getVolume();
    cout << "youbox的体积: " << volume << endl;

    delete youbox;//删除对象,释放堆里面的内存
    return 0;
}

在这里插入图片描述
初始化的另一种方式
在这里插入图片描述

析构函数

析构函数:假如我们定义了析构函数,当对象被删除或者生命周期结束的时候,就会
触发析构函数。

类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。

析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。

class Box
{
public://确定类成员的访问属性
    double length;//长
    double breadth;//宽度
    double heigth;//高度
    Box()//构造函数(没有带参数)
    {
        length = 1;
        breadth = 1;
        heigth = 1;
    }

    Box(int a)//带参数的构造函数(重载)
    {
        length = 2;
        breadth = 2;
        heigth = 2;
    }

    ~Box()//析构函数
    {
        cout<<"Box is end"<<endl;
    }
    //函数-表行为
    double getVolume(void);
    void setLength(double len);
    void setBreadth(double bre);
    void setHeight(double hei);

};

在这里插入图片描述

继承

继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。

当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。

类的继承允许我们在新的类里面继承父类的public还有protected部分,private是不能被继承的。
当我们觉得这个类不好的时候,可以使用类的继承,添加我们需要的功能。
在这里插入图片描述

// 基类
class Animal {
    // eat() 函数
    // sleep() 函数
};


//派生类
class Dog : public Animal {
    // bark() 函数
};

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <iostream>

using namespace std;

//基类Shape(范围很大,描述模糊)
class Shape
{
public://接口函数
    void setwidth(int w)
    {
        width = w;
    }
    void setHeight(int h)
    {
        height = h;
    }
public://构造函数
    Shape() {}
protected:
    int width;
    int height;
};

//基类 PaintCost
class PaintCost
{
public:
    int getCost(int area)
    {
        return area*70;
    }
    //构造函数
public:
    PaintCost() {}
};

//派生类
class Rectangle: public Shape,public PaintCost
{
public:
    int getArea()
    {
        return (width*height);
    }
};
int main()
{
    Rectangle *Rect = new Rectangle;
    int area;

    Rect->setwidth(5);
    Rect->setHeight(7);
    area = Rect->getArea();

    //输出对象的面积
    cout << "Total area:"<<Rect->getArea() << endl;
    //输出总花费
    cout<<"Total paint const: $"<<Rect->getCost(area)<<endl;
    return 0;
}

在这里插入图片描述

虚函数和纯虚函数

用virtual来修饰,虚函数是用在类的继承上的。
可以预留接口,实现分工合作。

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

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

相关文章

mysql-数据库-创建列表

一.创建列表 1..首先&#xff0c;进入mysql数据库 -->mysql -uroot -p 2. 其次&#xff0c;mysql默认的数据库类型为mydb&#xff0c;这时候&#xff0c;就得查看现在使用的类型 mysql> select database(); 3. 如果创建的类型不同&#xff0c;则使用create database …

tensorboard无法显示数据的几个原因与解决方案【已解决】

本博客记录本人在学习tensorboard时关于浏览器无法显示数据问题的解决方案。该问题也算是折磨本人长达3个小时&#xff0c;我也相信有不少人为此感到苦恼&#xff0c;希望本文能给你提供某些帮助。 1.确保电脑与logs路径名称为英文 首先需要确保电脑名称为英文&#xff0c;否则…

SpringCloud(30):Nacos快速入门

1 安装Nacos Server 1.1 预备环境准备 Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos&#xff0c;还需要为此配置 Maven环境&#xff0c;请确保是在以下版本环境中安装使用: 64 bit OS&#xff0c;支持 Linux/Unix/Mac/Windows&#xff0c;推荐选用 Linux…

【计算机网络】12、frp 内网穿透

文章目录 一、服务端设置二、客户端设置 frp &#xff1a;A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet。是一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议&#xff0c;且…

力扣 -- 139. 单词拆分

一、题目 题目链接&#xff1a;139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; 二、解题步骤 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 三、参考代码 class Solution { public:bool wordBreak(str…

学生管理系统(升级版)

import java.util.ArrayList; import java.util.Random; import java.util.Scanner;public class Demo_学生管理系统 {public static void main(String[] args) {ArrayList<User> list new ArrayList<>();Scanner sc new Scanner(System.in);while (true) {Syste…

Transformer1.0-预热

一.Encoder encoder:译为编码器&#xff0c;负责将输入序列压缩成指定长度的向量&#xff0c;这个向量就可以堪称是这个序列的语义。然后可进行编码或特征提取等操作 在transformer中encoder由6个相同的层组成&#xff0c;每个层包含 Multi-Head Self-AttentionPosition-Wise …

SEO 链接建设:初学者指南 2023

链接在互联网上扮演着一种宝贵的角色&#xff0c;就像货币一样重要。当其他网页纷纷指向某个网页时&#xff0c;这个网页就会被视为很有"权威"&#xff0c;在搜索引擎&#xff08;比如谷歌&#xff09;中获得更高的排名。相反地&#xff0c;如果一个网页没有别的网页…

linuxARM裸机学习笔记(6)----UART串口通信和串口格式化函数移植实验

UART串口通信 协议介绍&#xff1a;串口通信协议_ft232和ch340是串口的哪种协议_夜路难行々的博客-CSDN博客 I.MX6U UART UART时钟源选择的是pll3_80m&#xff0c;然后在(bit5:0)设置分频值&#xff0c;设置为1分频 ADBR(bit14) &#xff1a;自动波特率检测使能位&#xff0c…

个人信息保护合规审计管理办法的发展方向

8月3日&#xff0c;为指导、规范个人信息保护合规审计活动&#xff0c;中央网信办就《个人信息保护合规审计管理办法》及配套的《个人信息保护合规审计参考要点》公开征求意见 个人信息保护合规审计参考要点 第一条 本要点依据《中华人民共和国个人信息保护法》等法律、行政法…

基于Spring Boot的在线视频教育培训网站设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的在线视频教育培训网站设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java sp…

zabbix触发器标签提取监控项子字符串实现对应告警恢复

0 实验环境 zabbix 6.0 1 监控项 1.1 监控项设置 通过zabbix agent自定义监控项&#xff0c;读取某文件内容模拟日志/trap告警&#xff0c;测试获取触发器标签中提取子字符串功能&#xff0c;以及相同标签的触发器自动恢复功能。 1.2 手工运行 手动触发之后&#xff0c;模…

嵌入式开发学习(STC51-17-DAC数模转换)

内容 使DAC(PWM)模块上的指示灯DA1呈呼吸灯效果&#xff0c;由暗变亮再由亮变暗&#xff1b; DAC介绍 简介 DAC&#xff08;Digital to analog converter&#xff09;即数字模拟转换器&#xff0c;它可以将数字信号转换为模拟信号&#xff0c;它的功能与ADC相反&#xff1b…

【Java设计模式】建造者模式 注解@Builder

概念 将一个复杂对象的构造与它的表示分离&#xff0c;使同样的构建过程可以创建不同的表示。它使将一个复杂的对象分解成多个简单的对象&#xff0c;然后一步步构建而成。 每一个具体建造者都相对独立&#xff0c;而与其它的具体建造者无关&#xff0c;因此可以很方便地替换具…

【HDFS】每天一个RPC系列----complete(二):客户端侧

上图给出了最终会调用到complete RPC的客户端侧方法链路(除去Router那条线了)。 org.apache.hadoop.hdfs.DFSOutputStream#completeFile(org.apache.hadoop.hdfs.protocol.ExtendedBlock): 下面这个方法在complete rpc返回true之前,会进行重试,直到超过最大重试次数抛异…

解决Element Plus中Select在El Dialog里层级过低的问题(修改select选项框样式)

Element Plus是Vue.js的一套基于Element UI的组件库&#xff0c;提供了丰富的组件用于构建现代化的Web应用程序。其中&#xff0c;<el-select>是一个常用的下拉选择器组件&#xff0c;但在某些情况下&#xff0c;当<el-select>组件嵌套在<el-dialog>&#xf…

Python web实战之Django的文件上传和处理详解

概要 关键词&#xff1a;Python Web开发、Django、文件上传、文件处理 今天分享一下Django的文件上传和处理。 1. 上传文件的基本原理 在开始深入讲解Django的文件上传和处理之前&#xff0c;先了解一下文件上传的基本原理。当用户选择要上传的文件后&#xff0c;该文件会被发…

Oracle-ORA-00600:[ktspffbmb:objdchk_kcbnew_3]

问题背景: 应用执行存储过程报错ORA-00600: 内部错误代码, 参数: [ktspffbmb:objdchk_kcbnew_3], [0], [3303775], [4], [], [], [], [], [], [], [], []&#xff0c;导致过程无法正常执行 ORA-00600: 内部错误代码, 参数: [ktspffbmb:objdchk_kcbnew_3], [0], [3303775], [4]…

关联字典表查询记录

字典表 也可以case gender when xxx then xxx when xxx then xxx end 别名 注意前面case别忘了 重新编辑了下 字典表 key value更加合理点吧 嘿嘿

【计算机视觉】关于图像处理的一些基本操作

目录 图像平滑滤波处理均值滤波计算过程python实现 高斯滤波计算过程python实现 中值滤波计算过程python实现 图像的边缘检测Robert算子计算过程python实现 图像处理腐蚀算子计算过程python实现 Hog&#xff08;梯度方向直方图&#xff09;特征计算流程&#xff1a;Hog的特征维…