
C++
小虾米 ~
这个作者很懒,什么都没留下…
展开
-
C++中public、protected、private的总结
private,public,protected成员的访问权限public: 能被类成员函数、子类函数、友元访问,也能被类的对象访问。private: 只能被类成员函数及友元访问,不能被其他任何访问,本身的类对象也不行。protected: 只能被类成员函数、子类函数及友元访问,对外是隐藏的,不能被其他任何访问,本身的类对象也不行,子类对象。类的继承后方法属性变化使用priva...原创 2019-09-11 21:02:06 · 198 阅读 · 0 评论 -
C++拷贝构造函数
调用拷贝构造函数的三种情况:1)用一个类对象初始化另一个类对象2)函数的形参是类对象3)函数的返回值是类对象拷贝构造函数的参数必须是引用原因:例如 A a; A b(a);用对象a初始化b,需要调用拷贝构造函数,向拷贝构造函数传递实参a时,若参数不是引用,则又需要调用拷贝构造函数,因此导致无限递归调用拷贝构造函数,栈溢出。class A{ publi...原创 2019-09-01 12:13:03 · 202 阅读 · 0 评论 -
C++ 三个线程顺序打印ABC
#include<iostream>#include<vector>#include<thread>#include<condition_variable>using namespace std;mutex mu;std::condition_variable cond_var;int num=0;void func(char ch...原创 2019-08-30 16:08:41 · 3459 阅读 · 0 评论 -
C++ 多态
一般继承(无虚函数覆盖)下面,再让我们来看看继承时的虚函数表是什么样的。假设有如下所示的一个继承关系:请注意,在这个继承关系中,子类没有重载任何父类的函数。那么,在派生类的实例中,其虚函数表如下所示:对于实例:Derive d;的虚函数表如下:我们可以看到下面几点:1)虚函数按照其声明顺序放于表中。2)父类的虚函数在子类的虚函数前面一般继承(有虚函数覆盖)...转载 2019-08-26 23:10:02 · 134 阅读 · 0 评论 -
C++ string类的常用函数
string的特性描述:int capacity()const;//返回当前容量(即string中不必增加内存即可存放的元素个数)int max_size()const;//返回string对象中可存放的最大字符串的长度int size()const;//返回当前字符串的大小int length()const;//返回当前字符串的长度...转载 2019-08-18 11:36:20 · 2935 阅读 · 0 评论 -
C++仿函数
所谓的仿函数(functor),是通过重载()运算符模拟函数形为的类。 因此,这里需要明确两点: 1 仿函数不是函数,它是个类; 2 仿函数重载了()运算符,使得你可以像调用函数那样调用类。仿函数可以作为排序准则,比如用于自定义map、set的排序规则#include<iostream>#include<string>#include<...原创 2019-08-17 19:21:07 · 334 阅读 · 0 评论 -
使用函数判断字符串中是否包含有某字串
C++风格C++的string类提供了字符串中查找另一个字符串的函数find其形式为:string::size_type string::find(string &);功能为在string对象中,查找string类型的子字符串是否存在将返回值给string::size_type型变量时,如果存在,返回起始位置,不存在则返回 string::npos。将返回值给i...原创 2019-08-13 11:20:26 · 4392 阅读 · 0 评论 -
C++ 虚析构函数
基类析构函数不是虚析构函数class Base{public: Base(){cout<<"base constructor"<<endl;} ~Base(){cout<<"base destructor"<<endl;}};class Derived:public Base{public: Derived(){cout&l...原创 2019-08-21 22:20:51 · 222 阅读 · 0 评论 -
C++实现只能动态或者静态创建对象
C++中建立类的对象有两种方式:(1)静态建立,例如 A a; 静态建立一个类对象,就是由编译器为对象在栈空间中分配内存。使用这种方法,是直接调用类的构造函数。(2)动态建立,例如 A* p = new A(); 动态建立一个类对象,就是使用new运算符为对象在堆空间中分配内存。这个过程分为两步:第一步执行operator new( )函数,在堆空间中搜索一块内存并...原创 2019-09-01 19:18:58 · 339 阅读 · 0 评论 -
C++ 移动构造函数和拷贝构造函数
我们用对象a初始化对象b,后对象a我们就不在使用了,但是对象a的空间还在呀(在析构之前),既然拷贝构造函数,实际上就是把a对象的内容复制一份到b中,那么为什么我们不能直接使用a的空间呢?这样就避免了新的空间的分配,大大降低了构造的成本。这就是移动构造函数设计的初衷; 拷贝构造函数中,对于指针,我们一定要采用深层复制,而移动构造函数中,对于指针,我们采用浅层复制。浅层复制之所以危险,是因为两...原创 2019-09-02 15:20:11 · 10510 阅读 · 7 评论 -
C++内存管理
内存管理对于C++的内存结构,主要有两种说法,一个是{栈区,堆区,全局区(静态区), 常量区,代码区};另一种说法为{栈区,堆区,全局区(静态区), 自由存储区} 栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 堆,就是那些由new分配的内存块,...原创 2019-09-02 21:39:22 · 134 阅读 · 0 评论 -
C++STL中的map按Key值排序和按Value值排序
C++中的map内部实现是红黑树,是有序的,默认按less<Key>排序,对<运算符进行了重载map的定义:template < class Key, class T, class Compare = less<Key>, class Allocator = allocator<pair<const Key,T> > > ...原创 2019-06-27 17:19:36 · 2707 阅读 · 1 评论 -
哪些函数不能是虚函数
构造函数,构造函数初始化对象,派生类必须知道基类函数干了什么,才能进行构造;当有虚函数时,每一个类有一个虚表,每一个对象有一个虚表指针,虚表指针在构造函数中初始化; 内联函数,内联函数表示在编译阶段进行函数体的替换操作,而虚函数意味着在运行期间进行类型确定,所以内联函数不能是虚函数; 静态函数,静态函数不属于对象属于类,静态成员函数没有this指针,因此静态函数设置为虚函数没有任何意义。 友...原创 2019-09-04 15:38:14 · 1639 阅读 · 0 评论 -
C++空类
空类的大小C++空类的大小不为0,不同编译器设置不一样,vs设置为1原因:C++标准指出,不允许一个对象(当然包括类对象)的大小为0,不同的对象不能具有相同的地址; 带有虚函数的C++类大小不为1,因为每一个对象会有一个vptr指向虚函数表,具体大小根据指针大小确定(32位的操作系统,指针大小为4个字节); C++中要求对于类的每个实例都必须有独一无二的地址,那么编译器自动为空类分...原创 2019-09-04 15:19:04 · 336 阅读 · 0 评论 -
C++函数返回引用
函数可以返回引用,但是不能返回局部变量的引用,因为函数调用完毕局部变量会被释放class Test{public: Test(int x = 1) { num= x; cout << "构造函数" << endl; } Test(const Test & a) { num = a.num; cout << "拷贝构造函数" <...原创 2019-09-04 15:10:35 · 1421 阅读 · 0 评论 -
C++ union共用体
C与C++中的union:一种数据格式,能够存储不同的数据类型,但只能同时存储其中的一种类型。C++ union结构式一种特殊的类。它能够包含访问权限、成员变量、成员函数(可以包含构造函数和析构函数)。它不能包含虚函数和静态数据变量。它也不能被用作其他类的基类,它本身也不能有从某个基类派生而来。Union中得默认访问权限是public。union类型是共享内存的,以成员最大长度的整数倍作为自己的大...原创 2019-09-03 16:44:42 · 414 阅读 · 0 评论 -
C/C++ 关于大小端模式
大端模式: 数据的高字节存在低地址 数据的低字节存在高地址小端模式: 数据的高字节存在高地址 数据的低字节存在低地址可以用来union测试CPU是大端模式还是小端模式#include<iostream>using namespace std;union Test{ int num; char ch;};int main(){ Test a;...原创 2019-09-03 16:33:13 · 347 阅读 · 0 评论 -
内存对齐规则及为什么内存对齐
内存对齐的默认规则: (1)第一个成员在结构体变量偏移量为0的地址处 (2)从第二个成员开始,每个成员都有对齐数,对齐数是其所占字节的整数倍 (3)结构体的总大小为其成员的最大对齐数的整数倍struct S1{ char C1; int i; char C2;};printf("%d\n", sizeof(struct S1));...原创 2019-06-25 22:49:01 · 277 阅读 · 0 评论 -
new和delete的实现原理,delete是如何知道释放内存的大小的?
new简单类型直接调用operator new分配内存;而对于复杂结构,先调用operator new分配内存,然后在分配的内存上调用构造函数;对于简单类型,new[]计算好大小后调用operator new;对于复杂数据结构,new[]先调用operator new[]分配内存,然后在p的前四个字节写入数组大小n,然后调用n次构造函数,针对复杂类型,new[]会额外存储数组大小:new表达式调...原创 2019-09-02 21:47:18 · 1911 阅读 · 0 评论 -
野指针
野指针指向内存被释放的内存或者没有访问权限的内存的指针成因“野指针”的成因主要有3种:指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如 char *p = NULL; char *str = new char(100); 指针p...原创 2019-09-02 21:43:49 · 237 阅读 · 0 评论 -
new和malloc的区别
new与malloc1,new分配内存按照数据类型进行分配,malloc分配内存按照指定的大小分配。2,new返回的时指定对象的指针,而malloc返回的时void*,因此,malloc的返回值一般都需要进行类型转换。3,new不仅分配一段内存,而且还会调用构造函数,而malloc不会。4,new分配的内存需要用delete销毁,malloc要用free来销毁;delete销毁的时候回调用...转载 2019-08-19 16:42:49 · 199 阅读 · 0 评论 -
C++的multimap
key相同时,value的默认放置顺序C++11默认对multimap中key相同的value值,是按照输入顺序进行存储的#include<iostream>#include<string>#include<map>using namespace std;int main(){ multimap<string,int> m...原创 2019-08-07 21:14:42 · 606 阅读 · 0 评论 -
C++虚函数
虚函数的使用方法:(1)在基类中用virtual声明成员函数为虚函数,在类外定义虚函数时,不必加virtual(2)在派生类中重新定义此函数,函数名、函数类型、参数个数和参数类型必须和基类的虚函数相同,根据派生类的需要重新定义函数体(3)定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象(4)通过该指针调用虚函数,此时调用的就是指针变量指向的对象的同名函数...原创 2019-07-09 16:42:08 · 361 阅读 · 0 评论 -
const关键字和define宏定义
一、const关键字const关键字保护修饰的对象不被修改,作为常量来使用,只读const可以修饰变量、引用、指针、对象、成员等常变量:const 类型说明符 变量名 常引用:const 类型说明符 & 引用名 常指针: 类型说明符 * const 指针名 指向常量的指针 :con...原创 2019-07-09 15:46:32 · 320 阅读 · 0 评论 -
条件编译
条件编译是根据实际定义宏(某类条件)进行代码静态编译的手段。可根据表达式的值或某个特定宏是否被定义来确定编译条件。1.条件编译中使用的预编译指令#define 定义一个预处理宏#undef 取消宏的定义#if 编译预处理中的条件命令,相当于C语法中的if语句#ifdef 判断某个...原创 2019-07-03 18:26:27 · 20125 阅读 · 0 评论 -
变量属性总结
一个变量除了数据类型以外,还有3种属性:(1)存储类别:C++允许使用auto,static,register,extern4种存储类别auto:自动变量,动态存储方式 函数中的局部变量,如果不加static声明,默认就是自动变量static:静态变量 静态局部变量 静态外部变量...原创 2019-07-08 13:25:37 · 792 阅读 · 0 评论 -
C++ 编译和运行的区别
用高级语言写的程序属于“源程序”,C++的源程序是以.cpp为后缀的(1)编译:计算机只能识别和执行由0和1组成的二进制指令,而不能识别和执行用高级语言写的指令,为了使计算机能够执行高级语言源程序,必须使用一种称为“编译器(compiler)”的软件,把源程序翻译成二进制形式的“目标程序”。编译是以源程序文件为单位分别进行编译的,每一个程序单位组成一个源程序文件,如果有多个程序单位,系...原创 2019-07-08 09:15:06 · 4295 阅读 · 0 评论 -
C++ 静态成员函数和非静态成员函数的区别
数据成员:静态数据成员是类的一部分,为类的所有实例共享(静态区);非静态数据成员,类的每个实例都有一份拷贝(动态区)。静态数据成员的访问:静态数据成员是类的一部分,在产生任何实例之前已经存在。函数成员(都在代码区):静态函数成员与非静态函数成员都为类所有,对象中并不存在函数的拷贝(每个对象所占用的存储空间只是该对象的数据成员所占用的存储空间,但是在逻辑上函数和数据是一起被封装进...原创 2019-07-08 10:36:53 · 12069 阅读 · 0 评论 -
[C/C++] 关键字static的用法总结
关键字static主要有三个作用:(1)静态局部变量(2)静态外部变量(3)静态函数(内部函数)(4)类中的静态数据成员/静态成员函数前两种C和C++都有,第三种仅在C++中有一、静态局部变量如果希望函数中的局部变量的值在函数调用结束后不消失而保留其值,即其占用的存储单元不释放,在下一次该函数调用时,该变量保留上一次函数调用结束时的值,这时就应该指定该局部变量为静态局部...原创 2019-07-08 10:23:19 · 398 阅读 · 0 评论 -
用C++ API方式连接MySQL
记得更改mysql的登陆密码 password~~~#include<iostream>#include<winsock.h>#include<mysql.h>#include<string>#include<iomanip>using namespace std;#define STEPBYSTEPint ma...原创 2019-07-01 21:25:56 · 202 阅读 · 0 评论 -
C++连接MySQL数据库配置
一、 创建项目并配置所需头文件及库(一) 创建空项目使用VS2015创建空项目(二) 添加项目所需头文件所在文件夹右键项目选择属性,进入C/C++ => 常规 => 附加包含目录,添加MySQL的include目录位置D:\mysql-5.7.19-win64\include(根据自己安装的MySQL版本及地址填写)(三) 添加所需库...转载 2019-07-01 16:05:58 · 518 阅读 · 0 评论 -
引用和指针的区别
(1)引用被创建时,必须初始化;而指针不需要(2)一旦引用被初始化为指向一个对象,它就不能改变为另一个对象的引用;而指针可以在任何时候指向任何对象(3)不能有NULL的引用,引用必须是和一块合法的存储单元关联(4)程序会给指针变量分配内存,而引用不需要分配内存(5)指针可以有多级,指向指针的指针**p,但是引用只能有一级(6)作为函数参数进行传递时也不同,用指针传递参数,可以实现对参数...原创 2019-06-28 18:15:32 · 117 阅读 · 0 评论 -
每日一练-不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?说明:m 和 n 的值均不超过 100。示例 1:输入: m = 3, n = 2输出: 3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -...原创 2019-07-10 17:17:26 · 156 阅读 · 0 评论 -
希尔排序
#include<iostream>using namespace std;void shellsort(int *a,int len) //len为最后一个元素的下标{ int i,j; int increment=len; do { increment=increment/3+1; for(i=increment;i<=len;i++) { ...转载 2019-07-10 23:32:07 · 127 阅读 · 0 评论 -
C++pair用法
类模板:template<class T1,classT2>struct pair{ T1 first; T2 second;};功能:pair将一对值组合成一个值,这一对值可以具有不同的数据类型(T1和T2),两个值可以分别用pair的两个公有函数first和second访问。pair在命名空间std中pair<int, do...转载 2019-06-26 23:07:05 · 133 阅读 · 0 评论 -
红包随机分配算法
#include<iostream>#include<vector>#include<ctime>using namespace std;void lucky(vector<int> &luckymoney,int M,int N){ srand((unsigned int)time(NULL)); //以当前系统时间为种子,...原创 2019-07-21 22:57:57 · 628 阅读 · 2 评论 -
模拟扑克牌洗牌
没有考虑大小王,用一个二维数组表示一副扑克牌,每行代表一个花色#include<iostream>#include<set>using namespace std;void playingCard(int data[][13],int row,int col ){ for(int i=0;i<row;i++) { set<int>...原创 2019-07-21 21:37:42 · 316 阅读 · 0 评论 -
C++中如何将数组作为函数参数
1.一维数组做函数参数void func(int array[])声明形参数组并不意味着真正建立一个包含若干元素的数组,在调用函数时也不对它分配存储单元,只是用array[ ]这样的形式表示array是一维数组的名字,用来接收实参传来的地址。因此,array【 】中的数值并无实际作用,编译系统对一维数组【】内的内容不予处理,形参一维数组的声明中可以写参数个数,也可以不写。函数首部的下面几...原创 2019-07-21 21:03:43 · 10443 阅读 · 0 评论 -
大数相加
#include<iostream>#include<string>using namespace std;int main(){ string num1="56781294"; string num2="893275694"; int len1=num1.length(); int len2=num2.size(); int i=len1-1,j=l...原创 2019-07-19 14:38:07 · 124 阅读 · 0 评论 -
C++类的大小——sizeof(class)
第一:空类的大小classCBase{};运行cout<<"sizeof(CBase)="<<sizeof(CBase)<<endl;sizeof(CBase)=1;为什么空的什么都没有是1呢?先了解一个概念:类的实例化,所谓类的实例化就是在内存中分配一块地址,每个实例在内存中都有独一无二的地址。同样空类也会被实例化(别拿豆包...转载 2019-07-19 01:04:09 · 291 阅读 · 0 评论