C++和Qt

1.空类对象占内存大小

遵循字节对齐的原则

空类占的内存大小:1字节;目的:就是为了让你能够用它的成员函数!

class Demo

{

};

int main()

{

cout << sizeof(Demo) << endl;

return 0;

}

空类中有默认的6个成员函数:默认构造函数、析构函数、拷贝构造函数、=赋值运算符、&运算符、&运算符 const

只有当实际使用这些函数的时候,编译器才会去定义它们。


2.Explicit

作用:防止构造函数单参数时进行类型转换

class Deom

{

public:

explicit Demo(int _a =10 )

{

cout << "Demo(int)"<< endl;

this->a = _a;

};

int main()

{

cout << sizeof(Demo) << endl;

Demo demo_tmp = 10; //报错:不存在从“int”转换到“Demo”的适当构造函数

}

}

构造函数的分类:默认构造函数、拷贝构造函数、转换构造函数、普通构造函数(参数在2个或者2个以上的)

3.Final关键字

作用:就是用来修饰类以及类的成员函数的

特点:<1>final修饰类,这个类不能被继承

class Demo final

{

public:

explicit Demo(int _a = 10)

{

cout << "Demo(int)" << endl;

this->a = _a;

}

private:

int a;

};

class DemoA:Demo //报错:不能将final类类型用作基类

{

public:

explicit Demo

{

}

}

<2>final修饰虚函数的时候,虚函数是不可以被重写的!

virtual void show() final

{

cout << this->a <<endl;

}

private:

int a;

};

class DemoA:Demo

{

public:

//类型转换构造函数

DemoA(int _a = 10, int _b = 10):Demo(a)

{

cout << "Demo(int)" <<endl;

this->b = _a;

}

void show() //子类中如何调用从父类继承来的同名函数

//无法重写“final函数”Demo:show(已声明所在行数)

{

DemoA

}

}

4.Inline关键字

作用:用来修饰函数,类的成员函数用inline,变成了内联函数!

内联函数的设计的规则:

  1. 代码量少---3~5行

  1. 逻辑简单:while、for等语句

  1. 频繁使用的

为什么要设计内联函数?

调用函数要进行出入栈,出入栈就需要时间,也会占内存的开销。

如何发挥作用的:

调用函数的地方,把函数体在调用的地方直接展开去执行!

注意: 不是说你把函数写成内联函数,编译器就会按内联去处理;编译器会自己进行评估;

其实内联函数的设计是对编译器的建议!

宏函数: #define MIN(x,y) ((x)<(y) ? (x):(y))

本质是宏,只不过可以实现和函数一样的效果!在编译阶段就会进行文本的替换!要注意每一部分都要用括号括起来!形参类型按文本类型处理的!

面试题目:内联函数与宏函数的区别?

宏函数:是宏 文本替换 参数都按文本类型处理 不进行类型检查

内联函数:是函数 替换 形参是有确定类型的,在使用的时候需要什么类型就要给什么类型的数据! 会进行类型检查

其实内联函数就是对宏函数的优化!

5.类型转换函数

C中的类型转换方式:

<1>隐式类型转换

<2>强制类型转换 (类型)表达式 类型(表达式)

C++中的类型转换函数---函数模板

const强转成非const;类似于我们c中的强制类型转换 父与子之间的转换

代码:

int main()

{

struct T

{

int i;

};

const T a; //a是不可以改变的

//a.i = 10;

T&b = const cast<T&>(a); //const_cast<T&>函数模板

b.i=10;

cout << a.i <<endl;

}

6.异常处理

什么是异常:

编码过程中遇到的报错!

编码过程中遇到的错误:

  1. 编译错误(语法错误)

  1. 运行时错误(逻辑错误):数组越界、野指针、打开文件失败、动态开空间、打开数据库等等!

避免逻辑错误:

用返回值来做判断!

C++中引入了专门处理异常的机制:

Try{可能会出现异常的代码}

Catch(异常类型){捕获异常} catch(){}

