C/C++开发之路
记录C/C++的基本语法,实际应用和实战项目
码农code之路
一入码海深似海,从此天涯是路人
展开
-
面试官:一道二级指针函数传递分析运行后结果
今天看到一道有趣的题记录下:int i=0,j=20,*p1=&i,*p2=&j;void f(int** ptr1, int* ptr2){ int *tmp = ptr2; **ptr1 *= 10; *ptr2 *= 10; ptr2 = *ptr1; *ptr1 = tmp;}//请问调用f(&p1, p2)之后i,j,p1,p...原创 2019-07-21 21:45:30 · 190 阅读 · 0 评论 -
基于Snappy实现数据压缩和解压
Snappy是谷歌开源的一个用来压缩和解压的开发包。相较其他压缩算法速率有明显的优势,官方文档显示在64位 i7处理器上,每秒可达200~500MB的压缩速度,不禁感叹大厂的算法就是厉害。开源项目地址:https://github.com/google/snappy开撸:1.下载最新版本Snappy 1.1.7,下载地址如下:https://github.com/goo...原创 2019-07-12 16:38:35 · 10951 阅读 · 4 评论 -
【C++札记】多态
C++中多态是面向对象设计思想的重要特性,同名具有不同功能函数,该函数调用过程执行不同的功能。多态的原理是通过一张虚函数表(Virtual Table)实现的。动多态会牺牲一些空间和效率来最终实现动态绑定。静多态函数重载为静多态,绑定发生在编译期间,根据函数的参数来确定调用哪个函数。#include <iostream>using namespace ...原创 2019-06-30 14:20:26 · 216 阅读 · 0 评论 -
【C++札记】赋值兼容
赋值兼容的规则时在需要使用基类对象的任何地方都可以使用公有派生类对象来替代。公有继承派生类可获得基类中除构造函数,析构函数外的所有成员,能用基类解决的问题,派生类也能解决。更直白点说,如果一个类是从一个基类公有继承过来,那么这个派生类就可以替代基类,反过来基类不能替代派生类。常用赋值兼容情况:1.派生类对象赋值给基类对象。2.派生类对象初始化基类对象引用。3.派生类对象地址赋...原创 2019-06-25 16:41:15 · 396 阅读 · 0 评论 -
【C++札记】虚继承
由于多重继承产生的二义性引入了类的虚继承,先看下什么是二义性。类D是类B和类C的派生类,而类B,类C就是继承于类A,当D调用类A中的函数时不知道是类B继承A的,还是类C继承A的,引起了二义性。虚继承可以解决这个问题。使用语法:class 派生类:virtual 继承方式 虚基类{};上图中类D实例化过程中的初始化顺序:祖父类(A)--->父类(从左到又)---...原创 2019-06-23 14:42:51 · 224 阅读 · 0 评论 -
【C++札记】类的继承
继承面向对象的设计思想,类对数据做了封装,并可以加入访问权限,类的继承是面向对象思想的精髓。类的继承可以让新类从以有的类中获得已有的特征。原有类称为基类或父类,新类称为派生类或子类。语法:class 子类类名:[继承方式] 父类类名{} ;继承的方式有三种:1.共有继承:(使用最广泛)在派生类中原来的公有成员,保护成员身份不变。原私有成员仍不可访问。2.私有...原创 2019-06-23 13:32:51 · 279 阅读 · 0 评论 -
【C++札记】友元
C++封装的类增加了对类中数据成员的访问限制,从而保证了安全性。如想访问类中的私有成员需要通过类中提供的公共接口来访问,这样间接的访问方式,无疑使得程序的运行效率有所降低。友元的提出可以使得类外的函数来访问类中的私有成员,保护成员。友元的使用分为三类:1.类外的普通函数声明为该类的友元函数。格式: friend 类型 函数名(形参)2.其他类的成员函数声明为该类的友元函数。...原创 2019-06-22 18:54:33 · 199 阅读 · 0 评论 -
【C++札记】const关键字
C++中const关键字无处不在,我这里做下汇总,作为工具文章方便翻阅。一:修饰数据成员修饰的成员一单定义初始化后不能再进行修改,如:const int a = 10;a =20; //重新赋值直接会报错当修饰类的成员函数时,先来段错误的代码class Student{public: Student(int i) { thi...原创 2019-06-21 15:41:31 · 233 阅读 · 0 评论 -
【C++札记】实现C++的string类
C++有了string类使得操作字符串变得很方便。有关string类,面试过程中也经常问到的就是自己实现一个sring类。下边实现个String类供大家参考:String.h#pragma onceclass String{public: //构造函数 String(const char* str = nullptr); //拷贝构造函数 String(const St...原创 2019-06-18 15:34:12 · 200 阅读 · 0 评论 -
【C++札记】拷贝构造函数,浅拷贝和深拷贝
一:拷贝构造函数拷贝构造函数是一种特殊的构造函数,遵循如下的规则:1.函数名和类名一致,没有返回值。2.必须有一个参数,参数是本类型的一个引用变量。3.拷贝构造函数可以访问参数对象的任意成员(private也可以)。4.若自己不提供拷贝构造函数,系统会提供默认构造函数,若自己定义,系统将不再提供。5.系统提供的拷贝构造是浅拷贝。书写示例如下:class Stude...原创 2019-06-18 11:21:22 · 389 阅读 · 0 评论 -
【C++札记】内联函数
概述函数的使用使得相同代码不必多次重写,但会带来额外的开销,函数调用的过程中会有入栈和出栈,这些都会消耗时间。如果一个函数在程序运行过程中被成千上万次调用,那么这个开销也是不容忽视的,C++中引入了内联函数,直接在函数前面加上inline,在编译过程中直接把函数代码内嵌,避免了运行过程中的函数调用,但会增加程序代码段的空间。可以任务以空间来换取时间。示例:inline in...原创 2019-06-15 15:13:54 · 284 阅读 · 0 评论 -
【C++札记】函数重载
概述函数重载指在相同作用域中多个函数名相同,函数的形参不同。遵循规则:1.函数名相同2.函数的参数,类型,个数或顺序不一样都可以构成重载。3.函数返回值得类型不同不构成重载,编译直接报错,存在二义性(ambiiguous)#include <iostream>using namespace std;void foo(int a){ co...原创 2019-06-15 14:25:37 · 272 阅读 · 0 评论 -
【C++札记】标准输入与输出
概述C语言中使用函数scanf和printf作为标准输入和输出,在C++中引入了类cin和cout进行标准输入和输出,所需头文件为<iostream>,命名空间是std。这里所说的标准输入和输出是相对程序而言,输入是通过IO设备,如键盘输入到程序,输出是指输出到IO设备,如程序输出到屏幕。标准输入cin是标准输入流对象,是istream类的对象。cin是从缓冲区读取数...原创 2019-06-14 15:27:10 · 2109 阅读 · 0 评论 -
C++操作文件行(读取,删除,修改指定行)
/********************************************************Copyright (C), 2016-2018,FileName: mainAuthor: woniu201Email: wangpengfei.201@163.comCreated: 2018/08/31Descri...原创 2018-08-31 15:56:16 · 41723 阅读 · 7 评论 -
C/C+面试题一:找出字符串中出现最多的字符和次数,时间复杂度小于O(n^2)
已知字符串“aabbbcddddeeffffghijklmnopqrst”编程找出出现最多的字符和次数,要求时间复杂度小于O(n^2) /********************************************************Copyright (C), 2016-2017,FileName: main9Author: woniu201Email...原创 2017-10-31 11:18:11 · 5396 阅读 · 2 评论 -
【C++札记】指针函数与函数指针
指针函数指针函数是一个函数,只不过指针函数返回的类型是某一类型的指针。格式:类型名*函数名(函数参数列表)如下代码存在问题void test(char *p){ p = (char*)malloc(10); return;}int main(){ char* p1 = NULL; test(p1); return 1;}test函数执行完后...原创 2017-11-22 10:41:48 · 2472 阅读 · 0 评论 -
windows和linux环境下java调用C++代码-JNI技术
一.前言最近部门做安卓移动开发的需要调C++的代码,困难重重,最后任务交给了我,查找相关资料,没有一个教程能把不同环境(windows,linux)下怎么调用说明白的,自己在实现的过程中踩了几个坑,在这里总结下,希望看到的以后能少走弯路。使用工具:1.JAVA使用的IDE为eclipse2.windows环境下C++使用的IDE为visual studio 20103.linux...原创 2017-09-20 15:52:54 · 11016 阅读 · 13 评论 -
C++11:auto关键字
一.概述auto关键字在c++98中已经出现,在98中定义为具有自动存储器的局部变量,c++11中标准委员会重新定义了auto关键字,表示一个类型占位符,告诉编译器,auto声明变量的类型必须由编译器在编译时期推导而得。注意事项:1.auto关键字类型推断发生在编译期,程序运行时不会造成效率降低2.auto关键字定义时就需要初始化3.auto仅仅是一个占位符,它并不是一个真正的...原创 2017-09-19 17:12:51 · 2678 阅读 · 1 评论 -
C++:标准模板库Sort
一.概述 STL几乎封装了所用的数据结构中的算法,这里主要介绍排序算法的使用,指定排序迭代器区间后,即可实现排序功能。所需头文件#include <algorithm>sort函数:对给定区间所有元素进行排序,默认两个参数或三个参数,第一个参数待排序区间的首地址,第二个参数待排序区间尾地址的下一个地址。 只传递两个参数默认使用升序排序,如想按照降序排序需要传入第三个参数,...原创 2017-09-18 17:06:07 · 2604 阅读 · 0 评论 -
C++构造和解析Json
概述JSON是一种轻量级的数据交互格式,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率,实际项目中经常用到,相比xml有很多优点,问问度娘,优点一箩筐。第三方库json解析选用jsoncpp作为第三方库,jsoncpp使用广泛,c++开发首选。jsoncpp目前已经托管到了github上,地址:https://github.com/open-source...原创 2017-09-06 16:17:53 · 18607 阅读 · 1 评论 -
malloc/free和new/delete详解与应用
C++面试经常会问到关于malloc/free和new/delete的区别,网上有不同版本的解释,这里总结下并加上个人理解和使用。两者相同点1.都可以申请动态堆内存。 两者不同点1.new/delete是C++的操作符,malloc/free是C/C++的标准库函数。2.new申请的可以理解为对象,new时会调用构造函数,返回指向该对象的指针,delete时调用析构函数;ma...原创 2017-08-31 17:15:27 · 2915 阅读 · 0 评论 -
windows和linux环境下使用google的glog日志库
一.概述glog是google推出的一款轻量级c++开源日志框架,源码在github上,目前最新release版本是v0.3.5。githut地址:https://github.com/google/glog,避免新版本踏坑,习惯性选用低版本v0.3.3。二.生成windows库源码下载完成后,根目录下会有google-glog.sln工程文件呢,用visual studio打...原创 2017-08-23 15:47:05 · 6851 阅读 · 1 评论 -
C++实现16进制字符串转换成int整形值
开发中经常需要把16进制字符串转换成整形,写了个个代码供大家参考下: #include <stdio.h>#include <string.h>//字符转换成整形int hex2int(char c){ if ((c >= 'A') && (c <= 'Z')) { return c - 'A' + 10; } e...原创 2017-07-28 10:31:36 · 18856 阅读 · 1 评论 -
C++生成和解析XML文件
概述1.xml 指可扩展标记语言(EXtensible Markup Language)2.xml 是一种标记语言,类似html3.xml 的设计宗旨是传输数据,而非显示数据4.xml 标签没有被预定义。需要自行定义标签XML与HTML区别1.xml 不是 html 的替代。2.xml 和 html 为不同的目的而设计:3.xml 被设计为传输和存储数据,其焦点是数据的...原创 2017-07-31 16:39:48 · 28096 阅读 · 0 评论 -
【C++札记】标准模板库string
介绍c++中字符串string对象属于一个类,内置了很多实用的成员函数,操作简单,方便更直观。命名空间为std,所属头文件<string> 注意:不是<string.h>。跟进代码会发现string其实只是basic_string模板类的一个typedef。赋值 //方法1 string str1 = "woniu201"; //方法2 c...原创 2017-07-26 17:19:36 · 8114 阅读 · 0 评论 -
Rabbitmq C++客户端 Rabbitmq Client
概述最近项目消息队列服务选用了rabbitmq,server端用的C++开发的,于是需要开发rabbitmq的c++客户端,国际惯例先百度了一圈,然后github搜了一圈,竟然发现排名靠前的需要付费才能使用,尼玛这都拿出来骗钱(愤青了),于是产生了写个客户端给大家使用的念头。我的应用场景是这样的生产者是用java写的(java别说了,一搜一大堆,改个服务器地址就能用),服务端作为消费者,老...原创 2017-07-26 11:10:18 · 29580 阅读 · 17 评论 -
C++:标准模板库map
一:介绍map是STL的关联式容器,以key-value的形式存储,以红黑树(平衡二叉查找树)作为底层数据结构,对数据有自动排序的功能。命名空间为std,所属头文件<map> 注意:不是<map.h> 二:常用操作容量:a.map中实际数据的数据:map.size()b.map中最大数据的数量:map.max_size()c.判断容器是否为空:ma...原创 2017-07-24 14:23:18 · 7746 阅读 · 0 评论 -
C++:链表(初识链表)
介绍链表是把若干个对象用指针串联起来,形成一个链状的数据结构,链表在开发中很重要。1.链表特征:只需要知道一个链表头,就能访问每个节点的对象。2.链表遍历:通过每个节点指针next来对的下一个节点的地址。3.链表尾部:最后一个节点对象的next的值是NULL。 代码演示创建和遍历链表 #include <stdio.h>//结...原创 2017-07-15 17:21:44 · 9536 阅读 · 0 评论 -
C++:链表(有头链表)
介绍把链表分为无头链表和有头链表。无头链表:所有的节点都包含了有效数据,上一篇文章中演示代码使用的就是无头链表。有头链表:用一个固定的头节点来指代整个链表,所有的对象都挂在这个头节点下面,而头节点不包含有效数据。有头链表优点:可以简化链表操作,当链表的对象个数为0时,无头链表不好表示。演示代码创建有头链表,封装函数,通过有头链表的链表头添加节点对象 #in...原创 2017-07-15 17:58:11 · 9949 阅读 · 0 评论 -
【C++札记】引用
介绍引用是C++中特有的语法,在C语言中不存在。本质上引用(reference)就是指针,在类型名后面加上一个&号就是引用类型。1.指针与引用的定义进行比较指针定义: 引用定义:int a = 123; ...原创 2017-07-15 20:28:15 · 6997 阅读 · 0 评论 -
C++:标准C函数(随机数,时间函数)
介绍ANSI组织定义了C标准和标准库函数。使用标准C函数优点:使用标准C函数在任何平台上都支持,使得同一个源码,在Windows编译运行的结果和Linux上编译运行结果相同,无需更改代码。 随机数(rand)产生指定范围内随机数(1~100) #include <stdio.h>#include <stdlib.h>int main(...原创 2017-07-15 21:46:12 · 10098 阅读 · 0 评论 -
【C++札记】动态分配内存(malloc,free)
介绍操作系统中存在一个内存管理器(Memory Manager),简称MM,它负责管理内存。MM提供的服务:应用程序可以向MM申请一块指定大小的内存(借出),用完之后应用程序应该释放(还回)。所需头文件 <stdlib.h>如:void* p = malloc(1024);//申请,从MMM借出内存free(p); //释放,还回MM1.MM管理的内存...原创 2017-07-16 11:08:42 · 10192 阅读 · 2 评论 -
【C++札记】类的分离式写法
介绍类的分离式写法,使得代码更加规范,增强了阅读性。分离式写法的规则:1.类的变量:写在类的里面2.成员函数:类中写函数的声明,函数的定义写在类体外。3.写在类外函数定义时,类名前加限定(Object: :),其中, ::理解为表示范围的符号。代码演示头文件:Object.h#ifndef _OBJECT_H_#define _OBJECT_H_clas...原创 2017-07-16 11:43:16 · 6728 阅读 · 0 评论 -
【C++札记】构造函数与析构函数
构造函数(constructor)1.构造函数是种特殊的类成员函数,遵循如下规则: a.函数名与类名必须相同。 b.没有返回值例如:class Obj{...public: Obj() { ... }};2.构造函数可以带参数,也可以重载class Obj{...publ...原创 2017-07-16 14:59:48 · 8199 阅读 · 0 评论 -
VS2010 安装boost库
1.下载boost库boost官网:www.boost.org,目前最新的版本是1.64,直接下载地址:https://dl.bintray.com/boostorg/release/1.64.0/source/ 2.安装解压boost_1_64_0.7z到D:\Program Files (x86)目录下 打开VS2010-工具-Visual studio 命令提示,进入...原创 2017-04-25 15:42:15 · 5363 阅读 · 0 评论 -
【C++札记】new和delete
介绍1.malloc,free和new,delete区别。 a.malloc,free是C/C++的标准库函数。new,delete是c++的操作符。 b.malloc申请的是内存,严格意义不是“对象”,new申请的可以理解为“对象”,new 时会调用构造函数,返回指向该对象的指针。 c.对于class类型,必须用new/delete来创建和销毁,自动调用构造和析构函数...原创 2017-07-17 14:24:32 · 8376 阅读 · 0 评论 -
C++:内部类
介绍1.把一个类定义在另一个类的内部,称里面的类为内部类。 例如:class A{public: class B { public: int x; int y; };};类B即为内部类。 2.内部类和外部类相互没有特权,即外部类无法自由访问内部类,内部类也无法自由访问外部类。 a.他们不是朋友关系。 b.他们不是父子关系...原创 2017-07-17 16:58:01 · 10259 阅读 · 0 评论 -
【C++札记】命名空间(namespace)
介绍命名空间可以解决程序中的同名冲突,尤其大型项目多人开发中经常用到。比如我们使用C++的标准输出std::cout就使用了std命名空间。使用作用域符::#include <iostream>using namespace std;int var = 10;void foo(){ cout << "this is foo" <&l...原创 2017-07-18 09:18:46 · 7067 阅读 · 0 评论 -
C++:函数模板
介绍函数模板是用来创建通用的函数,用来支持不同的参数和返回值类型。语法如下: template <typename 数据类型标识符>返回类型 函数名 (参数){ 函数体} 使用函数模板的优点:相同的算法不用重复的写多遍,简化代码。函数模板用于实现通用的算法 generic algrithm,有得成为泛型算法。推荐书写风格: tem...原创 2017-07-18 11:17:41 · 6997 阅读 · 0 评论 -
C++:标准模板库(STL)
介绍STL(standard template library)标准模板库,是一种高效的C++程序库。STL分为三类:container(容器),iterator(迭代器)和algorithm(算法)。 容器(container)容器是用来管理某一类对象的集合,包括序列式容器和关联式容器。 序列式容器:vector,list,deque 关联式容器:map,set...原创 2017-07-18 16:43:45 · 14621 阅读 · 0 评论