Qt学习笔记第21到30讲

devtools/2024/10/21 23:36:46/

第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.ppmy.cn/devtools/127684.html

相关文章

JVM(HotSpot):直接内存及其使用建议

文章目录 一、什么是直接内存&#xff1f;二、特点三、使用案例四、直接内存的管理 一、什么是直接内存&#xff1f; Direct Memory&#xff1a;系统内存 普通IO&#xff0c;运行原理图 磁盘到系统内存&#xff0c;系统内存到jvm内存。 NIO&#xff0c;运行原理图 划分了一块…

spdlog学习记录

spdlog Loggers&#xff1a;是 Spdlog 最基本的组件&#xff0c;负责记录日志消息。在 Spdlog 中&#xff0c;一个 Logger 对象代表着一个日志记录器&#xff0c;应用程序可以使用 Logger 对象记录不同级别的日志消息Sinks&#xff1a;决定了日志消息的输出位置。在 Spdlog 中&…

01-编程入门

文章目录 Python学习方向什么是编程语言编程语言发展史Python环境安装 Python学习方向 爬虫工程师 ​ 爬虫-模拟用户向服务器发送请求–》爬取数据 ​ 1.娱乐数据、商业数据、付费数据。 ​ 2.搜索引擎&#xff08;百度、谷歌、搜狗&#xff0c;以及一些小网站内的搜索迎引擎&a…

windows免密ssh登录Linux

1.winr打开运行---- 输入&#xff1a;cmd&#xff08;命令提示符&#xff09; 查看系统是否自带openssh ssh -V 2.生成公钥私钥文件 ssh-keygen 3.进入秘钥存放目录 cd C:\Users\admin/.ssh/#查看秘钥文件 dir 4.将公钥文件长传至Linux服务器 scp .\id_rsa.pub root20.20.…

mysql设置远程连接

要使MySQL支持远程连接&#xff0c;需要进行以下操作&#xff1a; 修改MySQL配置文件&#xff08;通常是my.cn.cnf或my.ini&#xff09;&#xff0c;注释掉bind-address这一行&#xff0c;或者将其值设置为0.0.0.0&#xff0c;这样MySQL就能监听所有网络接口。 进入以下目录 …

互联网语言 互联网开发 互联网架构

JAVA和PHP是两种广泛应用于互联网开发的编程语言&#xff0c;它们在多个维度上展现出显著的不同。 JAVA是一种面向对象的编程语言&#xff0c;以其严谨、高效的特性而著称。JAVA的语法结构复杂且规范&#xff0c;强调封装、继承和多态等面向对象原则&#xff0c;适合构建大型企…

对BSV区块链下一代节点Teranode的答疑解惑(下篇)

​​发表时间&#xff1a;2024年8月7日 2024年初BSV区块链研发团队揭晓了即将到来的Teranode更新的突破性特性&#xff0c;这些特性将显著提升网络的效率和处理速度&#xff0c;使BSV区块链能够达到百万级TPS。 Teranode的项目主管Siggi Oskarsson强调&#xff1a;“当你阅读这…

2024JAVA面试题

一、JAVA基础 1、面向对象的三个基本特征&#xff1f; 面向对象的三个基本特征是&#xff1a;封装、继承和多态。 封装&#xff1a;隐藏部分对象的属性和实现细节&#xff0c;对数据的访问只能通过外公开的接口。通过这种方式&#xff0c;对象对内部数据提供了不同级别的保护…