C++和QT

引用

概念

引用是个别名

格式

数据类型 &引用名 = 同类型的变量名 (&引用符号)

 数据类型 &引用名 = 同类型的变量名 (&引用符号)int a = 10;int &b = a; //给a取个别名叫b, b引用a

数组引用

    int a;a=10;int &b = a;cout << a << " " << b << endl;b=20;cout << a << " " << b << endl;int arr[5] = {10,20,30,40,50};int (*p)[5] = &arr;int (&str)[5] = arr;cout << arr[3] << " " << str[3] << endl;cout << (*p)[3] << endl;cout << &arr << endl;

函数引用

int max(int a,int b)
{return a>b?a:b;
}
int main()
{int (*p)(int,int) = max;int (&fun)(int,int) = max;cout << p(13,32) << endl;cout << fun(12,53) << endl;return 0;
}

当结构体中有引用成员时

当结构体中有引用成员,使用该结构体类型,定义结构体变量时,就必须定义的同时初始化,就不可以先定义,后赋值。

struct student
{string name;int age;double &score;
};int main()
{double a;cout << "请输入" << endl;cin >> a;struct student stu = {"zhang",10,a};stu.name = "zhang";cout << stu.name << " " << stu.age << " " << stu.score << endl;return 0;
}

值传递,地址传递,引用传递

值传递:一定不改变原值

地址传递:可能改变原值

引用传递:可能改变原值

space std;void fun(int a, int b)// int a = a
{a++;b++;
}void fun2(int *a, int *b) //int *a = &a
{*a++;*b++;
}void fun3(int &a, int &b)//int &a = a, int &b = b
{int c = a;b++;
}int main()
{int a = 10, b = 20;fun(a,b); //传值,一定不会改变目标的值cout << "main: a = " << a << " b = " << b << endl;fun2(&a, &b); //传址,可能会改变目标的值,具体看代码设计cout << "main: a = " << a << " b = " << b << endl;fun3(a,b);//传引用,可能会改变目标的值,具体看代码设计cout << "main: a = " << a << " b = " << b << endl;return 0;
}

当引用作为函数的返回值的时候

要求返回的变量生命周期足够的长(static修饰或者malloc申请空间)

指针和引用的区别

指针和引用都可以修改变量的值,但本质不同:指针是通过地址改变目标的值,而引用就是目标本身

指针:

  1. 存储地址的变量
  2. 可以先定义,后指向
  3. 可以改变指向
  4. 定义指针需要重新申请空间
  5. 有指针数组
  6. 有多级指针

引用:

  1. 引用是个别名
  2. 必须定义的同时初始化
  3. 指针可以改变指向,而引用一旦指定目标,就不能被改变
  4. 定义引用不用重新申请空间
  5. 没有引用数组(引用不是数据类型)
  6. 没有二级引用

const

const修饰的为只读变量,也成为常变量

const修饰的局部变量在栈区,const修饰的全局变量在静态区的.ro段

const修饰的变量必须在定义的同时初始化

如果想要引用常变量,需要常引用(const int &b = a)

函数重载

概念

在同一个作用域下,两个以上的函数,取相同的函数名,其函数的形参类型或者形参个数不同,编译器会根据实参的参数类型或者个数自动调用匹配的函数,这就是函数重载。

注:返回值类型不同不算重载

例如以下三个函数为重载

int task(int x)
{}int task(char x)
{}
int task(int x,int b)
{}

使用函数重载实现不同数据类型之和

#include <iostream>using namespace std;int add(int x, int y)
{return x+y;
}double add(double x, double y)
{return x+y;
}int add(char x, char y)
{return x+y;
}string add(string x, string y)
{return x+y;
}int main()
{cout << add(1,2) << endl;cout << add(1.24, 4.56) << endl;cout << add('a', '1') << endl;cout << add("hello", "world") << endl;return 0;
}

带有默认参数的函数定义和使用

#include <iostream>using namespace std;void fun(string name = "kity")
{cout << name << endl;
}
int main()
{fun();fun("hello");return 0;
}

哑元(了解)

函数在定义形参时,只定义形参类型,不定义形参名,在函数中也不使用。

作用:没有作用,占位。

内联函数

在函数前面加上inline关键字,那么该函数就是内联函数

要求:

  1. 函数的体积要小(代码一般不超过5行)
  2. 函数不能有复杂语句(循环,递归)

