Qt学习笔记第21到30讲

news2024/10/21 22:37:16

第21讲 new/delete关键字

new关键字   

C++ 中, new 关键字用于动态分配内存。它是 C++ 中处理动态内存分配的主要工具之一,允许在程序运行时根据需要分配内存。

用法

①分配单个对象:使用 new 可以在堆上动态分配一个对象。例如, new int 会分配一个 int 类型的空间,并返回一个指向该空间的指针。

   int* ptr = new int; //C语言中,int *p = (int *)malloc(sizeof(int));
   cout<<sizeof (*ptr)<<endl;

分配对象数组new 也可以用来分配一个对象数组。例如, new int[10] 会分配一个包含10个整数的数组。

   int *arr=new int[10];
   arr[0]=0;

初始化:可以在 new 表达式中使用初始化。对于单个对象,可以使用构造函数的参数:

语法:

MyClass* obj = new MyClass(arg1, arg2);

示例:

#include <iostream>
#include <string.h>

using namespace std;

class Person
{
  private:
    string name;
    int    age;
  public:
    void printInfo(void);

    Person(string myName,int myAge)
    {
        this->name=myName;
        this->age=myAge;

    }
};

void Person::printInfo(void)
{
    cout<<"person's name:"<<this->name<<endl;
    cout<<"person's age:"<<this->age<<endl;
}

int main()
{
    Person* p1=new Person("Mike",18);
    (*p1).printInfo();



   return 0;
}

delete关键字

使用 new 分配的内存必须显式地通过 delete (对于单个对象)或 delete[] (对于数组)来释放,以避免内存泄露。

用法

①释放单个对象

delete ptr; // 释放 ptr 指向的对象

示例:

int main()
{
    Person* p1=new Person("Mike",18);
    (*p1).printInfo();
    delete p1;

   return 0;
}

②释放数组

delete[] arr; // 释放 arr 指向的数组

示例:

   int *arr=new int[10];
   delete[] arr;

注意事项

异常安全 :如果 new 分配内存失败,它会抛出 std::bad_alloc 异常(除非使用了 nothrow 版本 )。
内存泄露 :忘记释放使用 new 分配的内存会导致内存泄露。
匹配使用 delete delete[ ] :为避免未定义行为,使用 new 分配的单个对象应该使用
delete 释放,使用 new[ ] 分配的数组应该使用 delete[ ] 释放。

第22\23讲 拷贝构造函数与析构函数

参考拙作:C++语法补习课——对象特性-CSDN博客

第24讲 静态成员

定义

静态成员在 C++ 类中是一个重要的概念,它包括静态成员变量和静态成员函数。静态成员的特点和存在的意义如下:

静态成员变量

1. 定义 :静态成员变量是类的所有对象共享的变量。与普通成员变量相比,无论创建了多少个类的实例,静态成员变量只有一份拷贝。
2. 初始化 :静态成员变量需要在类外进行初始化,通常在类的实现文件中。
3. 访问 :静态成员变量可以通过类名直接访问,不需要创建类的对象。也可以通过类的对象访问。
4. 用途 :常用于存储类级别的信息(例如,计数类的实例数量)或全局数据需要被类的所有实例共
享。
示例代码:
#include <iostream>

using namespace std;

class MyClass{
public:
    static int staticValue;

    MyClass()
    {
        staticValue++;
    }

    static int getValue()
    {
        return staticValue;
    }

};

//静态成员需要在类的外部实现初始化
int MyClass::staticValue=100;

int main()
{
    //静态成员变量可以通过类名直接访问,不需要创建类的对象
    cout<<"staticValue="<<MyClass::staticValue<<endl;
    return 0;
}

静态成员函数

1. 定义 :静态成员函数是可以不依赖于类的实例而被调用的函数。它不能访问类的非静态成员变量和非静态成员函数。
2. 访问 :类似于静态成员变量,静态成员函数可以通过类名直接调用,也可以通过类的实例调用。
3. 用途 :常用于实现与具体对象无关的功能,或访问静态成员变量。
#include <iostream>

using namespace std;

