- 博客(30)
- 收藏
- 关注
原创 string的收尾 (7)
上一篇文章我们已经实现了简单版的string类,但在面试里考官一般并不会让我们实现完整的string,毕竟时间不多,所以一般会让我们实现以下string的构造,拷贝构造,析构,赋值运算符重载。// 为了和标准库区分,此处使用Stringpublic:/*String()*///String(const char* str = "\0") 错误示范//String(const char* str = nullptr) 错误示范。
2025-04-16 23:28:31
853
17
原创 string的模拟实现 (6)
因为我们之前说过,初始化列表会按声明的顺序初始化,先走_str,再走_size,所以我们还得把声明顺序变了才行,但声明顺序变了又不顺我们的习惯(先声明指针),而且过后还要把数据拷贝出来,所以说我们是得尽可能使用初始化列表,但有些东西是初始化列表搞不定的,改该用函数体还是得用,不能说有了初始化列表就不用函数体了。④在前面类和对象下我们说到,尽可能的使用初始化列表,但在这里使用比较别捏,三个strlen(),strlen是在运行时计算的,3个O(n),还是很坑的。最终我们可以改成,这样就不用管顺序了。
2025-04-16 23:27:08
444
4
原创 从零开始的C++编程 5 (string上)
3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, charc)用字符c来填充多出的元素空间。C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
2025-04-13 22:42:40
683
16
原创 从零开始的C++编程 4 (模板初阶)
目录1.泛型编程2.函数模板2.1函数模板概念2.2函数模板格式2.3函数模板的原理2.4函数模板的实例化2.5模板参数的匹配原则3.类模板3.1类模板的定义格式3.2类模板的实例化在我们平时会用到很多函数,而函数使用也要看类型是否适用,比如交换函数按不同的类型来:使用函数重载虽然可以实现,但是有一下几个不好的地方:1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数2. 代码的可维护性比较低,一个出错可能所有的重载均出错,这样就感觉很麻烦,仅因为类型不同就
2025-04-13 22:42:29
538
3
原创 从零开始的C++编程 3 (C/C++内存管理)
malloc/free和new/delete之间最大的区别就是new,delete在给自定义类型申请空间时还会调用它的构造函数和析构函数。①new的原理1. 调用operator new函数申请空间2. 在申请的空间上执行构造函数,完成对象的构造②delete的原理1. 在空间上执行析构函数,完成对象中资源的清理工作2. 调用operator delete函数释放对象的空间③new T[N]的原理。
2025-04-13 22:42:13
553
1
原创 从零开始的C++编程 2(类和对象下)
⽆论是否显⽰写初始化列表,每个构造函数都有初始化列表;⽆论是否在初始化列表显⽰初始化成员变量,每个成员变量都要⾛初始化列表初始化;
2025-04-12 23:29:34
897
原创 从零开始的C++编程 2(类和对象中)
,不能同时存在。⽆参构造函数和全缺省构造函数虽然构成函数重载,但是调⽤时会存在歧义。要注意很多人会认为默认构造函数是编译器默认⽣成那个叫默认构造,实际上⽆参构造函数、全缺省构造函数也是默认构造,总结⼀下就是。
2025-04-12 23:27:40
944
原创 从零开始的C++编程 2(类和对象上)
①class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略(这里与struct相同)。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。②为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m开头,注意C++中这个并不是强制的,只是⼀些惯例,具体看公司的要求。
2025-04-10 21:13:03
817
4
原创 从零开始的C++编程 1
①定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。②namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。③C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。
2025-04-10 21:12:49
1231
5
原创 Linux基础指令1
好久没写博客了,这次我将重新做人,每星期都更,做不到的话直接倒立洗头。最近在学Linux,感觉很厉害的样子,先浅学一下再弄数据结构去。Linux的基本操作是通过指令来执行的,所以我们先来学习下指令。
2024-11-07 13:07:36
727
7
原创 数据结构之复杂度
数据结构(Data Structure)是计算机存储、组织数据的⽅式,指相互之间存在⼀种或多种特定关系的数据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤,所以我们要学各式各样的数据结构,如:线性表、树、图、哈希等。
2024-11-07 12:58:54
805
1
原创 指针相关知识(3)
要知道还有什么表达方式我们需要深度理解一下二维数组,我们可以把二维数组看成一维数组里存放了几个一维数组int arr[3][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}},并且二维数组首元素地址就是第一行一维数组的地址,根据上面的解释,一维数组元素类型是int [5],那么第一行一维数组地址的类型就是int (*)[5],所以本质上二维数组传参也是传递了地址,所以我们也可以用数组指针表示。可以看出来函数是有地址的,并且函数名就是函数的地址,可以直接函数名也可以&函数名。
2024-05-30 08:03:31
948
1
原创 有关指针相关知识(2)
(注意:16进制24就是10进制的40)arr与arr+1和&arr[0]与&arr[0]+1都是相差四个字节,而&arr与&arr+1却差了40个字节,这是因为arr与&arr[0]都是数组首元素的地址,+1就跳过一个元素,&arr是整个数组的地址,+1就是跳过一个数组。这三种打印出来都是一样的,都是数组首元素的地址,前两个就算了,前面说过了,数组名就是数组首元素地址,但是&arr不是指整个数组吗,那为什么会这个样子。ppa解引用得到的就是p的值,也就是a的地址,再对p解引用就是a的值。
2024-05-11 23:07:49
628
2
原创 有关指针相关知识(1)
当然肯定会有很多人跟我有一样的疑问:我们之前想修改一个变量的值都是直接a=0,这样不会更方便吗,这里我也不太清楚,待学到后面再来解惑,能知道的就是多了一种途径去修改变量。我们看的出来pa的前面是int *,这里的*是指pa变量是指针变量,int指pa指向的值是int类型的对象。3.指针指向的空间被释放。野指针就是指针指向的位置是不知道的(随机的,不正确的,没有明确限制的)。&a取地址操作符取的是字节最小的那个地址,但是这不影响,我们找到了第一个字节,后面几个字节就可以顺藤摸瓜的找出来了。
2024-05-06 14:35:44
640
1
原创 关于操作符
同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。c语言已经给我们提供了许多内置类型,如int,char,flaot等,但只有这些内置类型还不够,就比如我们要形容一个学生时,肯定不是单一的描述整数或者浮点数,字符,而是包括多项,这时候我们就要用到结构体了。综上所述呢,当我们在写代码时,尽量不要把表达式写的太复杂,可以分开一条一条写,没必要追求一句代码就把解决,因为就算我们确定了优先级和结合性,表达式的运算路径也可能有多种,存在一定的风险。
2024-05-03 21:39:03
858
原创 关于函数递归
比如解决n的阶乘问题时,1的阶乘是1,2的阶乘是1*2(2*1的阶乘),3的阶乘是1*2*3(3*2的阶乘)......所以n就等于n*(n-1)的阶乘,(n-1)又等于(n-1)*(n-2)的阶乘,如此逆推下去可以发现这个大问题可以拆成n个小问题。当我们学会了递归后通常会看到什么问题都想用递归解决,其实不然,一般上使用递归逻辑会更清晰,当遇到了复杂的问题时,有时使用迭代(迭代就是循环)会效率更高。首先我们需要知道什么是函数递归,讲的简单点,函数递归就是函数自己调用自己,在函数里面再套用函数。
2024-05-01 15:40:51
220
原创 有关strcmp,数组传参(a lot杂烩)
函数从两个字符串的第一个字符开始比较,依次比较两个字符的ASCII码值,如果两个字符的ASCII值相等,则继续比较下一个字符的ASCII值。如果两个字符的ASCII值不相等,则返回这两个字符的ASCII码值的差(即第一个不相等的字符的ASCII值减去第二个字符的ASCII值)。此外,因为strcmp会遍历整个字符串,因此在处理非常长的字符串时,可能会产生大量的开销,这个时候可以考虑其他的函数结构。数组传参使我们可以只传一个参数而带动多个数的传递,而不是一个接一个的传递数值,这样大大简化了代码,逻辑紧凑。
2024-04-21 12:15:48
306
原创 有关函数的相关知识
C语⾔的国际标准ANSI C规定了⼀些常⽤的函数的标准,被称为标准库,那不同的编译器⼚商根据ANSI提供的C语⾔标准就给出了⼀系列函数的实现。那么如何解决这个问题呢?C语⾔的程序其实是由⽆数个⼩的函数组合⽽成的,也可以说:⼀个⼤的计算任务可以分解成若⼲个较⼩的函数(对应较⼩的任务)完成。如果函数里面有if等分支语句,每个分支都需要有return,不然会出错?函数被翻译为⼦程序更加准确⼀些,C语⾔中的函数就是⼀个完成某项特定的任务的⼀⼩段代码,查询资料后可知printf函数返回的是打印在屏幕上的字符的个数?
2024-04-21 11:06:10
651
原创 数组相关知识
因为程序员数数喜欢从零开始数,所以下标从零开始,当你想要使用数组中的元素时,可以用[ ]来操作,它的名字叫"下标引用操作符",当你想要访问7时,你需要找到7在数组中的下标,也就是arr[6]。当我们把一维数组当成元素存入数组中时,就是二维数组,同理,三维四维依次套娃,在这里我们把二维以上的数组统称为多维数组。C语⾔规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后⼀个元素的下标是n-1,下标就相当于数组元素的编号。:数组也是有类型的,把数组名去掉剩下的就是数组的类型,type [常量值]。
2024-04-19 16:21:54
566
原创 C语言分支循环语句
返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型.time函数的参数 timer 如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。程序中在调⽤ rand 函数之前先调⽤ srand 函数,通过 srand 函数的参数seed来设置rand函数⽣成随机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了。聪明的程序员会把变量放在=的左边,这样的话,程序是不会因为x==3或者3==x而报错,而3=x就会报错。
2024-04-17 13:04:11
847
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人