- 博客(26)
- 收藏
- 关注
原创 【C++基础】模板初阶
class 类模板名// 类内成员定义// 类模版public:_size = 0;// 模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误,具体原因后面会讲// 扩容++_size;
2024-07-20 19:52:46 1012
原创 【C++基础】C/C++内存管理
6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理释放。3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可,如果是多个对象,[ ]中指定对象个数即可。new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申。
2024-07-19 21:07:52 958
原创 【C++基础】类和对象(4)(再探构造函数、类型转换、static成员、友元、内部类、匿名对象)
内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。注意:内部类就是。
2024-07-18 21:27:20 879
原创 【C++基础】类和对象(2)(构造函数、析构函数、拷贝函数)
⼀个类,我们不写的情况下编译器会默认⽣成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最后两个取地址重载不重要,我们稍微了解⼀下即可。这里可以对比内置类型理解, 传值会引发拷贝, 每次调用形式参数, 都会引发对象的拷贝, 然后会层层传值,引发对象的拷贝递归调用, 所以我们一般写拷贝构造函数时, 一般形参写传引用, 就不会发生这种问题, 当然传指针也可以, 但是每次传递都需要取地址, 未免有些麻烦, 而且不符合拷贝构造的定义。字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。
2024-07-14 23:23:26 1018
原创 【C++基础】类和对象(1)
• class为定义类的关键字,Stack为类的名字,{ }中为类的主体,注意类定义结束时后⾯分号不能省略。类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。• 为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加 _ 或者m开头,注意C++中这个并不是强制的,只是⼀些惯例,具体看公司的要求。• C++中struct也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是。
2024-07-13 23:41:05 800
原创 【C++基础】初识C++(2)--引用、inline、nullptr
C++的引⽤跟其他语⾔的引⽤(如Java)是有很⼤的区别的,除了⽤法,最⼤的点,C++引⽤定义后不能改变指向,Java的引⽤可以改变指向。还有这个是许多教材上喜欢写的,以前C语言的时候是不是很懵啊 ,⼀些主要⽤C代码实现版本数据结构教材中,使⽤C++引⽤替代指针传参,⽬的是简化程序,避开复杂的指针,但是很多同学没学过引⽤,导致⼀头雾⽔。也是类似,在类型转换中会产⽣临时对象存储中间值,也就是时,rb和rd引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥就触发了权限放⼤,必须要⽤常引⽤才可以。
2024-07-12 22:09:55 483
原创 【C++基础】初识C++(1)
定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。注意: 这里和结构体的区别在于结构体{}后有;而命名空间没有namespace本质是定义出⼀个域,这个域跟全局域各自独⽴,不同的域可以定义同名变量,所以下⾯的rand不在冲突了(1)定义命名空间命名空间可以定义变量/函数/类型// 命名空间中可以定义变量/函数/类型int val;int main()
2024-07-11 20:31:23 894
原创 二叉树【数据结构】
通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。2. 若规定根结点的层数为 1 ,则 深度为 h 的二叉树的最大结点数是2^h - 1。子孙:以某结点为根的子树中任一结点都称为该结点的子孙。:若一个结点含有子结点,则这个结点称为其子结点的父结点;:一个结点含有的子树的根结点称为该结点的子结点;
2024-06-19 21:19:45 641
原创 C语言【数据结构】--栈
要实现一个栈,我们先梳理一下基本结构,我们还是分两个源文件 “text.c(测试),Stack.c(函数的定义) ”和一个头文件(Stack.h)函数的声明.单链表的尾部作为栈底,头部作为栈顶,方便插入和删除(进栈头插,出栈头删),头指针和栈顶指针 top 合二为一。数组的首元素作为栈底,另外一端作为栈顶,同时定义一个变量 top 来记录栈顶元素在数组中的位置。当然,也会存在一些问题,就是每次空间不够,要重新开辟空间,可能会造成一些内存浪费。:栈的插入操作叫做进栈/压栈/入栈,:栈的删除操作叫做出栈,
2024-05-22 23:34:03 679 1
原创 C语言--【数据结构】顺序表
顺序表是线性表的一种线性表(linear list)是n个。线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串...线性表在上是线性结构,也就说是⼀条直线。但是在上并的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
2024-05-20 21:52:53 794
原创 C语言——预处理详解
C语⾔设置了⼀些预定义符号,可以直接使⽤,预定义符号也是在预处理期间处理的__FILE__ //进⾏编译的源⽂件__LINE__ //⽂件当前的⾏号__DATE__ //⽂件被编译的⽇期__TIME__ //⽂件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义举个栗子:基本语法:#define name stuff#define reg register //为 register这个关键字,创建⼀个简短的名字;) //⽤更形象的符号来替换⼀种实现。
2024-05-11 00:16:34 805 5
原创 C语言--程序的编译和链接
一、翻译环境和运行环境在ANSIC的任何⼀种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执⾏的机器指令(⼆进制指令)。第2种是执⾏环境,它⽤于实际执⾏代码。二、翻译环境那翻译环境是怎么将源代码转换为可执⾏的机器指令的呢?这⾥我们就得展开开讲解⼀下翻译环境所 做的事情。其实翻译环境是由编译和链接两个⼤的过程组成的,⽽编译⼜可以分解成:预处理(有些书也叫预编 译)、编译、汇编三个过程⼀个C语⾔的项⽬中可能有多个。
2024-04-27 21:06:39 903 1
原创 C语言--贪吃蛇小游戏
一、Win32API介绍一、Win32API介绍在实现贪吃蛇前我们下了解一下会使⽤到的⼀些Win32API知识Windows这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外,它同时也是⼀个很⼤ 的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启 视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程(Application),所以便 称之为ApplicationProgrammingInterface,简称。W1.2控制台程序。
2024-04-27 01:49:21 776 6
原创 C语言--文件操作
磁盘(硬盘)上的⽂件是⽂件。程序⽂件、数据⽂件(从⽂件功能的⻆度来分类 的)。程序文件程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows 环境后缀为.exe)。数据文件⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或 者输出内容的⽂件本文主要讨论数据文件。根据数据的组织形式,数据⽂件被称为文本文件或者二进制文件1)fputc(): 用于向文件中写入一个字符。c: 要写入的字符的ASCII码。
2024-04-21 22:19:31 812 7
原创 C语言--动态内存管理
我们已经掌握的内存开辟方式:// 在栈空间上开辟四个字节// 在栈空间上开辟 10 个字节的连续空间但是上述的开辟空间的⽅式有两个特点:• 空间开辟⼤⼩是固定的。• 数组在申明的时候,必须指定数组的⻓度,数组空间⼀旦确定了⼤⼩不能调整但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间⼤⼩在程序运⾏的时候才能知 道,那数组的编译时开辟空间的⽅式就不能满⾜了。C语⾔引⼊了动态内存开辟,就是为了让程序员可以灵活申请和释放空间。
2024-04-07 00:27:47 802 2
原创 C语言--枚举和联合体
枚举顾名思义就是⼀⼀列举,把可能的取值⼀⼀列举。枚举与结构体的定义类似举个栗子:这些可能取值都是有值的,默认从0开始,依次递增1当然了,在声明枚举类型的时候也可以赋初值。
2024-04-06 00:12:35 515 2
原创 C语言——结构体
位段的声明和结构是类似的,有两个不同:(1)位段的成员必须是 int 、 unsigned int 或 signed int ,在C99中位段成员的类型也可以 选择其他类型(2)位段的成员名后边有⼀个冒号和⼀个数字举个栗子。
2024-04-04 00:38:13 942 4
原创 C语言-数据在内存中的存储
大端字节序存储:是 指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存在内存的低地址处小端字节序存储:是 指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处为什么会有大小端之分呢?
2024-03-28 22:22:03 1062 3
原创 C语言——操作符详解
如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符是左结合,还是右结合,决定执⾏顺序。⼤部分运算符是左结合(从左到右执⾏),少数运算符是右结合(从右到左执⾏),⽐如赋值运算符( = ):所有的整数在内存中都是以补码进行存储的,我们的左右移操作符都是对补码进行直接操作的;但是到底是逻辑右移还是算术右移,这个标准并没有确定,是取决于编译器的。进行按位与,规则是:对应二进制位有0就是0,两个同时为1才为1。进行按位或,规则是:对应二进制位有1就是1,两个同时为0才为0。
2024-03-24 20:17:46 1142 3
原创 C语言 内存函数
函数定义:void * memcpy ( void * destination, const void * source, size_t num );这里的count是整个需要拷贝的元素大小函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置这个函数在遇到 '\0' 的时候并不会停下来。
2024-03-23 00:23:11 506 3
原创 C语言 字符串函数使用
strlen统计的是‘/0’之前的字符个数,到‘/0’就结束了。注意 函数的返回值为,是⽆符号的使用:在使用时需要包含头文件<string.h>
2024-03-22 00:17:12 1017 1
原创 一道有趣的题
在VS2022、X86、Debug的环境下,编译器不做任何优化的话,下⾯代码执⾏的结果是啥?答案是:程序运行,死循环的打印“hehe”。这里可能会有疑问,这里不是会越界吗,怎么死循环的打印“hehe”呢?我们可以通过调试来观察一下:通过调试我们可以看出,当我们把arr[i]改的时候i也变了,因为arr[12]的地址和i的地址是一样的,所以每次一道arr[12]的时候i就被改为0了,就永远不可能跳出这个循环。我们再看一张图片所以说这道题很巧妙,但凡换一种编译器,或者换一
2024-03-07 13:11:42 164
原创 vs中scanf被忽略的原因和解决方法
如果说没有权限无法更改可以先将它拖到桌面或其他文件夹,拷贝进去后在将其拖回来,这样就不要每次打开vs都输入一遍了。大家在使用的时候可能会遇到这个问题,这是因为vs认为这个函数不安全,解决这个问题也很简单。当然了,每次写代码前都加一次这个有些麻烦,就可以打开vs安装路径找到这个文件,把。这中方法不推荐使用,因为它没有良好的移植性,在其它平台很可能会报错。这里就有写到可以使用这串字符来解决,
2024-01-27 23:07:08 246 1
原创 C语言分支循环语句
在C语言中,分支和循环语句是控制程序流程的重要工具。通过使用这些语句,我们可以让程序根据不同的条件执行不同的代码块,或者重复执行某个任务直到满足特定条件。本文将介绍C语言中常用的分支和循环语句。分支语句用于根据条件判断来选择执行不同的代码块。C语言中有两种主要的分支语句:if语句和switch语句。if语句用于根据一个条件表达式的真假来决定是否执行某个代码块。其基本语法如下:我们还可以使用else if来检查多个条件:switch。
2024-01-24 23:49:32 401
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人