class MyClass{
public:
    static int staticValue;
    int datas;

    //静态成员函数在对象实例化之前就已经存在
    static int getValue()
    {
        //datas作为普通成员变量需要实例化对象后才可以进行操作
        //datas++;
        return staticValue;
    }

};

//静态成员需要在类的外部实现初始化
int MyClass::staticValue=100;

//更多时刻,静态成员变量的作用是在不同类之间数据共享
class HisClass{
public:
    static void printInfo()
    {
        printf("staticValue=%d\n",MyClass::staticValue);
    }

};


int main()
{
    //静态成员变量可以通过类名直接访问,不需要创建类的对象
    cout<<"staticValue="<<MyClass::staticValue<<endl;
    int newValue=MyClass::staticValue+100;
    cout<<"newValue="<<newValue<<endl;
    HisClass::printInfo();

    return 0;
}

重要用法

静态成员的一个重要作用是帮助我们获取实例化对象的数量。
#include <iostream>

using namespace std;

class MyClass{
public:
    static int numofInstance;

    MyClass()
    {
        numofInstance++;
    }

    static int getNumofInstance()
    {
        return  numofInstance;
    }
};

int MyClass::numofInstance=0;

int main()
{
   MyClass member1;
   MyClass member2;
   MyClass member3;

   cout<<"Number of Instance:"<<MyClass::getNumofInstance()<<endl;
}

输出结果:

另外实例化的对象在程序运行超出作用域时会被自动销毁,如同下例:
#include <iostream>

using namespace std;

class MyClass{
public:
    static int numofInstance;

    MyClass()
    {
        numofInstance++;
    }

    ~MyClass()
    {
        numofInstance--;
    }

    static int getNumofInstance()
    {
        return  numofInstance;
    }
};

int MyClass::numofInstance=0;

int main()
{
   MyClass member1;
   MyClass member2;
   MyClass member3;

   cout<<"Number of Instance:"<<MyClass::getNumofInstance()<<endl;

   {
       MyClass m4;
       cout <<"Number of Instance:"<< MyClass::getNumofInstance() << endl;
       MyClass m5;
       cout <<"Number of Instance:"<< MyClass::getNumofInstance() << endl;
   }

   MyClass *mem=new MyClass;
   cout<<"Number of Instance:"<<MyClass::getNumofInstance()<<endl;
   delete mem;

   cout<<"Number of Instance:"<<MyClass::getNumofInstance()<<endl;


   system("pause");
   return 0;
}

输出结果为:

可以看到m4与m5在超出作用域后就被程序销毁。

第25讲 继承

基本概念

继承是面向对象编程( OOP )中的一个核心概念,特别是在 C++ 中。它允许一个类(称为派生类或子类)继承另一个类(称为基类或父类)的属性和方法。继承的主要目的是实现代码重用,以及建立一种类型之间的层次关系。

特点

1.代码重用 :子类继承了父类的属性和方法,减少了代码的重复编写。
2. 扩展性:子类可以扩展父类的功能,添加新的属性和方法,或者重写(覆盖)现有的方法。
3. 多态性 :通过继承和虚函数, C++ 支持多态,允许在运行时决定调用哪个函数。

代码示例

基本语法B继承A
class 派生类\子类B : [权限声明] 基类\父类A

备注:权限声明是指private、public或者protected。

#include <iostream>
#include <string.h>
using namespace std;

class Vehicle
{
  public:
  string type;
  string country;
  string colour;
  double price;
  int    numofVehicle;

  void run()
  {
      cout<<Vehicle::type<<"正在行驶..."<<endl;
  }
  void stop();

};

class Roadster :public Vehicle
{
    public:

    void openTopped();
    void pdrifting();

};

class Motobike :public Vehicle
{
  public:
    void charge();

};


int main()
{
    Roadster fType;
    fType.type="捷豹";
    fType.run();

    Motobike aType;
    aType.type="铃木";
    aType.run();

    return 0;
}

输出结果:

可见,Roadster与Motorbike这两个子类都继承了Vehicle这个父类的run方法。

第26讲 继承分文件实现

Qt的分文件操作

