C++天使的灵动心跳代码:类和对象(上)
面向过程与面向对象🚩面向过程C语言所学的内容主要都是面向过程的,核心是过程(函数),将程序看作是一系列步骤的组合。它强调的是 “怎么做”,重点在于设计函数和函数之间的调用顺序来完成任务,整个过程是围绕操作步骤(函数)展开的 例如:在一个文件复制程序中,面向过程的思路是先打开源文件,然后读取源文件内容,接着打开目标文件,再将读取的内容写入目标文件,最后关闭文件 🚩面向对象核心是对象,把现实世界中的事物抽象成对象,对象包含数据(属性)和操作数据的方法。它强调的是 “有什么”,重点在于定义对象的属性和行为,通过对象之间的相互作用来完成任务 例如:对于文件复制程序,面向对象的思路是创建文件对象,这些文件对象有自己的属性(如文件名、文件路径、文件内容等)和方法(如打开、读取、写入、关闭等),通过操作这些文件对象来实现文件复制 类类的引入类是一种数据类型,在C语言中类指的是结构体,但他只能包含变量;在C++中的类能包括变量和函数,清晰对一个对象进行属性行为说明,所以类和结构体十分相似 123456789101112131415//以C语言环境struct Stack{ int...
C++命运石之门代码抉择:C++入门(下)
C语言过渡到C++(下)auto 关键字(C++11)为什么要用 auto?随着后续 C++ 语法的越来越深入,类型的长度可能会越来越长,因为在一些情境下是不允许把全部命名空间全部打开,所以在写类型时可能会遇到以下问题: • 类型难于拼写• 含义不明确导致容易出错 ⌨️比如后续学到迭代器有这么个类型 1std::map<std::string, std::string>::iterator 或许有聪明的人会想到直接用 typedef 给类型取别名不就好了,使用typedef给类型取别名确实可以简化代码,但是 typedef 有会遇到新的难题: 在编程时,常常需要把表达式的值赋值给变量,这就要求在声明变量的时候清楚地知道表达式的类型,然而有时候要做到这点并非那么容易,而且 typedef 只能定死变量的别名,auto 是自动推断的,因此 C++11 给 auto 赋予了新的含义 什么是 auto?早期的 auto:使用auto修饰的变量,是具有自动存储器的局部变量C++11 的新...
C++命运石之门代码抉择:C++入门(中)
C语言过渡到C++(中)函数重载是函数的一种特殊情况,C++允许在==同一作用域==中声明几个功能类似的同名函数,这些同名函数的形参列表不同在于参数个数 或 类型 或 类型顺序常用来处理实现功能类似数据类型不同的问题 函数重载的多种情况🚩参数类型不同 12345678910int Add(int left, int right){ cout << "int Add(int left, int right)" << endl; return left + right;}double Add(double left, double right){ cout << "double Add(double left, double right)" << endl; return left + right;} 一个函数类型为 int ,一个函数类型为 double...
C++命运石之门代码抉择:C++入门(上)
前言什么是C++ C++ 是一种高级编程语言,它在 C 语言的基础上发展而来的面向对象的语言,C++ 最初是由丹麦计算机科学家本贾尼・斯特劳斯特卢普(Bjarne Stroustrup)在 20 世纪 80 年代初期开发的,当时,C 语言已经在系统编程等领域广泛应用,但对于大型软件项目的开发,缺乏一些如代码复用、数据抽象等方便的机制,简单来说就是对一些自定义类型的完善,C++ 应运而生,它增加了类和对象等面向对象的概念,使得程序可以更好地组织和维护 C++的发展语言的开发都是在原先基础上增加新的语法规则,而不是删掉过去的语法规则,不然会导致以前编程环境下的代码都无法运行(python除外),于是在C语言的基础上进行扩展,增加了类的机制,称之为C with...
关于我、重生到500年前凭借C语言改变世界科技vlog.22——动态内存管理dě查缺补漏
本篇是对上一篇动态内存管理的总结提升,能够更好地帮助你理解使用动态内存管理😎 动态内存的魔鬼细节对空指针解引用123456void test() { int *p = (int *)malloc(INT_MAX/4); *p = 20;//如果p的值是NULL,就会有问题 free(p); } 解析: 其分配的大小为 INT_MAX/4 字节,然而系统可能无法提供如此巨大的内存块以满足分配请求,所以在系统无法满足分配请求时,malloc 会返回一个空指针,直接对 *p 进行赋值操作,如果 p 的值是 NULL,那么这个赋值操作就会导致程序出现段错误(访问非法内存地址),即指向不存在的内存 修改后的代码: 1234567891011121314void test(){ int *p = (int *)malloc(INT_MAX / 4); if (p!= NULL) { *p = 20; free(p); } else { ...
关于我、重生到500年前凭借C语言改变世界科技vlog.21——动态内存管理
内存的开辟与释放过去我们开辟空间的方式有: 12int val = 20;//在栈空间上开辟四个字节char arr[10] = {0};//在栈空间上开辟10个字节的连续空间 但是这种方式存在缺点: 空间开辟大小是固定的数组在申明的时候,必须指定数组的长度,数组空间一旦确定了大小不能调整 mallocmalloc 是一种常用的开辟空间的函数,它适用于各种类型的内存开辟。这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。声明在 ==stdlib.h== 头文件中 传送门:malloc-C++参考 参数:size-表示需要分配的字节数 返回值:返回一个指向所分配内存块起始地址的指针 值得注意的是: • 如果开辟成功,则返回⼀个指向开辟好空间的指针 • 如果开辟失败,则返回⼀个 NULL 指针,因此 malloc 的返回值⼀定要做检查 • 返回值的类型是 void* ,所以 malloc 函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定 • 如果参数 size 为0,malloc...
关于我、重生到500年前凭借C语言改变世界科技vlog.20——自定义类型:联合&&枚举
联合体什么是联合体?联合体也称共用体,顾名思义,共用共用就有节省空间的意思,它允许在相同的内存位置存储不同的数据类型,就是个缩小内存的结构体 联合体的声明及定义联合体的声明,定义与结构体相同,只是类型不同,其语法形式为: 1234union tag{ member-list;}variable-list; 声明就是去掉 variable-list ,保留剩下的,可以在结构体上定义,也可以另起一行定义对象上一篇结构体声明与定义有详细介绍 传送门:关于我、重生到500年前凭借C语言改变世界科技vlog.19——自定义类型:结构体 联合体的初始化也有特殊之处: 12345678910111213141516#include <stdio.h>//联合类型的声明union Un{ char c; int i;};int main(){ //联合变量的定义 union Un un1 = {0}; union Un un2 = {'a'}; ...
关于我、重生到500年前凭借C语言改变世界科技vlog.19——自定义类型:结构体
前面在学习操作符的时候,已经对结构体有了初步了解,结构体不仅在C语言中经常使用,也为C++学习类和对象打下基础,本篇 vlog 将对结构体进行详细的解析 传送门:关于我、重生到500年前凭借C语言改变世界科技vlog.10——进制转化&&操作符进阶 结构体的声明与初始化数组用于存放同类型的数据,而结构体是用于存放不同类型变量的函数的集合 其语法形式为: 1234struct tag{ member-list;}variable-list; 普通声明比如我们想要描述一个学生 1234567struct Stu{ char name[20];//名字 int age;//年龄 char sex[5];//性别 char id[20];//学号}; //分号不能丢 声明只需要写出返回类型,参数,函数名返回类型是 struct ,参数是学生的信息,函数名是 Stu 创建及初始化struct 是一种自定义类型,那么就规定需要为其创建对象,那么如何理解对象呢? 假设类是一个大房子,struct...
关于我、重生到500年前凭借C语言改变世界科技vlog.18——内存函数
memcpy函数memcpy 主要用于将一段内存中的数据完整地复制到另一段内存中,在很多场景下都非常有用,例如在处理数组、结构体等数据结构时,从源内存地址 src 复制 n 个字节的数据到目标内存地址 destination 传送门:memcpy-C++参考 参数:destination-目标内存地址,它是一个 void* 类型的指针,source-源内存地址,同样是 void* 类型(不可修改),num-要复制的字节数 返回值:返回指向目标内存地址 destination 的指针 值得注意的是:函数 memcpy 从 source 的位置开始向后复制 num 个字节的数据 destination 指向的内存位置,这个函数在遇到 ‘\0’ 的时候并不会停下来,如果 source 和destination 有任何的重叠,复制的结果都是未定义的 eg: 1234567891011#include <stdio.h>#include <string.h>int main(){ char src[] = "Hello,...
关于我、重生到500年前凭借C语言改变世界科技vlog.17——字符函数&&字符串函数
字符函数 字符函数通常是针对单个字符进行操作的函数,它们接受一个字符作为参数,并返回与该字符相关的某种属性或经过特定处理后的结果 字符分类函数此类函数主要用于字符的分类,需要包含头文件 ==#include <ctype.h>==以下介绍一个常用的字符分类函数 islowerislower 用于检查字符是否为小写字母, isupper 作用与其相反 传送门:islower-C++参考 参数:要检查的参数,即大小写字母 返回值:如果 c 确实是小写字母,则该值不为零(即 true),否则为 0(即 false) 举个例子:将字符串中的小写字母都转成大写字母,其他字符不变 123456789101112131415161718#include <stdio.h>#include <ctype.h>int main(){ int i = 0; char str[] = "Test String.\n"; char c; while (str[i]) { c =...