throw 来抛出异常的!

除法: 分母不能0

特性:

  1. 抛出各种类型的异常,自定义的也有系统提供的类型

  1. 跨级处理异常

  1. 三个关键字:try、throw、catch

7.智能指针--模板

问题: 解决new出来忘记做delete的释放造成内存泄漏的问题!

{

int *p = new int;

//p保存堆区的地址,p的声明周期在{}结束的时候就被系统回收,此时p指向的堆区的空间没有被释放,就会有内存泄露问题

}

解决:C++中提供了智能指针

智能指针有3种

共享智能指针 shared_ptr

独享智能指针 unique_ptr

弱型智能指针 week_ptr

画图分析:

8.单例模式--数据库

单例:单个实例 一个类只能实例化一个对象!

思考:怎么保证一个类只能创建一个对象呢?也就是说唯一的对象由谁去创建?

创建对象的目的:使用,外部要获取到唯一的对象

单例设计的三大特性:

  1. 唯一的对象由这个类它自己去创建;构造函数私有化

  1. 提供静态的成员函数去获取到唯一的对象

  1. 静态的数据成员来保存唯一的对象

单例模式又分为两种:

懒汉模式:

需要的时候才去准备的;

问题:多线程使用的时候,有可能都会去创建对象!

饿汉模式:

一开始就准备好了,以防万一!存在的问题:万一没有用到了的话,也开辟了空间!

应用场景:

  1. 任务管理器

  1. 数据库在一个项目中只要打开一次就可以了等!

代码来实现下单例—数据库的操

Day1

  1. QT介绍

1-1、什么是QT以及优势

QT的应用:

WPS、咪咕音乐、塞班系统、飞车等

嵌入式产品:

车载系统—行车记录仪、KTV点歌系统、音乐播放器、智能手环、美图秀秀等等!

1-2、学什么:

学习API的应用:250个以上的类的使用

1-3、怎么学:

案例驱动

1-4、学习思路流程:

分析实现的功能需要什么工具:

步骤是什么样:中文的思路写出来

根据步骤一步一步的去找合适的类,查看类中的成员函数,选择合适的方法

使用:创建对象、调用函数即可

资料的查找的能力

  1. Qt第一个工程的创建+工程里面文件的介绍

2-1、Qt工程的创建:

QWidget是一个空白的窗口。

2-1、QT工程中文件的说明:

QWidget

QApplication

  1. qt中的三大护法:

QApplication: 控制程序的执行流程

QWidget: 界面类的父类—绘制界面的

QLayout: 布局管理:用来管理界面中所有的组件的摆放位置的

分为:绝对局部、相对布局

4、打印追踪

QDebug qDebug() <<需要输出的内容;

可以帮我们定位问题!!!

  1. Qt的核心机制:信号和槽

作用:实现对象与对象之间的通信

5-1、案例实现: hello world

需求:当点击一个按钮的时候,在文本框中显示hello world

分析:按钮、文本框

找: QPushButton、QLabel、QLineEdit、QTextEdit

用: 创建对象

如何知道按钮被点击了呢?Qt核心机制:信号和槽

信号:

在类里面有专门的信号的声明区:signals

按钮被点击,就会产生信号; void clicked(bool checked = false);

信号被捕获到,就可以执行对应的业务处理—设置文本框的内容为hello world

槽函数:执行按钮对应的业务处理

在类里面有专门的槽函数的声明区:public slots:

如何把信号和槽关联起来:

connect(信号的发送者,信号,信号的接受者, 槽函数);

信号与槽一定要做关联

使用UI的方式绘制界面步骤:

  1. 拖拽控件,组成界面

  1. 修改每一个对象的名字

  1. 运行,查看界面是否ok

  1. 按钮转到槽函数:思考槽函数里面做什么事情

  1. 把步骤写出来

总结一下用到的类:

QPushButton setText setParent、move、resize、 setGeometry

clicked

QTextEdit setText setGeometry、clear

QTextBrowser setText clear