①右击项目文件夹,Add new...

②选择C++ Class

③设置文件名称和存储路径,编译器会成对地提供与类名相同地.cpp文件与.h文件

④头文件中我们先声明想要添加的成员属性,然后右键Refactor->在.cpp文件中添加定义

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

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

相关文章

面向对象进阶(上)(JAVA笔记第二十二期)

p.s.这是萌新自己自学总结的笔记&#xff0c;如果想学习得更透彻的话还是请去看大佬的讲解 目录 static修饰符静态变量静态方法 工具类工具类的使用例子第一题第二题 static注意事项继承关系建立继承关系的格式继承的好处及使用场景继承的特点继承体系的设计继承中类的三大要素…

JavaWeb 22.Node.js_简介和安装

有时候&#xff0c;后退原来是向前 —— 24.10.7 一、什么是Node.js Node.js 是一个于 Chrome V8 的 JavaScript 运行时环境&#xff0c;可以使 JavaScript 运行在服务器端。使用 Node.js&#xff0c;可以方便地开发服务器端应用程序&#xff0c;如 Web 应用、API、后端服务&a…

使用Three.js和Force-Directed Graph实现3D知识图谱可视化

先看样式&#xff1a; 在当今信息爆炸的时代&#xff0c;如何有效地组织和展示复杂的知识结构成为一个重要的挑战。3D知识图谱可视化是一种直观、交互性强的方式来呈现知识之间的关系。本文将详细介绍如何使用HTML、JavaScript、Three.js和Force-Directed Graph库来实现一个交互…

基于SpringBoot+Vue+uniapp微信小程序的社区门诊管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

解决:YOLOv8训练数据集时P、R、mAP等值均为0的问题

文章目录 问题解决1.匹配pytorch与cuda的版本2.使用 Adam 优化器3.加大训练轮数epoch4. 删除data/labels下的train.cache和val.cache 问题 使用YOLOv8训练自己的数据集时&#xff0c;出现P、R、mAP等值均为0的问题 Model summary (fused): 186 layers, 2,685,733 parameters, …

【 Git 】git push 出现报错 fatal: Could not read from remote repository.

git push 出现报错 fatal: Could not read from remote repository. 问题描述解决方案 问题描述 Connection closed by 198.18.0.xx port xx fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository exists.解…

【JavaScript】Javascript基础Day04:函数

Javascript——Day04 01. 函数的基本使用02. 函数的参数以及默认参数03. 匿名函数之函数表达式04. 逻辑中断05. 转换为布尔型 01. 函数的基本使用 02. 函数的参数以及默认参数 注意&#xff1a; 03. 匿名函数之函数表达式 函数&#xff1a;匿名函数/具名函数 为什么这个外部…

【wpf】07 后端验证及令牌码获取步骤

由于在用wpf开发应用程序时&#xff0c;从后端获取数据需要用到 Authorization 授权的Bearer令牌&#xff0c;而这个令牌的获取需要登录后台进行获取&#xff0c;这里登录时还涉及到的验证码的操作&#xff0c;所以在获取过程中&#xff0c;需要对后台系统进行登录并拿到这个Be…

【天池比赛】【零基础入门金融风控 Task2赛题理解】【2.3.6】

【天池比赛】【零基础入门金融风控 Task2赛题理解】【2.3.1-2.3.5】 2.3.6 变量分布可视化 2.3.6.1 单一变量分布可视化 对于 pandas.core.series.Series 类型的变量&#xff1a; index&#xff1a;含义&#xff1a;它表示 Series 对象的索引&#xff0c;也就是每个数据点对…

智能手表核心芯片~手表心率监测芯片AFE4900浅析(附一篇智能手表专利推荐)

智能手表核心芯片~手表心率监测芯片AFE4900浅析(附一篇智能手表专利推荐) 本期是平台君和您分享的第89期内容 2024年8月,安徽华米信息技术及美国的智能手表品牌ZEPP公司在美国对深圳思佰特公司提起诉讼,涉及专利、商标和不正当竞争。 起诉书(来源:RPX网站) 看到这则新闻…