作用:提高代码的运行效率

原因:内联函数在编译时展开

内敛函数和带参宏的区别

内联函数:

  1. 编译时展开
  2. 内联函数时函数调用

带参宏:

  1. 预处理时打开
  2. 带参宏是替换

C++中的结构体

C++中结构体和C语言中结构体的区别

C语言中的结构体在C++中依然适用

C++:

  1. 可以在定义结构体的时候赋初始值
  2. 结构体中可以有函数
  3. 在使用结构体类型定义变量时可以省略关键字struct
  4. 结构体的成员有访问权限
  5. 结构体有继承
  6. 结构体有特殊的成员函数

C语言:

  1. 定义结构体时不能赋初始值
  2. 结构体中不能有函数
  3. 在使用结构体类型定义变量时不可以省略关键字struct
  4. 结构体成员没有访问权限
  5. 结构体不能继承
  6. 及沟通中没有特殊的成员函数

*C++中结构体名一般首字母大写

概念

C++中的类由C++中的结构体演变而来,只是默认的访问权限默认的继承方式,以及关键字不同,其他都相同。

一般构造数据类型中既有变量又有函数的类型,由类来完成。

C++中结构体和类的区别

默认访问权限:

C++中结构体的默认访问权限是:public共有的

C++中类的默认访问权限是:private共有的

默认继承方式:

C++中结构体的默认继承方式是:public共有的

C++中类的默认继承方式是:private共有的

关键字:

C++结构体:struct

C++类:class

访问权限:public共有的,private共有的,protected保护的

格式

class 类名
{public:公共的数据成员、成员函数protected:受保护的数据成员,成员函数private:私有的数据成员,成员函数
};

访问权限的介绍

public:共有权限,表示该权限下的成员,表示该权限的属性(变量),方法(函数)在类内,子类,类外都能访问。

protected:该权限是受保护权限,表示该权限下的属性(变量)、方法(函数),在类内、子类可以被访问,而类外不能被访问。

private:该权限是私有权限,该权限下的属性(变量)、方法(函数),只能在类内被访问,子类、类外不可以被访问。

封装

类的三大属性:封装、继承、多态

封装:写一个类的过程,就是将数据和对数据的处理捆绑在一起的过程。

属性 + 方法

变量 + 函数

相关名称: 类内都可以成为成员,而成员可以具体分为 数据成员、成员函数。