实际生活中的例子:红绿灯以及红绿灯下的人

5-2、计算器的实现

总结用到的类:

QLineEdit text()、clear()

QPushButton clicked()信号

QComboBox setGeometry() addItems()、currentText()、

QStringList <<

QString toDouble()—QString转成double

number()—静态的成员函数:把数值类型转成QString类型

QMessageBox 静态的成员函数 warning()

QApplication exec()

QDebug qDebug() <<

练习:

1、完成简易版的计算器: +、-、/、*, 录一个小视频发群里

2、绘制一个登录界面: 可以输入用户名,密码也可以输入—密码是密文!

全部都要录视频发班级群

作业:

  1. 整理笔记,除了知识点之外,在思维导图中把今天用到的所有的类都列出来,以及每一个类中用到的成员函数写出来,以及它的作用都标出来!

截图发班级群

  1. 完成注册、登录功能的实现!--提供工程

  1. 课堂上的案例:都去敲,一种用UI一种使用纯代码去实现!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个简单的黄金矿工游戏的 C++/Qt 代码。请注意,这只是一个基本的代码示例,需要根据您的需求进行修改和扩展。 ```c++ #include <QApplication> #include <QGraphicsScene> #include <QGraphicsView> #include <QGraphicsPixmapItem> #include <QTimer> #include <QKeyEvent> #include <QList> class GoldMiner : public QGraphicsView { public: GoldMiner(QWidget* parent = 0); void keyPressEvent(QKeyEvent* event); void spawnGold(); private: QGraphicsScene* scene; QGraphicsPixmapItem* player; }; GoldMiner::GoldMiner(QWidget* parent) : QGraphicsView(parent) { // Create the scene scene = new QGraphicsScene(this); scene->setSceneRect(0, 0, 800, 600); setScene(scene); // Set the background image QPixmap background(":/images/background.jpg"); scene->setBackgroundBrush(background.scaled(800, 600)); // Create the player player = new QGraphicsPixmapItem(QPixmap(":/images/player.png")); player->setPos(400, 550); scene->addItem(player); // Set the focus to the player so we can capture key events player->setFlag(QGraphicsItem::ItemIsFocusable); player->setFocus(); // Set up the timer to spawn gold QTimer* timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(spawnGold())); timer->start(2000); // Show the view show(); } void GoldMiner::keyPressEvent(QKeyEvent* event) { // Move the player left or right switch (event->key()) { case Qt::Key_Left: if (player->x() > 0) { player->setPos(player->x() - 10, player->y()); } break; case Qt::Key_Right: if (player->x() + player->pixmap().width() < scene->width()) { player->setPos(player->x() + 10, player->y()); } break; default: break; } } void GoldMiner::spawnGold() { // Create a new gold item QGraphicsPixmapItem* gold = new QGraphicsPixmapItem(QPixmap(":/images/gold.png")); gold->setPos(qrand() % 800, 0); scene->addItem(gold); // Move the gold item down the screen QList<QGraphicsItem*> items = scene->items(); for (int i = 0; i < items.size(); i++) { if (items[i] == gold) { QGraphicsItemAnimation* animation = new QGraphicsItemAnimation; animation->setItem(gold); QPropertyAnimation* anim = new QPropertyAnimation(animation, "pos"); anim->setDuration(2000); anim->setStartValue(gold->pos()); anim->setEndValue(QPointF(gold->x(), scene->height() - gold->pixmap().height())); animation->setTimeLine(anim); anim->start(QAbstractAnimation::DeleteWhenStopped); break; } } } int main(int argc, char *argv[]) { QApplication app(argc, argv); GoldMiner game; return app.exec(); } ``` 这段代码使用 Qt 框架创建了一个简单的黄金矿工游戏。游戏中的玩家可以通过左右箭头键来移动,并且需要在屏幕上收集黄金。游戏每隔 2 秒就会生成一个新的黄金项,并将其向下移动。该代码还包括一些基本的动画效果,使得收集黄金的过程看起来更加流畅。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值