- 博客(35)
- 资源 (1)
- 收藏
- 关注
原创 C++编程基础——虚析构函数
虚析构函数在实现继承关系时,通常将顶层父类的析构函数定义为虚函数(其直接子类和间接子类中的析构函数都将自动变为虚函数),这样做的意义:通过父类指针或引用释放堆区中的子类对象时,该子类对象的析构函数会被执行,否则不会被执行,将可能造成内存泄漏。#include <iostream>using namespace std;class A{public: virtual ~A() { cout << "~A()" << endl;
2022-04-01 13:11:34 1118
原创 C++编程基础——字符串类设计与实现实战
头文件:#ifndef _MYSTRING_H_#define _MYSTRING_H_#include <iostream>namespace dj{ class mystring { private: char* buff; public: mystring(); mystring(const char* str); mystring(const mystring& str
2022-04-01 13:06:23 1352
原创 C++编程基础——继承、对象类型转换、虚函数、多态
对象类型转换向上转型:子类类型转化为父类类型,有意义、安全、可以隐式进行。向下转型:从父类类型转化为子类类型,不一定有意义、也不一定安全、必须由我们自己进行强制类型转换。mutable关键字:异变的、可变的,该关键字修饰的变量总能被修改,不受 const 关键字的影响。虚函数(Virtual Function)用 virtual 关键字修饰的方法就是虚函数(虚方法)当用一个父类指针或引用指向某个子类对象时,通过这个指针或引用调用父类中的某个虚函数,如果子类重写(Override)了父类中的这个虚
2022-03-30 12:59:19 834
原创 C++编程基础——类中成员、对象数组、设计模式、继承
类中成员(Class Member)属性(成员变量)方法(成员函数)类型内部类:也称嵌套类类中(匿名)枚举类型的作用:可以将其枚举元素作为类级常量使用(简单场合下(整型)),相比静态常量更方便。非静态常属性只是对象级常量。属性也可以为引用成员,注意其初始化语法。对象数组(Object Array)数组元素为对象(类类型的数据)设计模式(Design Mode)常用设计模式:单例模式、工厂模式、观察者模式、代理模式等。单例模式的实现。继承(Inheritance)在某个已存在的类
2022-03-30 12:50:51 1272
原创 C++编程基础——new/delete与malloc/free区别、运算符重载等
new/delete 和malloc/free 的区别共同点:功能相同,new 和malloc 都是在堆区申请指定大小的内存空间,delete 和 free 都是释放指定的一块堆区内存空间(内部实现细节不同,不要混用)。不同点:new 和 delete 是 C++中新增的运算符,而malloc 和 free 是函数,所以运算符的执行效率比函数高(对于非对象数据)。对于非对象数据,它们基本没有区别。对于对象数据:使用 new 运算符在堆区给对象申请空间后,还会调用对像的某个匹配的构造函数,而m
2022-03-28 09:55:18 1107
原创 C++编程基础——static/const关键字、拷贝构造函数
紧接前一节内容:static/const关键字常对象、常对象引用、常对象指针:所表示的对象的属性是只读的,通过它们不能调用非常方法;常方法更加通用,它既能被常对象(常对象引用、常对象指针)调用,也能被非常对象(非常对象引用、非常对象指针)调用。如果常方法和非常方法构成重载,那么常对象(常对象引用、常对象指针)调用的将是常方法,而非常对象(非常对象引用、非常对象指针)调用的将是非常方法。static 关键字和 const 关键字可以联合使用,用于修饰属性或方法,即静态常属性和静态常方法。开发规范类
2022-03-25 21:57:13 625
原创 C++编程基础——构造函数、析构函数、static/const关键字
构造函数和析构函数构造函数:Constructor,也称为构造方法或构造器,主要用于对对象的属性进行初始化。它是一个特殊的方法,其特点如下:没有返回值,并且方法名必须和类名同名;和普通方法一样,也支持重载;每个对象在创建时(给对象分配完内存空间)必定会自动调用某一个匹配的构造函数,所以我们可以在构造函数中对对象进行初始化。我们通常不会去显式调用构造函数;注意:如果我们在类中没有定义任何构造函数,C++编译器会自动提供一个默认的无参构造函数,这个构造函数啥事没干。反之,只要我们自己定义了任何形
2022-03-25 14:04:32 1715
原创 C++编程基础——宏、函数、面向对象
函数函数重载(Function Overload)函数名相同,但形参类型列表不同(即形参的数量或类型不同)。默认参数(Default Argument)函数参数可以带默认值,简化函数调用。默认参数必须全部放在形参列表的最右边,并且必须连续排列。面向对象编程OOP:Object Oriented Program,面向对象编程。对象(Object):任何一个具体的事物。类(Class):具有相同特征的一些对象的抽象,并不是具体存在的事物。对象是类的实例(Instance),类是对象的抽象。
2022-03-24 09:27:48 268
原创 C++编程基础——基本数据类型、运算符、名字空间
C++编程基础C++ 于1982年左右诞生于美国贝尔实验室。C++:C Plus Plus,一门支持面向对象编程的高级语言。C++ 直接继承了C语言的几乎所有语法特性,并在此基础上新增了面向对象编程机制,比如类、对象、继承、多态等,还有一些对大型复杂软件项目开发有意义的语法特性,比如引用、重载、模板、RTTI、异常处理等。C++ 程序运行效率略低于 C语言,但开发效率远高于 C 语言。C++ 学习方法:C语言学会了就相当于已经学会了 C++ 大部分内容(85%),只需再学习一下 C++ 新增的内容
2022-03-23 09:40:03 784
原创 Linux高级编程——数据库(触发器、导入导出、C语言调用)
触发器Trigger在发生某个事件,或满足某个条件时自动被执行的存储过程。三种不同粒度的触发器:表级:动表n次触发n次行级:动行n次触发n次列级:动列n次触发n次创建mysql> delimiter #mysql> create trigger t_so after insert on score/*在score表中设置一个触发器*/ -> for each row -> begin -> update score se
2022-03-23 09:29:56 1236
原创 Linux高级编程——数据库(事务、视图、索引、存储、函数)
子查询:即嵌套查询,就是将一条 SELECT 语句的执行结果当作一个单值、集合或临时表参与另外一个 SELECT 查询。where:对笛卡尔集进行筛选,having是对分组后的表进行筛选;AOTU_INCREMENT设置字段自动递增特性时,其字段必须为key,新增插入时,会以表中最大值为基础+1事务控制所谓事物,就是一系列数据库操作,但是它们具有原子性。要么全部成功完成,要么啥操作都没有做。事务的四大特性:ACID原子性(Atomicity)一致性(Consistency)隔离性(Iso
2022-03-19 19:16:57 565
原创 Linux高级编程——数据库(表操作)
在数据库中创建表,并进行 CRUD 操作。在库中进行表操作,先use 库名进入库提示Database changed创建一个表:mysql> CREATE TABLE student( -> sno INT UNSIGNED, -> name VARCHAR(20), -> sex CHAR, -> sight FLOAT(2,1), -> birth DATE, -> phone CHAR(11)-> );查看表:mysql>
2022-03-18 22:06:53 1161 1
原创 Linux高级编程——数据库(安装、创建、删除)
数据库(Database)存放和管理数据的仓库,用于管理大量或海量数据。少量数据请使用文件存放和管理,但是对于大量数据,使用数据库将更加方便。数据库管理系统(Database Management System,DBMS),简称数据库(DB)。如果不用数据库:Program <---------> File如果使用数据库:Program <---------> DBMS <--------->File数据库管理系统分为:关系型数据库管理系统(Relatio
2022-03-18 22:02:01 747
原创 Linux高级编程——网络通信UDP
基于 UDP 协议的通信User Datagram Protocol,用户数据报协议。UDP 协议是无连接,传输不可靠(尽力而为),但传输效率很高。UDP 协议传输不可靠:内部没有流量和拥塞控制机制,一旦接收方缓冲区满,它不会通知和阻塞发送方,就会发生丢包。由于接受不会对接收的数据包进行排序处理,只是简单的按照数据包的到达顺序接收处理,所以可能会发生乱序问题。UDP 协议不存在粘包问题,因为它是严格以数据包为单位进行手法处理的。UDP 协议支持空数据包,可以用作通知或心跳包(或保活)。U
2022-03-17 10:33:10 4133
原创 Linux高级编程——项目版本管理git
项目版本管理主流项目版本管理工具:git:分布式的项目版本管理工具svn:集中式的项目版本管理工具基于 git 项目代码托管平台:gitee:国内的码云;github:国外的,号称"全球最大的程序员同性交友社区";基于 gitlab 开源项目可以轻松搭建一个像 github/gitee 这样的网站安装git sudo apt install git创建工程目录 mkdir s_mgr创建 git 创库 git init提交至暂存区git add 文件名 文件名,git status(
2022-03-14 23:18:33 233
原创 Linux高级编程——网络通信实现TCP(2)
为解决TCP协议中的粘包问题,提供以下实例说明:需结合注释里的内容,原理请参考网络通信(1)客户端#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include
2022-03-14 22:57:05 2855
原创 Linux高级编程——网络通信实现TCP(1)
基于TCP协议的文件传输(套接字)实例:客户端:只用于收文件;执行命令:./执行文件名 IP Port// 客户端 输入 ./执行文件 IP Port#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/socket.h>#include <
2022-03-14 22:53:00 2955
原创 Linux高级编程——TCP(套接字)(双向通信、文件传输)
网络通信编程实现基于 TCP 协议的通信TCP:Transmission Control Protocol,传输控制协议,传输层的一个非常重要的协议,负责数据传送。面向连接、传输可靠、但通信效率较低。基于 TCP 通常采用 C/S 模式,即客户端(Client)/服务器(Server)模式,客户端程序和服务器端程序的实现不一样,它们是不对等的。每次通信都是由客户端主动发起(即连接服务器),服务器端被动参与通信(即接收客户端的连接请求)。基于 TCP 协议通信的过程如同打电话的通信过程。TCP 服务
2022-03-12 09:40:59 3370
原创 Linux高级编程——网络通信
计算机网络通信技术即套接字(Socket)通信编程技术常识:三大通信网络:电信网络计算机网络:建设成本极低,开放式。有线电视网络根据计算机网络的覆盖范围大小,分为局域网(Lock Area Newwork,简称LAN)、城域网、广域网、互联网(Internet)。IP 地址:Internet Protocol Address,用来标识一台机器在计算机网络世界中的地址。有两种版本:IPv4 和 IPv6,IPv4使用 32 位的无符号整数表示地址,通常采用四段点分式记法,每一段的范围为
2022-03-12 09:38:58 3139
原创 Linux高级编程——多线程控制(读写锁、自旋锁、条件变量)
读写锁(RW Lock)实现 "读操作允许并发执行、写操作只允许互斥执行、读和写操作只允许互斥执行"的同步控制效果。pthread_rwlock_wrlock 写锁pthread_rwlock_rdlock 读锁读写锁特性:读锁共享,写锁互斥、写锁优先写写互斥,读写互斥,读读共享#include <stdio.h>#include <time.h>#include <stdlib.h>#include <sys/types.h>#inclu
2022-03-10 09:06:24 262
原创 Linux高级编程——多线程控制(互斥锁、信号量)
多线程同步控制常用的同步控制方法:互斥锁(Mutex)信号量(Semaphore)条件变量(Condition Variable)读写锁(Read-Write Lock)自旋锁(Spin Lock)互斥锁多个线程对某个只能独占使用的资源进行互斥访问可以使用互斥锁。当某个线程调用 pthread_mutex_lock 函数时:如果互斥锁已经处于锁定状态,该函数会阻塞调用线程的执行,直到其他线程解锁才可能从 pthread_mutex_lock 函数返回继续往下执行。如果互斥锁处于未
2022-03-08 19:58:29 603
原创 Linux高级编程——线程(2)
结束线程方法:线程返回调用 pthread_exit 函数(自杀)调用 pthread_cancel 函数(他杀)当所杀的线程内调用了pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);则调用pthread_cancel 函数没有作用pthread_setcancelstate意为对Cancel信号的反应(disable表忽略)调用一个全局变量注意:在 main 函数中,return 语句和 pthread_exit
2022-03-08 19:54:57 543
原创 Linux高级编程——线程
线程进程内部的一条执行路径。多任务并发:同一进程创建多个线程并发处理。线程属于进程,一个进程内部可以拥有多个线程,至少有一个线程,这个线程称为主线程(Main Thread);一个线程只能属于某个进程,不可能属于多个进程。同一个进程的所有线程共享该进程的所有资源,所以通信非常容易实现。线程是操作系统调度执行的基本单位,负责执行代码;进程是操作系统分配资源的基本单位;操作系统通过线程 ID 标识不同的线程。(pthread)操作系统中的所有线程分时复用 CPU ,并发执行。由于线程调度
2022-03-08 00:05:08 526
原创 Linux高级编程——进程通信(共享内存、消息队列)
共享内存(Shared Memory)多个进程可以共享访问的一段内存空间,最快的 IPC 方式。生命周期:如果不删除,与内核相同,关机即消失。相关的系统调用:shmget:创建或获取一段共享内存空间。shmat:将共享内存映射到当前进程的私有虚拟地址空间shmdt:取消共享内存映射;shmctl:对共享内存进行各种控制,比如删除等;查询系统所有共享内存段信息ipcs -m删除系统中某个共享内存段ipcrm -m shmid(共享内存段id)shmgetshmget(key_
2022-03-04 16:02:16 1174
原创 Linux高级编程——进程通信(管道pipe)
管道(Pipe)——特殊文件同步实现同一台机器上的两个进程之间同步传输大量数据。int pipe(int pipefd[2]);[0]为读,[1]为写管道分为两种:匿名管道(只能用于具有亲缘关系的进程间通信)命名管道(就是磁盘上的一个特殊文件,任何知道该文件路径的进程都可以使用它进行通信)mkfifo 管道名上述命名创建一个以管道名而生成的命名管道文件,类型为p;若使用cat 读取文件内容,此时,该文件则会清空;管道只要有人读取数据,则读取到的数据在管道中直接消失,全部读完则管
2022-03-04 09:53:07 478
原创 Linux高级编程——进程通信(信号signal)
进程间通信(IPC,Inter-Process Communication)两个或多个进程间进行数据传送,参与通信的这些进程可能位于同一台机器上,也可能位于不同的机器上。常用 IPC 方式:信号(Signal)管道(Pipe)共享内存(Shared Memory)消息队列(Message Queue)套接字(Socket)信号(Signal)Linux 系统上古老经典的 IPC方式,主要用于实现异步通知,不能传输数据。信号是一种软件中断(Software Break)void (*
2022-03-04 09:49:08 1842
原创 Linux高级编程——进程
进程就是正在运行的程序,或程序的一次执行过程。通过同一程序可以产生多个进程(即所谓的多开)。操作系统(Operating System,简称OS)会给每个进程分配一个不同的整数编号(大于或等于1),这个编号就是所谓的PID(Process Identification,进程 ID),操作系统就是通过 PID区分和管理不同的进程。进程是操作系统分配资源(PID、私有地址空间)的基本单位。一旦进程结束后,操作系统会自动回收进程所有的资源。系统中的所有进程可以并发或并行执行。特点:多任务并发,高并发。
2022-03-03 09:12:52 623
原创 Linux高级编程——文件系统管理
文件系统管理 如果说将文件系统看成树形结构,那么文件夹就是分支节点,文件就是叶子节点。Linux系统调用(System Call):就是 Linux 系统提供的一堆函数,只能用于 Linux 系统/Unix系统。操作系统源码:https://www.kernel.org/文件 I/O 相关函数:open:打开文件,如果成功就返回一个文件描述符(File Descriptor,就是一个非负整数,范围为:0 ~65535)close:关闭文件readwritelseek:文件指针位置,可
2022-02-25 17:30:50 642
原创 Linux 操作——详解ls
ls命令:文件访问权限的具体意义:r:read,可读,即可以查看文件的内容。对于普通文件,表示可以查看其数据内容,例如使用cat等命令;对于文件夹,表示可以查看它里面的文件信息,例如使用ls等命令。w:write,可写,即可以修改文件的内容。对于普通文件,表示可以修改其数据内容,例如使用vi等命令;对于文件夹,表示可以在它里面增加或删除文件。x:eXecute,可执行。对于普通文件,表示可以运行它(前提是该文件确实是可以执行的程序,否则没有意义);对于文件夹,表示可以打开和进入它里面(例如使用cd
2022-02-25 09:47:05 558
原创 Linux系统简介及简要shell命令介绍(2)
用户和组群管理组群(Group)管理相关命令groupadd:创建一个新组群groupdel:删除某个组群groupmod:修改某个组群的属性信息cat /etc/group:查看系统中所有组群信息用法:sudo 命令 名称man:manul,查看帮助手册。戏称:在Linux世界中,有问题找“男人”用户(User)管理相关命令useradd:adduesr,创建一个新用户(在Debian/Ubuntu系统中需要带上-m参数,否则不会自动创建主目录)通常使用useradd 用户名 -m
2022-02-25 09:35:57 587
原创 Linux高级编程——库
Linux 高级编程库(Library)库分为:源码库静态库:也称为静态链接库(Static Link Library)动态库:也称为共享库(Shared Library)、动态链接库(Dynamic Link Library)通过源码库可以实现源代码级别的复用,通过静态库或共享库可以实现二进制级别的复用(保护自己的源代码)制作静态库文件的步骤:将相关源文件(.c)编译为对应的目标文件(.o),使用 gcc -c 源文件名称 命令将上一步得到的所有目标文件打包为静态库,使用 ar -
2022-02-24 19:01:49 224
原创 C语言程序复杂数据类型(共用体与枚举)
C语言复杂数据类型共用体(Union)也称为联合体,由多个数据成员构成,但这些数据成员共享同一段内存空间。对某个数据成员赋值会覆盖其他数据成员,在某一时刻起作用的只有某一个数据成员(最近被赋值的那个数据成员)。共用体的大小为其最长的数据成员所占内存空间大小。共用体在实际开发中用的并不多,可以用于轻松分离一个多字节数据的每个字节,用于判断当前系统的存储模式等场景。一般用的是小端存储模式(高字节高地址)51单片机用的大端存储模式(高字节低地址)验证存储模式方法:union{ short s
2022-02-10 18:17:57 504
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人