C/C++
盼盼编程
这个作者很懒,什么都没留下…
展开
-
动态拼接字符串
工作中有时候需要传入不定个数的字符串,就需要专门写一个函数动态添加字符串,下面看下函数:#include <iostream>#include <cstring>#include "stdarg.h"std::string append(int count,const char* msg, ...){ std::string srcStr; va_list vaList; va_start(vaList, msg); char...原创 2020-09-14 21:19:51 · 16030 阅读 · 7 评论 -
构造函数为啥不能声明为虚函数
原因:构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是运行期间确定实际类型的。 虚函数的执行依赖于虚函数表。而虚函数表在构造函数中进行初始化工作,原创 2020-09-01 21:57:46 · 9341 阅读 · 7 评论 -
extern“C”有什么作用
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生产的不一致,造成C++不能直接调用C函数,加上Extern “C”后,C++就能直接调用C函数了。(实现C与C++的混合编程)表示用到C语言中的变量或函数...原创 2020-09-01 21:56:42 · 11615 阅读 · 4 评论 -
strcpy()和memcpy()的区别
Strcpy和memcpy都可以用来拷贝字符串,strcpy以\0结束,但memcpy必须指定拷贝的长度,类似于strncpyStrncpy与memcpy类似,区别是:当遇到\0时,strncpy停止复制,而memcpy会继续复制。使用memcpy时,确保最后一个字符时\0....原创 2020-09-01 21:56:02 · 9447 阅读 · 3 评论 -
UML几个关系图表示
继承:空心三角形+实线依赖:虚线箭头[A需要B表示依赖]关联:实线箭头[A需要了解(知道)B表示关联]聚合:实线箭头+空心菱形[A可以包含B,但B不是A的一部分表示聚合]原创 2020-08-31 21:41:31 · 9661 阅读 · 5 评论 -
单例模式简短代码
class singleton //实现单例模式的类{private: singleton() {} //私有构造函数 static singleton *instance; //静态类指针public: static singleton *GetInstance() //静态成员函数 { if(Instance == NULL) //判断是否是第一次调用· Instance = new singleton(); return In.原创 2020-08-31 21:40:24 · 9522 阅读 · 7 评论 -
虚函数表 vtable
如果一个类包含了虚函数,那么在创建对象时会额外增加一张表,表中的每一项都是虚函数的入口地址。这张表就是虚函数表,也称为 vtable。 可以认为虚函数表是一个数组。 为了把对象和虚函数表关联起来,编译器会在对象中安插一个指针,指向虚函数表的起始位置。虚函数表在编译的时候就确定了,而类对象的虚函数指针vptr是在运行阶段确定的,这是实现多态的关键!...原创 2020-08-31 21:39:28 · 9898 阅读 · 6 评论 -
BOOL,int,float,指针变量 与“零值”比较
BOOL型变量:if(!var)Int型变量:if(var==0)Float型变量:Const float EP=0.00001;If(x>=-EP&&x<=-EP)指针变量:if(var==NULL)原创 2020-08-29 21:56:58 · 10060 阅读 · 3 评论 -
c++模板函数
编写模板函数,交换变量a和b的值(可能是int,float,double)template<typename T> //template<typename T> //只需加这一段代码 const T* my_find(T *a,T *b) { T tmp; tmp = x; x = y; y = tmp; }...原创 2020-08-28 22:11:17 · 9383 阅读 · 1 评论 -
c++string类默认函数实现
c++ string类默认几种函数实现。//构造函数传const指针//参数都是取引用/*class String{public: String(const char *str = NULL);//普通构造函数 String(const String &other);//拷贝构造函数,参数为const String & operator=(const String &other);//赋值函数,返回值为构造的对象 ~String(void);/.原创 2020-08-28 22:09:57 · 10041 阅读 · 1 评论 -
c++常见类型转换
const_cast顾名思义,用来将对象的常量性转除,使常量可以被修改,const_cast(varible)中的type必须是指针。static_cast用来处理隐式转换,它可以将int转为float,也可以将char*转为int,将指向基类的指针转为一个指向子类的指针,同时可以将non-const转为const对象dynamic_cast用于在类的继承层次之间进行类型转换,它既允许向上转型,也允许向下转型。该函数只能在继承类对象的指针之间或引用之间进行类型转换,或者有虚函数的类reinte.原创 2020-08-27 21:51:09 · 9852 阅读 · 1 评论 -
C++内存分配方式
栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束是这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率高,分配的内存容量有限。堆,就是那些由malloc等分配的内存块,用free来释放内存。自由存储区,那些由new分配的内存块,由应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C原创 2020-08-27 21:49:06 · 9523 阅读 · 2 评论 -
c++几种继承方式
公有继承方式在公有继承时,派生类的对象可以访问基类中的公有成员;派生类的成员函数可以访问基类中的公有成员和保护成员私有继承基类成员对派生类对象的可见性对派生类对象来说,基类的所有成员都是不可见的保护继承基类成员对派生类的可见性对派生类来说,基类的公有成员和保护成员是可见的:基类的公有成员和保护成员都作为派生类的保护成员,并且不能被这个派生类的子类所访问;基类的私有成员是不可见的:派生类不可访问基类中的私有成员...原创 2020-08-27 21:45:51 · 9750 阅读 · 1 评论 -
C++虚函数的实现方式
编译时若基类中有虚函数,编译器为该的类创建一个一维数组的虚表,存放是每个虚函数的地址。基类和派生类都包含虚函数时,这两个类都建立一个虚表。构造函数中进行虚表的创建和虚表指针的初始化。在构造子类对象时,要先调用父类的构造函数,初始化父类对象的虚表指针,该虚表指针指向父类的虚表。执行子类的构造函数时,子类对象的虚表指针被初始化,指向自身的虚表。每一个类都有虚表。虚表可以继承,如果子类没有重写虚函数,那么子类虚表中仍然会有该函数的地址,只不过这个地址指向的是基类的虚函数实现。当用一个指针调用一个函数的时候原创 2020-08-26 21:58:01 · 10619 阅读 · 9 评论 -
常见排序算法时间复杂度
冒泡排序:最差,平均都是O(n^2),最好是O(n)插入排序:最差,平均都是O(n^2),最好是O(n)归并排序:最差,平均,最好都是O(nlogn)选择排序:最差,平均都是O(n^2)希尔排序:O(nlogn)堆排序 :最差,平均,最好都是O(nlogn)快速排序:平均O(nlogn),最坏情况下O(n^2)...原创 2020-08-25 22:26:53 · 9995 阅读 · 2 评论 -
何时会调用拷贝构造函数
拷贝构造函数什么时候用到当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用。也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数:①程序中需要新建立一个对象,并用另一个同类的对象对它初始化,如前面介绍的那样。② 当函数的参数为类的对象时。在调用函数时需要将实参对象完整地传递给形参,也就是需要建立一个实参的拷贝,这就是按实参复制一个形参,系统是通过调用复制构造函数来实现的,这样能保证形参具有和实参完全相同的值。③ 函数的返回.原创 2020-08-25 22:23:38 · 13646 阅读 · 4 评论 -
常见设计模式说明
简单工厂模式:需要在工厂类中做判断,从而创造相应的产品。当增加新的产品时,就需要修改工厂类,但这违反了开放封闭原则(可以扩展,但是不可以修改)工厂方法模式:是指定义一个用于创建对象的接口,让子类决定实例化哪一个类。该方法使一个类的实例化延迟到其子类。缺点是:每增加一种产品,就需要增加一个对象的工厂,这就需要更多的类定义抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类策略模式:定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的原创 2020-08-24 23:23:34 · 9668 阅读 · 1 评论 -
设计模式六大原则
设计模式6大原则:单一职责原则:一个类只负责一个功能领域的相应职责,即一个类只有一个引起它变化的原因开闭原则:一个软件实体应当对扩展开放,对修改关闭,即软件实体应尽量在不修改原有代码的情况下进行扩展里式替换原则:所有引用父类的地方必须能透明的使用其子类对象。在软件中一个父类替换成它的子类对象,程序将不会产生任何错误和异常依赖倒置原则:抽象不应该依赖与细节,细节应当以来于抽象。要针对接口编程,而不是针对实现编程,这降低了客户与实现模块之间的耦合接口隔离原则:使用多个专门的接口,而不是使用单一的总...原创 2020-08-24 01:34:25 · 9641 阅读 · 5 评论 -
c++几种智能指针比较
unique_ptr持有对对象的独有权——两个unique_ptr不能指向一个对象,即 unique_ptr 不共享它所管理的对象。它无法复制到其他 unique_ptr,无法通过值传递到函数,也无法用于需要副本的任何标准模板库 (STL)算法。只能移动 unique_ptr,即对资源管理权限可以实现转移shared_ptr 是一个标准的共享所有权的智能指针,允许多个指针指向同一个对象,在使用引用计数的机制上提供了可以共享所有权的智能指针weak_ptr:它不具有普通指针的行为,没有重载 oper.原创 2020-08-24 01:30:26 · 9974 阅读 · 2 评论 -
c++几种STL比较
STL工作和面试考的比较多了,下面整理一下。1、Vector变长一维数组,连续存放的内存块,有保留内存,堆中分配内存;支持[]操作,高效率的随机访问;在最后增加元素时,一般不需要分配内存空间,速度快;在中间或开始操作元素时要进行内存拷贝效率低;vector高效的原因在于配置了比其所容纳的元素更多的内存,内存重新配置会花很多时间;注:需要高效的随即存取,而不在乎插入和删除使用vector。2、list双向链表,内存空间上可能是不连续的,无保留内存,堆中分配内存;不支持随机存取,开始和结尾元素的访原创 2020-08-24 01:29:00 · 10127 阅读 · 2 评论 -
c++引用的特点
1.将“引用”作为函数参数有哪些特点? (1)传递引用给函数与传递指针的效果是一样的。 (2)使用引用传递函数的参数,在内存中并没有产生是实参的副本,它是直接对实参操作 (3)使用指针作为函数的参数虽然也能达到使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用”*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。2.将“引用”作为函数返回值类型的格式、好处和需要遵...原创 2020-08-24 01:26:41 · 11896 阅读 · 2 评论 -
const应用和作用
const工作中经常遇到,面试也经常遇到,这里整理一下。 1.欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后没有机会再去改变它了。 2.对指针来说,可以指定指针本身为const,也可以指定所指的数据为const,或二者同时指定为const 3.在一个函数声明中,const可以修饰形参,表明它是一个输入参数,不能修改。 4.对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不...原创 2020-08-24 01:25:18 · 10938 阅读 · 2 评论 -
static的应用和作用
static是经常要用到的,面试也是常考,下面整理一下。 1.函数体内的static变量的作用范围为该函数体,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值 2.在模块内的static全局变量可以被模块内所有函数访问,但不能被模块外其他函数访问 3.在模块内的static函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内 4.在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝...原创 2020-08-24 01:23:50 · 10741 阅读 · 2 评论 -
char和unsigned char
网络编程中一般都用unsigned char,而不用char,是因为把char强制转换成int或long时,系统会进行类型扩展。#include <stdio.h>int main(){ int a = 0xde; //1101 1110 char b = a; unsigned char u_b = a; printf...原创 2019-11-07 23:17:10 · 11268 阅读 · 2 评论 -
va_list函数
va_list是用来处理可变参数的,下面看一个示例。#include "stdarg.h"#include <stdio.h>int test(char* msg, ...);int main(){ test("hello", "wolrd",1); return 0;}int test(char* msg, ...){ ...原创 2019-11-03 21:15:19 · 11690 阅读 · 1 评论 -
常用类型所占字节数
32位下,int、long、long long、__int64所占字节数和取值范围字节数char:1字节(8位)int:4字节 (32位,取值范围 -2^31 ~2^31-1)unsigned int : 4字节(32位,取值范围 0~2^32-1)long: 4字节(32位,取值范围-2^31 ~2^31-1)unsigned long : 4字节(32位,取值范...转载 2019-11-03 11:21:30 · 18304 阅读 · 1 评论 -
逻辑运算符'&'取某值
逻辑运算符'&'可以去特定位数的值。#include <stdio.h>//1111 0100 0010 0100 0000 //1000000// 11 1111 1111 //0x3ffint main(){ int a = 1000000; int b = a & 0x3ff;...原创 2019-10-31 21:54:19 · 11713 阅读 · 4 评论 -
随机数的生成
以前用rand和srand生成过伪随机数,伪随机数的序列是固定的,今天学习生成真正的随机数的生成。利用/dev/urandom可以生成随机数的值,/dev/urandomLinux下的熵池,所谓熵池就是当前系统下的环境噪音,描述了一个系统的混乱程度,环境噪音由这几个方面组成,如内存的使用,文件的使用量,不同类型的进程数量等等。#include <stdio.h&g...原创 2019-10-30 23:41:29 · 10591 阅读 · 1 评论 -
c++ scandir
函数scandir扫描dir目录下以及dir子目录下满足对应条件的文件#include <stdio.h>#include <dirent.h>#include <stdlib.h>#include <string.h>#include <ctype.h>int customFilter(const ...原创 2019-10-17 21:19:07 · 11272 阅读 · 2 评论 -
c++ 互斥量和条件变量
线程同步时会遇到互斥量和条件变量配合使用的情况,下面看一下C++版的。test.h#include <pthread.h>#include <iostream>class T_Mutex {public: T_Mutex() { pthread_mutex_init(&mutex_, NULL); } ~T_Mut...原创 2019-10-17 21:00:15 · 10578 阅读 · 2 评论 -
c++ try...catch异常处理
c++可以通过throw语句和try...catch语句实现对异常的处理。#include <iostream>using namespace std;int main(){ double m ,n; cin >> m >> n; try { if( n == 0) ...原创 2019-10-15 22:00:44 · 10334 阅读 · 2 评论 -
mutable关键字
mutable是为了突破const限制,即使是const函数,也能对mutable变量进行修改。include <iostream>using namespace std;class test{public: test() { a = 0; } void addA() const { a++; cout<< "...原创 2019-10-15 21:45:48 · 10148 阅读 · 2 评论 -
指针相关基础
指针向来都是难点,今天我们一起来了解一下。指针,一个用来保存地址的对象,一般形式为:类型名 *指针变量名,要说明的是指针变量只能存放地址。定义指针指针变量时还要注意指针的类型,指针的类型决定了指针能指向的数据类型。int a=10; int *p=&a;printf("%d",*p);//输出地址指向的值printf("%d",p);//这里输出的是地址指针变量作为函数的参数原创 2015-10-18 20:38:40 · 10769 阅读 · 2 评论 -
指针基础再续
上次谈到指针相关基础,但遇到了一些问题没有说完,这次再来补充一下,嘿嘿!通过指针引用字符串: 传入字符数组时:#includeint print1(char c1[]){ int i=0; while(c1[i]!='\0') { printf("%c",c1[i]); i++; }原创 2015-10-19 20:59:13 · 10788 阅读 · 1 评论 -
学结构体了
指针学完了,来学学结构体吧,走进了一个新的世界。结构体:不同的数据类型组成的一个结构一般形式:struct 结构体名 {成员表列};声明:类型名 成员名定义的方法:1.先声明结构体类型,再定义该类型的变量struct student{ int age; char name[20];};//不要忘了末尾的';'原创 2015-10-20 19:06:06 · 10958 阅读 · 0 评论 -
初识链表
链表是一种重要的数据结构,今天我们来简单学习一下。链表:由一系列节点组成,每个节点由一个数据域和一个指针域组成。超简单的一个静态链表:#includestruct people{ int age; struct people *next;}int main(){ struct people a,b,c,*head,*p;//定义结构体变量原创 2015-10-20 22:04:38 · 10916 阅读 · 0 评论 -
一个小程序看流的读取
今天我们开始学习C++的流读取。流:一个字符序列#includeint main(){ int sun=0,a=0; while(std::cin>>a)//检测流的输入是否有效 { sum+=a; } std::cout<<"sum is "<<sum<<std::endl; return 0;}输原创 2015-10-24 11:25:07 · 10464 阅读 · 1 评论 -
C++有符号和无符号之间的转换
先来看一个程序:#includeint main(){ unsigned a=5; int b=-10; std::cout<<b+b<<std::endl;//正常输出 std::cout<<a+b<<std::endl; return 0;}打印:-20 4294967291-20正常打印我们都知道,但当一个原创 2015-10-24 20:35:41 · 14334 阅读 · 1 评论 -
再探文件输入和输出函数
再谈fgets和fputs函数fgets:从文件中读入一个字符串存放到字符数组中,这里的读入就是读取fputs:把字符数组张的字符串写到对应文件中#includeint main(){ FILE *fopen("a.txt","w"); char str1[10]="haha"; char str2[10]; if(fputs(原创 2015-10-23 18:41:48 · 11150 阅读 · 0 评论 -
共用体和枚举,写写意思下
共用体:不同的变量共享一段内存一般形式:union 共用体名 { 成员表列 } 变量表列;要点:共用体声明,定义和引用类似结构体,但共用体所占的内存大小是最长成员所占的大小,但其只能放其中的一个变量,而且是最后被声明的#includeunion Data{ int i; float f;};int main(){ union Data D原创 2015-10-23 19:35:00 · 10319 阅读 · 1 评论