面试官:并发时,故意不加锁会怎么样?

感谢Java面试教程关于并发锁的面试分享 在并发编程中&#xff0c;如果不加锁&#xff0c;可能会导致以下问题&#xff1a; 数据不一致&#xff1a;多个线程同时访问和修改共享资源时&#xff0c;如果没有加锁&#xff0c;可能会导致数据竞争&#xff0c;即一个线程在读取数据…

Maven入门到进阶:构建、依赖与插件管理详解

文章目录 一、Maven介绍1、什么是Maven2、Maven的核心功能 二、Maven核心概念1、坐标GAVP1.1、GroupId1.2、ArtifactId1.3、Version1.3.1、版本号的组成 1.4、Packaging 2、POM、父POM和超级POM2.1、POM (Project Object Model)2.1、父POM&#xff08;Parent POM&#xff09;2.…

算法的学习笔记—丑数(牛客JZ49)

&#x1f600;前言 在程序设计和算法竞赛中&#xff0c;丑数问题是一个经典的动态规划题目。丑数&#xff08;Ugly Number&#xff09;定义为只包含质因子 2、3 和 5 的数。举例来说&#xff0c;数字 6&#xff08;因子为 2 和 3&#xff09;、数字 8&#xff08;因子为 2&…

gewechat免费开源微信机器人开发

​聊天机器人&#xff0c;是一种通过自然语言模拟人类进行对话的程序。通常运行在特定的软件平台上&#xff0c;如PC平台或者移动终端设备平台。聊天机器人系统的主要功能是同用户进行基本沟通并自动回复用户有关产品或服务的问题&#xff0c;以实现降低企业客服运营成本、提升…

珊瑚岛风灵月影四十九项修改器:体力不减/生命不减/开启金钱修改

珊瑚岛是一款以模拟经营岛屿为特色的休闲养成游戏。在游戏中&#xff0c;玩家需设法吸引顾客消费。同时&#xff0c;还需投入时间和资源修复遗址&#xff0c;过程中或会遇到技术、资金及文化保护等挑战&#xff0c;增添游戏趣味与深度。 修改器地址&#xff1a; https://downf…

力扣——链表的中间结点(链表)C语言

题目&#xff1a; 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点。 返回中间3这个结点&#xff1b; 返回中4这个结点&#xff1b; 原理&#xff1a; 思路1&#xff1a;利用遍历链表&#xff0c;统…

图文深入理解java的内存分配

本篇图文深入讨论java的内存分配。当然&#xff0c;这里所说的深入&#xff0c;并不是指长篇大论&#xff0c;而是就事论事重点深入介绍java的内存分配原理机制。 在理解java如何为变量或者对象分配内存之前&#xff0c;我们先来了解一个问题&#xff1a;为什么需要分配内存&am…

新电脑Win11家庭中文版跳过联网激活方法(教程)

预装Win11家庭中文版的新电脑&#xff0c;如何跳过联网激活&#xff1b;由于微软限制必须要联网激活&#xff0c;需要使用已有的微软账户登入或者注册新的微软账户后才可以继续开机使用&#xff0c;Win11联网后系统会自动激活。下面介绍一下初次开机初始化电脑时如何跳过联网激…

今年双十一最值得入手的好物有哪些?双十一值得选购的好物盘点!

在这个全民狂欢的购物盛宴——双十一&#xff0c;每一个角落都弥漫着诱人的优惠与不可错过的精品。从科技潮品到生活必需品&#xff0c;从时尚尖货到家居好物&#xff0c;无数精选商品在这一季集中绽放&#xff0c;等待着慧眼识珠的你将它们带回家&#xff0c;今年的双十一&…

除GOF23种设计模式之简单工厂模式

文章目录 1. 简介2. 代码2.1 抽象类&#xff1a;Course.java2.2 产品A:JavaCourse.java2.3 产品B:PythonCourse.java2.4 工厂:CourseFactory.java2.5 测试&#xff1a;Test.java 3. 心得参考链接&#xff08;无&#xff09; 1. 简介 简单工厂模式(Simple Factory Patern):又称…