自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 资源 (1)
  • 收藏
  • 关注

原创 C++拷贝构造函数

所谓return对象, 实际上是调用拷贝构造函数把该对象的值拷入临时对象空间。1.当函数的形参是类的对象, 调用函数时, 进行形参与实参结合时使用。因为局部对象在离开建立。它的函数时就消亡了,不可能在返回调用函数后继续生存,所以在处理这种情况时,编译系统会在调用函数的表达式中创建一个无名临时对。拷贝构造函数:是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。深拷贝 (深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的....

2022-08-04 11:36:31 256 1

原创 C++静态成员

对象的生存期1.局部对象2.全局对象3.动态创建的对象1.对于局部定义的对象,每当程序控制流到达该对象定义处时,调用构造函数。当程序控制走出该局部域时,则调用析构函数。2.对于静态局部定义的对象,在程序控制首次到达该对象定义处时,调用构造函数。当整个程序结束时调用析构函数。2.对全局定义的对象,当程序进入入口函数main之前对象就已经定义,这时要调用构造函数。整个程序结束时调用析构函数。3.动态创建的对象,使用new创建对象, delete释放对象.静态成员由关键字static修饰说明的类

2022-05-17 16:37:02 257

原创 C++拷贝构造函数

拷贝构造函数拷贝构造函数:是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象拷贝构造函数还在另二个方面使用:1.当函数的形参是类的对象, 调用函数时, 进行形参与实参结合时使用。这时要在内存新建立一个局部对象, 并把实参拷贝到新的对象空间中。2.当函数的返回值是类对象, 函数执行完成返回调用者时使用。理由也是要建立一个临时对象中,再返回调用者。因为局部对象在离开建立它的函数时就消亡了,不可能在返回调用函数后继续生存,所以在处理这种情况时,编译系统会在调用函数的

2022-05-17 16:34:08 298

原创 C++友元

友元friend机制允许一个类授权其他的函数访问它的非公有成员.友元声明以关键字friend开头,它只能出现在类的声明中,它们不受其在类体中的public private和protected区的影响.友元分为外部函数友元,成员函数友元,类友元。友元没有共有私有类别,本身就是一个类别友元的特点:1.不具有对称性: A是B的友元,并不意味着B是A的友元。2.不具有传递性: A是B的友元,B是C的友元, 但A不是C的友元。3.不具有继承性: Base 类型继承Object类型,如果Object 类型

2022-05-17 16:28:43 105

原创 C++类与普通类型的相互转换

转换构造函数转换构造函数的作用是将一个其他类型的数据转换成一个类的对象。当一个构造函数只有一个参数,而且该参数又不是本类的const引用时,这种构造函数称为转换构造函数。转换构造函数是对构造函数的重载。将double型的参数r转换成Complex类的对象,将r作为复数的实部,虚部为0。Complex(double r) { real=r; imag=0; } 隐式转换用户可以根据需要定义转换构造函数,在函数体中告诉编译系统怎样去进行转换。//隐式转换c

2022-05-17 16:25:52 422

原创 C++构造函数和析构函数基本概念

构造函数构造函数用途:创建对象初始化对象类型转换定义:(生而不同)1.函数名与类名相同。2.构造函数无函数返回类型说明。注意是没有而不是void,即什么也不写,也不可写void。实际上构造函数有返回值,返回的就是构造函数所创建的对象。3.在程序运行时,当新的对象被建立,该对象所属的类构造函数自动被调用,在该对象生存期中也只调用这一次。4.构造函数可以重载。严格地讲,类中可以定义多个构造函数,它们由不同的参数表区分,系统在自动调用时按一般函数重载的规则选一个执行。5.构造函数可以在

2022-05-17 16:21:29 256

原创 C++命名空间

在C++中支持三种域:局部域、名字空间域和类域。名字空间域是随标准C++而引入的。它相当于一个更加灵活的文件域(全局域),可以用花括号把文件的一部分括起来,并以关键字namespace开头给它起一个名字花括号括起来的部分称声明块。声明块中可以包括:类变量(带有初始化)、函数(带有定义)等。最外层的名字空间域称为全局名字空间域即文件域。名字空间域的引入,主要是为了解决全局名字空间污染(global namespace pollution)问题,即防止程序中的全局实体名与其他程序中的全局实体名,命名

2022-05-17 16:13:48 272

原创 C++模板(函数模板,类模板)

模板概念函数模板可以用来创建一个通用功能的函数, 以支持多种不同形参,简化重载函数的设计。函数模板定义如下:template<模板参数表>返回类型函数名(形式参数表){ .....;//函数体}<模板参数表> (template parameter list)尖括号中不能为空,参数可以有多个,用逗号分开。模板参数主要是模板类型参数。模板类型参数(template type parameter)代表-种类型,由关键字class 或typename (建议用type

2022-05-17 16:09:49 333

原创 C++基于范围的for循环

模板:for(ElemType val: array){ statement 循环体....}ElemType:是范围变量的数据类型。它必须与数组(容器)元素的数据类型一样,或者是数组元素可以自动转换过来的类型。val :是范围变量的名称。该变量将在循环迭代期间依次接收数组中的元素值。在第一次循环迭代期间,它接收的是第一个元素的值;在第二次循环迭代期间,它接收的是第二个元素的值;以此类推。array:是要让该循环进行处理的数组(容器)(==必须包含长度和数组首地址两个元素==指针不可以)

2022-05-09 23:14:11 846

原创 C++ auto声明

auto类型推导: auto 定义的变量,可以根据初始化的值,在编译时推导出变量名的类型。int main(){ auto x=5;//ok x是int类型 auto pi = new auto(1); // ok pi 被推导为int *; const auto *xp = &x, u = 6; // ok xp是const int*类型,u是const int类型 static auto dx = 0.0; // ok dx是double类型 auto int b; // e

2022-05-09 23:11:27 830

原创 C++引用和指针的区别

程序为指针变量分配内存区域 而不为引用分配内存区域从语法规则上讲,指针变量存储某个实例(变量或对象)的地址; 引用是某个实例的别名。程序为指针变量分配内存区域; 而不为引用分配内存区域。解引用是指针使用时要在前加“*”;

2022-04-24 13:36:37 1049

原创 左值引用和右值引用

右值和左值 与类型无关可以取地址的是左值不可以取地址的是右值无名实体 将亡值是右值int & x=a; 左值引用用于引用可以取地址的值int && x=10; 右值引用用于引用不可取地址的值常引用和右值引用的区别int main(){ //常引用 const int& a= 10; //本质: const int tmp=10; // const int &a=tmp; //右值引用

2022-04-24 13:35:15 151

原创 C++引用基本概念

引用基本语法:数据类型 &别名=原名 (别名和原名指向同一块内存) int &b=a;1.引用必须初始化 int &a (error)2.引用初始化后不可更改3.不可有引用的引用(int& b=a;发现是引用,转换为int* const b =&a; 指针常量使指针指向不可更改,所以初始化后不可更改)引用一个不可取地址的量,这个量就会生成一个临时量然后被引用,而且临时量都具有常属性,所以要用常引用 const int &b=100;void

2022-04-24 13:33:50 1135

原创 C++内联函数

内联函数 替代c语言的宏函数 是一种更安全的宏1.内联的函数必须是非常简单的函数,不带if,for2.inline函数只在release版本中可用,debug版本中不可用当函数被调用的时候,会在编译时期在调用点将函数展开没有栈帧的开辟和回退,减少了现场保护和现场恢复,节省了大量时间空间inline 只是对编译器的建议,建议将该函数处理为内联inline函数只在当前文件有效吗,生成的是local符号inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开, 就没有函数地址

2022-04-24 13:31:38 974

原创 C++输入和输出

#include < iostream>using namespace std;当使用的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。system(“pause”);代表着在该程序中调用了pause命令,由操作系统来暂停程序的执行。cerr流对象cerr流对象是标准错误流,cerr流已被指定为与显示器关联。cerr的作用是向标准错误设备(standard error device)输出有关出错信息。cerr与标准输出流cout的作用

2022-04-24 12:54:19 145

原创 期末大作业图书管理系统(c++)源代码

功能展示运行效果:主界面:图书管理界面:读者管理界面:借还书管理界面:#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<Windows.h>#include<conio.h>using namespace std;#define BOOK_NUM 200#define READER_NUM 100#define LEN_BOOK sizeof(Book)#define L

2022-03-12 16:52:38 11300 8

原创 生产者消费者问题

生产者/消费者问题,也被称作有限缓冲问题。可以描述为:两个或者更多的线程共享同一个缓冲区,其中一个或多个线程作为“生产者”会不断地向缓冲区中添加数据,另一个或者多个线程作为“消费者”从缓冲区中取走数据。生产者/消费者模型关注的是以下几点:生产者和消费者必须互斥的使用缓冲区缓冲区空时,消费者不能读取数据缓冲区满时,生产者不能添加数据生产者消费者模型优点:1.解耦:因为多了一个缓冲区,所以生产者和消费者并不直接相互调用,这样生产者和消费者的代码发生变化,都不会对对方产生影响。这样其实就是把生产者

2022-01-27 21:44:29 3802

原创 Linux:线程

线程的实现方式在操作系统中,线程的实现有以下三种方式:内核级线程用户级线程组合级线程Linux 中线程的实现:Linux 实现线程的机制非常独特。从内核的角度来说,它并没有线程这个概念。 Linux 把所有的线程都当做进程来实现。内核并没有准备特别的调度算法或是定义特别的数据结构来表征线程。相反,线程仅仅被视为一个与其他进程共享某些资源的进程。每个线程都拥有唯一隶属于自己的 task_struct,所以在内核中,它看起来就像是一个普通的进程(只是线程和其他一些进程共享某些资源,如地址空

2022-01-27 21:42:19 1056

原创 Linux:进程间通信IPC:共享内存

共享内存共享内存为多个进程之间共享和传递数据提供了一种有效的方式。共享内存是先在物理内存上申请一块空间,多个进程可以将其映射到自己的虚拟地址空间中。 所有进程都可以访问共享内存中的地址,就好像它们是由 malloc 分配的一样。如果某个进程向共享内存写入了数据,所做的改动将立刻被可以访问同一段共享内存的任何其他进程看到。由于它并未提供同步机制,所以我们通常需要用其他的机制来同步对共享内存的访问。共享内存示例代码#include <sys/ipc.h>#include <sy

2021-12-10 10:32:20 128

原创 ipcs/ipcrm 介绍

ipcs 可以查看消息队列、共享内存、信号量的使用情况,使用 ipcrm 可以进行删除操作。ipcs -s 查看信号量数组ipcs -m 查看共享内存段ipcs -q查看消息队列删除对应的信息 ipcrm -s id号 ipcrm -m id号 ipcrm -q id号...

2021-12-10 10:29:05 302

原创 Linux:进程间通信IPC :信号量

信号量信号量主要用来同步进程信号量是一个特殊的变量,一般取正数值。它的值代表允许访问的资源数目,获取资源时,需要对信号量的值进行原子减一,该操作被称为 P 操作。当信号量值为 0 时,代表没有资源可用, P 操作会阻塞。释放资源时,需要对信号量的值进行原子加一,该操作被称为 V操作。临界资源:同一时刻只允许一个进程访问的资源临界区:访问临界资源的代码段信号量的值如果只取 0,1,将其称为二值信号量。如果信号量的值大于 1,则称之为计数信号量。操作信号量的接口介绍:#include &lt

2021-12-10 10:23:24 198

原创 Linux:进程间通信IPC:管道

管道有名管道有名管道可以在任意两个进程之间通信有名管道的创建:命令创建: mkfifo FIFO系统调用创建#include <sys/types.h>#include <sys/stat.h>//filename 是管道名 mode 是创建的文件访问权限int mkfifo(const char *filename, mode_t mode);在a.c上写数据在b.c上读数据,在两个窗口运行两个程序,一个写数据,另一个同步读出数据a.c写文件#incl

2021-12-10 10:18:34 511

原创 Linux:信号

信号:通知进程产生了某个事件9号杀死信号无法被修改,防止进程无法结束信号是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作。与信号有关的系统调用在“signal.h”头文件中有声明常见信号的值,及对应的功能说明:信号的值在系统源码中的定义如下:#define SIGHUP 1#define SIGINT 2 //键盘按下 Ctrl+c 时,会产生该信号#define SIGQUIT 3#define SIGILL 4#define SIGTRAP 5#define SIG

2021-12-10 10:13:09 80

原创 自己编写bash,实现自己的命令

mybash#include<stdio.h>#include<sys/wait.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<fcntl.h>#include<pwd.h>#define argc 10#define PATH "/home/cao/mybash/mybin/"//存放实现自己命令的地址char* get

2021-12-02 09:44:25 358

原创 Linux:信号的使用

信号:通知进程产生了某个事件9号杀死信号无法被修改,防止进程无法结束信号是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作。与信号有关的系统调用在“signal.h”头文件中有声明常见信号的值,及对应的功能说明:信号的值在系统源码中的定义如下:#define SIGHUP 1#define SIGINT 2 //键盘按下 Ctrl+c 时,会产生该信号#define SIGQUIT 3#define SIGILL 4#define SIGTRAP 5#define SIG

2021-12-01 23:32:05 124

原创 判断大小端与大小端相互转换

判断大小端bool lslittle(){ typedef union B { short a; char b; }B; B a; a.a = 1;//short a在内存中存放是 01 00 return a.b == 1;//当char b的值和01相等时就是小端,返回true}int main(){ if (lslittle()) { printf("小端"); } else { printf("大端"); } return 0;}小端转大

2021-11-18 11:50:30 198

原创 Linux:vim命令合集

模式切换:1.命令模式切换到插入模式:1.a 进入到当前光标后开始编辑A 进入到当前光标所在行的行末开始编辑i 进入当前光标位置开始编辑I 进入当前光标所在行的行头开始编辑o 进入当前光标下一行开始编辑O 进入当前光标上一行开始编辑2.命令模式切换到末行模式 :: 对文本的设置或保存工作/ 对文本进行全文向下搜索字符串 string? 对文本进行全文向上搜索字符串 string命令模式下的命令:n dd 删除光标开始向下的 n 行(剪切删除,删除了可以再粘贴)n

2021-11-17 12:57:41 144

原创 Linux:fork 和 exec 联合使用创建 bash

exec 系列替换过程:int execl(const char* path, const char * arg,…);int execlp(const char* file, const char * arg,…);int execle(const char* path, const char * arg,…,char* const envp[]);int execv(const char * path, char* const argv[]);int execvp(const char * f

2021-11-14 17:00:38 471

原创 Linux:文件操作的系统调用

int open(const char pathname, int flags);*//用于打开一个已存在的文件int open(const char pathname, int flags,mode_t mode);*//用于新建一个文件,并设置访问权限pathname:将要打开的文件路径和名称flags : 打开标志,如 O_WRONLY 只写打开O_RDONLY 只读打开O_RDWR 读写方式打开O_CREAT 文件不存在则创建O_APPEND 文件末尾追加

2021-11-14 16:29:28 1158

原创 Linux:fork 进程复制

printf 函数并不会直接将数据输出到屏幕,而是先放到缓冲区中,只有一下三种情况满足,才会输出到屏幕。1) 缓冲区满2) 强制刷新缓冲区 1.fflush(stdout)(stdout:标准输出文件) 2. /n 两种都可以刷新缓冲区 缓冲区大小为1kb3) 程序结束时fork 函数fork 函数会新生成一个进程,调用 fork 函数的进程为父进程,新生成的进程为子进程。执行一次fork,生成一个子进程。在父进程中调用fork返回子进程的 pid,在子进程中调用fork返回 0,

2021-11-14 16:15:47 117

原创 Linux:库文件:静态库与共享库

静态库:书写格式:lib+库名.a生成静态库文件代码:ar crv libfoo.a add.o max.oc是创建库,r是将方法添加到库中,v是显示过程库后面是链接的.o文件共享库:生成共享库文件代码:gcc -shared -fPIC -o libfoo.so add.o max.o库的使用(静态库和共享库通用):gcc -o main main.c -L. -lfoo根据库libfoo.a生成可执行文件main-L指定库的存储路径-l指定库的名称如果在库的存储路

2021-11-14 15:54:48 741

原创 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。(C语言)

int Cmp(const void* x, const void* y){ return *(int*)x - *(int*)y;}int singleNumber(int* nums, int numsSize){ if (numsSize == 1) { return nums[0]; } qsort(nums, numsSize, sizeof(int), Cmp);//快排 int tmp = 0; int i = 0; while (1)//依次相加减,剩下的就是多余

2021-10-26 13:52:19 755 1

原创 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序(C语言)

char* reverseWords(char* s) { int len = strlen(s); int count = 0;//单个字符串长度 for (int i = 0; i <= len; i++) { if (s[i] == ' ' || s[i] == '\0') { int k = i - count; count = 0; for (int j = i - 1; j > k; k++, j--) { char tmp = s[

2021-10-24 22:17:48 1519

原创 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。(C语言,O(1)空间复杂度)

void rotate(int* nums, int numsSize, int k){ if (numsSize < k)//当要移动的数字长度大于数组长度 { while (numsSize < k) { k = k - numsSize; } } int i = 0; int j = numsSize - 1; for (; i < j; i++, j--)//将整个数组逆置 { int tmp = nums[i]; nums[i] = n

2021-10-18 21:40:15 368

原创 写一个函数,输人一行字符,将此字符串中最长的单词输出(C语言)

char *lengthOfLastWord(const char* s){ char* p = (char*)calloc(strlen(s) + 1, sizeof(char)); assert(s != NULL); if (s == NULL) return NULL; int count = 0;//计数器 int max = 0;//记录最大的单词位数 int cur = 0;//字符串拷贝的下标 int i = 0; for (; i < (int)strlen

2021-10-17 21:19:53 364

原创 统计字符串中的单词个数(C语言)

int countSegments(char* s){ int count = 0; int i = 0; if (strlen(s) == 0) { return 0; } for (; s[i] != '\0'; i++) { if (s[i] != ' ' && s[i + 1] == ' ') { count++; } } if (s[i - 1] != ' ' && count == 0)//只有一个单词的时候 {

2021-10-08 13:44:28 620

原创 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度

int lengthOfLastWord(char* s){ int count = 0; int i = strlen(s) - 1; while (s[i] == ' ') { i--; }//防止出现最后是空格情况 for (; s[i] != ' '; i--) { if (i == 0)//遍历到头就返回计数器,返回count+1为了防止数组越界 { return count + 1; } count++; } return count;}

2021-09-25 23:09:41 4046

原创 用筛选法求 n 以内的素数

void Prime(int n){ int* arr = (int*)malloc(n * sizeof(int));//创建动态内存 int f = 1; for (int i = 0; i < n; i++) { arr[i] = f; f++; }//赋值 for (int j = 2; j < n; j++) { for (int k = j + 1; k < n; k++) { if (arr[k] % j == 0) {

2021-09-23 10:54:38 506

原创 调整数组顺序使奇数位于偶数前面

void Change(int* arr, int len){ int i = 0; int j = i + 1; while (i < len) { if (arr[i] % 2 == 0)//i从第一个数字遍历判断数字是否是偶数 { while (j < len) { if (arr[j] % 2 == 1)//j从i的下一个数字判断数字是否是奇数,如果是就不停交换两个数之间的数字 { int count = 0; for (

2021-09-23 10:53:12 50

原创 Myitoa与Myatoi 数字与字符串的相互转换

将字符串转为对应的数字, 例如 “1234”->1234; “1234a5”->1234int Myatoi(const char* str){ int sum = 0; for (int i = 0; str[i] != '\0'; i++) { if (isdigit(str[i])) { sum = sum * 10 + (str[i] - 48); } } return sum;}将数字转为字符串 1234->“1234”;-1234->

2021-09-23 10:52:37 110

数据库课程设计(网上销售系统)

自己写的课程设计,包含word文档,cdm,pdm文件,sql代码和ldf数据库本体

2021-07-12

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除