![](https://img-blog.csdnimg.cn/20190918140037908.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
学习篇---服务端 C/C++
记录C++学习过程
程序猿的温柔香
一个懂技术,也懂浪漫的程序猿
展开
-
《Effective C++》 读书笔记(详细总结55条款)下篇
Effective C++ 目录五、实现26、尽可能延后变量定义的时间27、尽量少做转型动作28、避免返回 Handles 指向对象内部成分29、为异常安全努力是值得的30、透彻理解 inlining 里里外外31、将文件间的编译依存关系降到最低六、继承与面向对象设计32、确定你的 public 继承塑模出is-a的关系33、避免遮掩继承而来的名称34、区分接口继承和实现继承35、考虑 virtual 函数以外的其他选择36、绝不重新定义继承而来的 non-virtual 函数七、模板与泛型编程八、定制原创 2020-07-27 14:55:46 · 660 阅读 · 0 评论 -
《Effective C++》 读书笔记(详细总结55条款)上篇
下面从四个方面来说(1) C++ 以 C 为基础,很多语句语法都没有改变,只是进行了扩展,C++ 解决问题的时候,可以理解为 C 的高效解法(2) 面向对象,有构造函数,析构函数,继承、封装、多态、虚函数动态绑定,这是不同于C 语言的部分(3) 泛型编程、可以理解为代码的模型,但是代码本身并不占用内存空间,只有在实例化的时候,才分配内存,所以可以提高代码复用性原创 2020-07-07 15:31:24 · 1548 阅读 · 1 评论 -
C++ 面试常考的多态原理
多态:当不同的对象对应不同的结果重载 VS 重写(覆盖) VS 重定义重载是两个函数在同一个作用域中,函数名相同和参数不同重写(覆盖)是 两个函数分别在基类和派生类中,函数名、参数、返回值都必须相同(协变列外),而且两个函数必须是虚函数重定义(隐藏) 是两个函数分别在基类和派生类中,函数名相同,两个基类和派生类的同名函数不是重写就是重定义接口继承 VS 实现继承普通函数的继承是...原创 2019-08-29 14:00:52 · 348 阅读 · 0 评论 -
C++ 面试常考的智能指针原理
智能指针RAII + 解引用操作符的重载 + 解决浅拷贝问题不能采用深拷贝的方式解决,因为类在资源进行的是管理解决浅拷贝的问题浅拷贝的后果是 多个对象共享一份资源,在销毁对象的时候同一份资源被释放多次,导致代码奔溃c++98 auto_ptr资源的转移c++ 11...原创 2019-11-19 23:15:17 · 300 阅读 · 1 评论 -
面试考点---动态内存管理
内存管理C语言栈、堆、数据段、代码段、BSS段malloc、relloc、 calloc的区别?C++内存管理new 的使用方式new 与 malloc 的区别;free 与 delete 的区别?new 与 delete 实现原理malloc/free 和 new/delete 的区别C语言栈、堆、数据段、代码段、BSS段栈(Stack) 存放的是 局部变量 、函数参数 、返回值;最...原创 2019-05-24 14:43:38 · 470 阅读 · 0 评论 -
利用联合体判断字节序
由于联合体变量存储的原因,可以借助这一特性来判断计算机中字节序是大端还是小端。大端:值的高位存储在内存的低地址处,低位存储在高地址处----下面是小端字节序存储方式小端:值的高位存储在内存的高地址处图画的有点丑啊,如果理解不了,就死记住:大端字节序的读取顺序是符合人类常规,是从右往左读,但是小端字节序是反的,也就是从右往左的,大部分的计算机都是小端字节序的,由于网络传输的字节大都是大端...原创 2019-10-11 18:46:18 · 974 阅读 · 1 评论 -
文件操作IO接口
一般谈到的文件有两种,一种时数据文件,一种是程序文件其中程序文件包括:目标文件(.obj),可执行程序(.exe),源程序文件(.c)数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。文件名一个文件要有一个唯一的文...原创 2019-05-06 00:30:37 · 398 阅读 · 0 评论 -
C语言实现通讯录功能
实现通讯录 ‘增’ ‘删’ ‘查’ ‘改’ 四个功能头文件所应包含的内容:#pragma once#include <stdio.h>#include <stdlib.h>#include <string.h>#include <windows.h>#include <assert.h>typedef struct i...原创 2019-03-17 23:56:24 · 3631 阅读 · 2 评论 -
strpbrk的模拟实现
函数原型是:char* find_char(char const *source,char const *chars);例:假定 source 指向 ABCDEF,如果 chars 指向 XYZ ,JURY或QQQ,函数就会返回一个NULL指针;如果 chars 指向 XRCQEF,函数就会返回一个指向 source 中C的字符指针,参数所指向的字符串是绝不会被修改;char* find_...原创 2019-03-15 22:42:27 · 336 阅读 · 1 评论 -
动态内存管理
malloc的用法:(动态内存的分配)void* malloc(size_t size);void*表示未确定的类型的指针,可以指向任何类型的数据;因此必要的时候要对类型进行转换,其中size代表的是字节而不是大小;如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空...原创 2019-03-10 23:49:01 · 92 阅读 · 0 评论 -
指针笔试题1
指针类型笔试题1 int a[5] = { 1, 2, 3, 4, 5 }; int *ptr = (int *)(&amp;a + 1); printf("%d,%d", *(a + 1), *(ptr - 1));*(a+1)代表的是:a的首元素地址 +1 然后进行解引用得到的数按十进制打印指针 ptr 对数组名进行取地址,然后加1,则指针指向了5的下一位,但是打印的时候下标减1,...原创 2019-03-10 00:57:55 · 254 阅读 · 0 评论 -
求一个整数存储在内存中的二进制中1的个数
题目:求一个整数存储在内存中的二进制中1的个数方法一: int num = 10; int count = 0;//计数 while (num) { if (num % 2 == 1) count++; num = num / 2; //等价于:num = num >> 1; } printf("二进制中1的个数为:%d\n", count);这个是比较...原创 2019-03-06 15:29:34 · 252 阅读 · 0 评论 -
C语言类型转换
隐式转换一、在算数运算式中,低类型转换为高类型signed char a = 0xe0;unsigned int b = a;unsigned char c = a;同等位数的类型进行赋值时,不会改变在其内存的存储形式,所以第三行语句 c 的位存储形式还是0xe0位扩展:当 a 和 c 进行比较的时候,由于两边都是char(位宽比int小的)型,所以要提升为 int 型;如果原始类...原创 2019-03-03 23:19:49 · 1022 阅读 · 0 评论 -
模拟实现strtok和static的用法
模拟实现strtokstrtok使用注意事项:1.strtok会破坏原来的字符串例如:char str[1024] = “aaa bbb ccc ddd”;//正确的定义char* str = “aaa bbb ccc ddd”;//错误的定义2.strtok内部有个static 变量来记录上次切分的位置。但是有一个致命隐患:“线程不安全”(操作系统)3.strtok返回值如果是空指...原创 2019-03-02 23:26:29 · 231 阅读 · 0 评论 -
模拟实现memcpy、memmove
模拟实现memcpy从源内存地址的起始位置开始拷贝若干个字节到目标内存地址函数原型 : void* memcpy(void* dest, const void* src, size_t n);参数类型: 指向目标内存指针,指向源内存的指针,拷贝字节数返回值 : 返回一个目标内存区的指针dest #define _CRT_SECURE_NO_WARNINGS#include &l...原创 2019-03-02 00:36:12 · 171 阅读 · 0 评论 -
strchr的模拟实现
strchr的模拟实现char strchr(const char _Str,char _Val)char strchr(char _Str,char _Ch)头文件:#include <string.h>功能:查找字符串_Str中首次出现字符_Val的位置说明:返回首次出现_Val的位置的指针,返回的地址是被查找字符串指针开始的第一个与Val相同字符的指针,如果Str中不存...原创 2019-03-01 16:24:23 · 256 阅读 · 0 评论 -
strcmp模拟实现
strcmp的模拟实现C/C++函数,比较两个字符串,设这两个字符串为str1,str2,若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <...原创 2019-03-01 15:07:12 · 257 阅读 · 0 评论 -
strstr模拟实现
strstr模拟实现strstr(str1,str2); 用于判断str2是否是str1的子串(子字符串)如果是则函数返回str2在str1中首次出现的地址,否则返回null#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <string.h>#...原创 2019-03-01 01:32:08 · 144 阅读 · 0 评论 -
strcat的模拟实现
strcat的模拟实现注意事项:p++等价于(p++) 至于为什么会等价呢?根据c语言的优先级与++的优先级同处在第二级别上。他们的优先级是一样的,又因为处在第二级别的优先级运算符是结合方向是从右到左,所以当出现*p++这样的表达式的时候,根据优先级别相同,并且结合方向是从右到左,所以就等价于(p++)了。那么也就是,先将p指针移动到下个p指针所指向元素的地址的下一个地址,然后再对那个地址取值...原创 2019-02-28 14:51:01 · 137 阅读 · 0 评论 -
模拟实现strcpy
模拟实现strcpystrcpy,即string copy(字符串复制)的缩写;strcpy是一种C语言的标准库函数,strcpy把含有’\0’结束符的字符串复制到另一个地址空间,返回值的类型为char*#define _CRT_SECURE_NO_WARNINGS #include <stdio.h>#include <stdlib.h>#include &l...原创 2019-02-27 23:18:53 · 144 阅读 · 0 评论 -
c语言求n的阶乘
用递归和循环的方法:实现求n的阶乘区别:用递归求阶乘不用创建临时变量,且相对来说,代码比较简单。 用循环求阶乘需要创建两个变量,代码也比较简单,各有利弊。#include<stdio.h>#include<stdlib.h>int jiechen(int n)//递归求阶乘{ if (n == 1) { return 1; } return ...原创 2019-01-05 16:16:34 · 17440 阅读 · 0 评论 -
c语言三级指针
C语言易错题练习三级指针以下这段代码输出什么?char *c[] = { "ENTER","NEW","POINT","FIRST" };char **cp[] = { c + 3,c + 2,c + 1,c };char ***cpp = cp; printf("%s\n", **++cpp); printf("%s\n", *--*++cpp + 3);原创 2019-02-20 22:14:23 · 2135 阅读 · 1 评论 -
小练习1
小套路1 int x = 1; int y = 1; printf("%d", (!x || y--));一般情况下会认为打印的是0,可结果往往与心相违,恰恰是1解释:因为 ‘ || ‘ 的优先级大于 ’ – ‘ “–”出现在y的后面所以先进行的是||,然后才y减一,如果是 - -y的话,那么结果就是0,因为先计算 - -y小套路2 int a = 21; int b = 11...原创 2019-02-16 21:50:47 · 184 阅读 · 0 评论 -
模拟实现strlen
模拟实现strlen方法一:创建一个变量count计数tips:这种方法比较常见,也容易想到,值得注意的是:在循环里面前置加加和后置加加不要写错。#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>int my_strlen(const ...原创 2019-02-27 22:20:45 · 168 阅读 · 0 评论 -
模拟实现strcpy
模拟实现strcpy方法不唯一,不知道大家有没有更简单的方法~欢迎一起交流#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>char *his_strcpy(char *dest, char *src){ char *ret = dest; while (*dest++ ...原创 2019-02-25 22:39:49 · 146 阅读 · 0 评论 -
用c语言编写汉诺塔
汉诺塔问题的实现程序(1)每次只能移动一个圆盘(2)圆盘可以插在x,y,z中任意塔座上(3)小圆盘只能在大圆盘的上面#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>int c = 0;void move(char x, int n, char z){ //第n个圆盘...原创 2019-02-15 22:28:04 · 1029 阅读 · 0 评论 -
有一个字符数组的内容为:"student a am i",
有一个字符数组的内容为:“student a am i”,请你将数组的内容改为"i am a student".不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。提示:第一步: i ma a tneduts 第二步: i am a student#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &原创 2019-01-23 19:02:21 · 189 阅读 · 1 评论 -
sizeof 和 strlen 的易错点总结
sizeof和strlen的实列 int a[] = { 1,2,3,4 }; //sizeof判断元素所占的空间的字节 //printf("%d\n", sizeof(a));//16 //a是一个数组名,1个元素4个字节 printf("%d\n", sizeof(a + 0));//数组名a+0之后会被隐式转换位指针,//32位系统下,为4 printf("%d\n", size...原创 2019-01-21 22:17:29 · 349 阅读 · 0 评论 -
C语言实现求字符串的长度
C语言实现strlen()求字符串的长度。用递归和循环的方法求#include<stdio.h>#include<stdlib.h>int strlen_di(char arr[])//递归方法{ if (arr[0] == '\0') { return 0; } return 1 + strlen_di(arr + 1);}int strle...原创 2019-01-05 16:38:25 · 11316 阅读 · 0 评论 -
将字符串中的字符反向排列
编写:一个函数 reverse_string(char * p)(递归实现)实现:将参数字符串中的字符反向排列。要求:不能使用C函数库中的字符串操作函数。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>char* reverse_string(char* p){ int ...原创 2019-01-05 00:33:12 · 1252 阅读 · 0 评论 -
输入一个非负整数,返回它的各元素之和。
题目:写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>int DigitSum(int n){ if (n < ...原创 2019-01-04 15:21:59 · 2106 阅读 · 1 评论 -
用c语言实现:打印整数每一位。
题目:用c语言打印一个整数的每一位。1.递归方法实现:#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>void Print_z(int n) //方法一{ if (n < 10) { printf("%d", n); } else { Print_z...原创 2019-01-03 23:04:23 · 3460 阅读 · 1 评论 -
c语言求斐波那契数列的第 n 位数字
求斐波那契数列的第n位;1.用递归的方法;***值得注意的是:使用递归的方式虽然看起来很好理解但会有很大的运算量。(当输入一个很大的数字时不建议使用此方法)运算量呈指数式增长。#define _CRT_SECURE_NO_WARNINGS #include<stdio.h>#include<stdlib.h>int Fib(int n){ if (n =...原创 2018-12-31 15:23:22 · 4797 阅读 · 1 评论 -
用c语言实现x^k
题目:(1)用函数实现n^k (2)用递归实现n^k思路:【函数】定义n,k和最后的结果y,排除k=0的特殊情况,利用for()循环语句不断的赋值。【递归】同样的定义有关的变量(类型可以选择double型,下面代码的变量类型都用了int 型)排除k=0和k=1的特殊情况。返回值为 n*函数名称(int n,k-1)当k最后等于1的时候正好算完k个n相乘。#define _CRT_...原创 2018-12-27 23:10:01 · 1702 阅读 · 0 评论 -
用函数判断一个数是不是素数
题目:实现一个函数,判断一个数是不是素数(用C语言)思路:定义一个int 型数,使它依次递增整除所判断的数,如果余数等于0则不是素数,否则是素数。由for()语句配合if()语句不难写出。以下代码总共定义三个函数,可以随便调用哪个函数【仅供参考】#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdl...原创 2018-12-26 22:24:03 · 3951 阅读 · 1 评论 -
创建一个数组,实现初始化,清空,逆置等命令。
题目:创建一个数组,实现函数init()初始化数组、实现一个函数empty()清空数组、实现一个reverse()函数完成数组元素的逆置。(自己设置函数的参数和返回值)思路:(1)【init()函数,初始化数组】定义好数组之后对数组进行赋值,套用循环 for() 语句,对0-9下标进行手动输入10个数,之后再利用 for() 循环语句依次将赋值的数打印出来(2)【empty() 函数,清空...原创 2018-12-26 22:10:34 · 209 阅读 · 0 评论 -
实现一个函数判断year是不是闰年
题目:实现一个函数判断year是不是闰年?(C语言)思路:判断条件:(1)该年份可以被400整除(2)可以被4整除但不能被100整除的两个条件不需要都满足,只要满足其一就为润年。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>void Year(int n){ if...原创 2018-12-26 20:33:40 · 2142 阅读 · 1 评论 -
使用函数实现两个数的交换(C语言)
题目:使用函数实现两个数的代码。常规思路:定义函数,调用函数,完成交换。你的代码是否和下面一样呢?#include<stdio.h>#include<stdlib.h>void Swap(int a,int b){ int tmp = a; a = b; b = tmp;}int main(){ int x = 10; int y = ...原创 2018-12-23 23:47:40 · 17977 阅读 · 2 评论 -
用函数打印乘法口诀表(C语言)
题目:实现一个函数,打印乘法口诀表。口诀表的行数和列数自己决定,例如:输入9,输出 9* 9 的口诀表,输入12,输出 12* 12 的乘法口诀表。思路:(1)题目告诉用函数,则先定义函数,然后调用自定义的函数。(2)可以随意输入一个数n,则输出n*n的乘法口诀表,则定义一个变量n.参考代码(如有错误欢迎指出)#define _CRT_SECURE_NO_WARNINGS#inclu...原创 2018-12-23 00:47:44 · 3291 阅读 · 1 评论 -
模拟银行卡三次密码输入场景
题目:共有三次输入密码的机会,如果在三次输入中有一次输入正确则打印"密码正确,登录成功";如果输入失败则打印“密码错误,登录失败”;如果输入密码三次失败则打印出“你的账号已被锁定,请联系工作人员解锁”。思路:先定义一个密码,判断输入的密码与所定义的密码是否相等需要 if() 语句;有三次机会则需要一个循环语句;输入密码正确的话跳出循环。最后再一次用 if() 判定跳出循环的原因是因为输入密码...原创 2018-12-20 20:30:38 · 2336 阅读 · 0 评论