#include <iostream>using namespace std;//封装一个 学生 类
class Stu
{int a; //默认私有访问权限
private:string name;
protected:int age;
public:double score;public:dan

当成员函数的形参名和数据成员同名时

表明该数据成员属于哪个类,即加上类名和作用域限定符。

类里的每个非静态成员函数,都隐藏了一个this指针形参。

this指针

类里的每个非静态成员函数,都隐藏了一个this指针形参。

谁使用我,我就指向谁。

this指针的原型:

eg : Stu * const this; //指向不可变,指向里的值可变

类外定义成员函数

在类内声明函数

在类外定义成员函数,需要表明该函数属于哪个类的,即加上类名和作用域限定符

#include <iostream>using namespace std;//封装一个 学生 类
class Stu
{int a; //默认私有访问权限
private:string name;
protected:int age;
public:double score;public:;void init(string n, int a, double s);void show();
};//在类外定义成员函数
void Stu::init(string name, int age, double score) // Stu * const this
{this->name = name;this->age = age;this->score = score;//this = nullptr; // NULL  this指针使用过程中 指向不可变
}void Stu::show()
{cout << this << endl;cout << name << endl; //类内可以访问私有成员cout << age << endl; //类内可以访问受保护成员cout << score << endl; //类内可以访问共有成员
}int main()
{//使用学生这样的类 实例化一个学生对象Stu s1;//s1.name = "张三"; //类外不可以访问私有成员//s1.age = 20; //类外不可以访问受保护成员s1.score = 99; //类外可以访问公共的成员s1.init("张三", 32, 78);s1.show();return 0;
}

练习

自己封装一个矩形类(Rect),拥有私有属性:宽度(width)、高度(height),

定义公有成员函数:

初始化函数:void init(int w, int h)

更改宽度的函数:set_w(int w)

更改高度的函数:set_h(int h)

输出该矩形的周长和面积函数:void show()

#include <iostream>using namespace std;//封装一个矩形类
class Rect
{
private:int width;int height;
public:;void init(int w,int h);void set_w(int w);void set_h(int h);void show();
};//在类外定义成员函数
void Rect::init(int w,int h)
{this->width = w;this->height = h;
}void Rect::set_w(int w)
{this->width = w;
}void Rect::set_h(int h)
{this->height = h;
}void Rect::show()
{cout << "面积:" << width*height << endl;cout << "周长:" << 2*width+2*height << endl;
}int main()
{Rect s1;s1.init(4,5);s1.show();return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI绘画】Midjourney前置指令/describe、/shorten详解

文章目录 &#x1f4af;前言&#x1f4af;Midjourney前置指令/describe使用方法1️⃣2️⃣3️⃣4️⃣&#xff08;选择对应提示词生成图片&#xff09;&#x1f504;&#xff08;重新识别生成提示词&#xff09;&#x1f389;Imagine all&#xff08;一次性生成所有&#xff09…

BERT:Pre-training of Deep Bidirectional Transformers forLanguage Understanding

个人觉着BERT是一篇读起来很爽的论文 摘要 我们引入了一种新的语言表示模型BERT&#xff0c;它代表Bidirectional Encoder Representations from Transformers。与最近的语言表示模型不同(Peters et al.&#xff0c; 2018a;Radford et al.&#xff0c; 2018)&#xff0c; BER…

Prometheus+Grafana的安装和入门

概念 什么是Prometheus? Prometheus受启发于Google的Brogmon监控系统&#xff08;相似kubernetes是从Brog系统演变而来&#xff09;&#xff0c; 从2012年开始由google工程师Soundclouds使用Go语言开发的开源监控报警系统和时序列数据库(TSDB)。&#xff0c;并且与2015年早起…

使用LinkedHashMap实现固定大小的LRU缓存

使用LinkedHashMap实现固定大小的LRU缓存 1. 什么是LRU&#xff1f; LRU是"Least Recently Used"的缩写&#xff0c;意为"最近最少使用"。LRU缓存是一种常用的缓存淘汰算法&#xff0c;它的核心思想是&#xff1a;当缓存满时&#xff0c;优先淘汰最近最少…

18959 二叉树的之字形遍历

### 思路 1. **输入读取**&#xff1a; - 读取输入字符串&#xff0c;表示完全二叉树的顺序存储结构。 2. **构建二叉树**&#xff1a; - 使用队列构建二叉树&#xff0c;按层次顺序插入节点。 3. **之字形层序遍历**&#xff1a; - 使用双端队列进行层序遍历&…

【开端】基于nginx部署的具有网关的web日志分析

一、绪论 基于nginx部署的具有网关的web日志分析&#xff0c;我们可以分析的日志有nginx的access.log &#xff0c;网关的日志和应用的日志 二、日志分析 1、nginx日志 参数 说明 示例 $remote_addr 客户端地址 172.17.0.1 $remote_user 客户端用户名称 -- $time_lo…

简化WPF开发:CommunityToolkit.Mvvm在MVVM架构中的实践与优势

文章目录 前言一、CommunityToolkit.Mvvm1.特点2.优点3.缺点 二、WPF项目应用1.引入到 WPF 项目2.使用示例 总结 前言 CommunityToolkit.Mvvm 是 Microsoft 提供的一个社区工具包&#xff0c;专为 MVVM&#xff08;Model-View-ViewModel&#xff09;模式设计&#xff0c;旨在帮…

RabbitMQ练习(Topics)

1、RabbitMQ教程 《RabbitMQ Tutorials》https://www.rabbitmq.com/tutorials 2、环境准备 参考&#xff1a;《RabbitMQ练习&#xff08;Hello World&#xff09;》和《RabbitMQ练习&#xff08;Work Queues&#xff09;》。 确保RabbitMQ、Sender、Receiver、Receiver2容器…

“重启就能解决一切问题”,iPhone重启方法大揭秘

随着iPhone不断更新换代&#xff0c;其设计与操作方式也在不断进化。从最初的实体Home键到如今的全面屏设计&#xff0c;iPhone的操作逻辑也随之发生了改变。 对于那些习惯了传统安卓手机操作的用户来说&#xff0c;iPhone的重启方式可能会显得有些不同寻常。下面我们就来一起…

SQL血缘解析

Druid 作为使用率特别高的的数据库连接池工具,在具备完善的连接池管理功能外,同时Druid 的 SQL解析功能可以用来防止 SQL注入等安全风险。通过对 SQL 语句进行解析和检查,Druid 可以识别并阻止潜在的恶意 SQL 语句执行,黑名单(阻止特定的 SQL 语句执行)、白名单(仅允许特…

★ 算法OJ题 ★ 力扣11 - 盛水最多的容器

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将和大家一起做一道双指针算法题--盛水最多的容器~ 目录 一 题目 二 算法解析 三 编写算法 一 题目 11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 二 算法解析 解法1&#xff1a;暴力枚举 …

文本数据分析-(TF-IDF)(1)

文章目录 一、TF-IDF简介1.意义2.TF与IDF1).TF&#xff08;Term Frequency&#xff09;2).IDF&#xff08;Inverse Document Frequency&#xff09;3).TF-IDF 二、应用三、代码实现1.文件读取2.数据预处理3.排序和输出4.全部代码 一、TF-IDF简介 1.意义 TF-IDF&#xff08;Te…

28 TreeView组件

Tkinter ttk.Treeview 组件使用指南 ttk.Treeview 是 Tkinter 的一个高级控件&#xff0c;用于显示和管理层次化数据。它类似于电子表格或列表视图&#xff0c;但提供了更丰富的功能&#xff0c;如可展开的节点、多列显示等。ttk 模块是 Tkinter 的一个扩展&#xff0c;提供了…

Golang | Leetcode Golang题解之第382题链表随机节点

题目&#xff1a; 题解&#xff1a; type Solution struct {head *ListNode }func Constructor(head *ListNode) Solution {return Solution{head} }func (s *Solution) GetRandom() (ans int) {for node, i : s.head, 1; node ! nil; node node.Next {if rand.Intn(i) 0 { …

《机器学习》数据分析之关键词提取、TF-IDF、项目实现 <下>

目录 一、内容回顾 1、核心算法 2、算法公式 3、拆分文本 二、再次操作 1、取出每一卷的地址和内容 得到下列结果&#xff1a;&#xff08;此为DF类型&#xff09; 2、对每一篇文章进行分词 3、计算TF-IDF值 得到以下数据&#xff1a; 三、总结 1、关键词提取 1&a…

数据挖掘之分类算法

分类算法是数据挖掘中常用的一类算法&#xff0c;其主要任务是根据已知的训练数据&#xff08;即带有标签的数据&#xff09;构建模型&#xff0c;然后利用该模型对新的数据进行分类。分类算法广泛应用于金融、医疗、市场营销等领域&#xff0c;用于预测、决策支持等任务。以下…

STM32G474采用“多个单通道ADC转换”读取3个ADC引脚的电压

STM32G474采用“多个单通道ADC转换”读取3个ADC引脚的电压&#xff1a;PC0、PA1和PA2。本测试将ADC1_IN6映射到PC0引脚&#xff0c;ADC12_IN2映射到PA1引脚&#xff0c;ADC1_IN3映射到PA2引脚。 1、ADC输入 ADC输入电压范围&#xff1a;Vref– ≤ VIN ≤ Vref ADC支持“单端输入…

Java 集合Collection(List、Set)Map

集合的理解和优点 1)可以动态保存任意多个对象&#xff0c;使用比较方便!2)提供了一系列方便的操作对象的方法: add、remove、 set、 get等3)使用集合添加,删除新元素的示意代码- Java集合的分类 Java的集合类很多&#xff0c;主要分为两大类&#xff0c;如图&#xff1a; 1…

iPhone备忘录不小心删除了怎么办?

在日常使用iPhone的过程中&#xff0c;备忘录作为我们记录重要信息、灵感闪现和日常琐事的小帮手&#xff0c;其重要性不言而喻。然而&#xff0c;有时候因为操作失误或是不小心点击&#xff0c;我们可能会将珍贵的备忘录内容删除&#xff0c;这无疑会让人感到焦虑与不安。但请…

深入垃圾回收:理解GC的核心算法与实现

垃圾回收&#xff08;Garbage Collection&#xff0c;GC&#xff09;是现代编程语言中一项关键技术。它不仅解决了内存管理中的诸多问题&#xff0c;还为开发者提供了一个更高效、更安全的编程环境。本文将深入探讨GC的起源、主要算法以及这些算法在不同编程语言中的具体实现。…