C++
张伟林_VillainJan
C++开发。
展开
-
Sqlite3之C++开发常用API总结
Sqlite3之C++开发常用API总结使用流程sqlite3_open()Sqlite3_prepare()sqlite3_bind()_*()sqlite3_step()sqlite3_column()sqlite3_exec()sqlite3_finalizesqlite3_close性能优化Sqlite3之C++开发常用API总结注:此篇博客摘抄总结于几个博客,尽可能全面地讲解C++开发过程中涉及的API相关的知识。使用流程要使用sqlite,需要从sqli..转载 2020-09-03 11:30:29 · 2098 阅读 · 1 评论 -
C++ sizeof用法总结
定义sizeof是一个操作符(operator)。其作用是返回一个对象(包括变量和表达式,将转换为对相应类型)或类型所占的内存字节数。注意sizeof是右结合操作符,在编译时计算。语法sizeof有三种语法形式:sizeof (type_name); //sizeof (类型)sizeof (object); //sizeof (对象)sizeof object; ...转载 2019-06-18 00:15:14 · 1672 阅读 · 0 评论 -
C++ 经典面试题之标准库函数strcpy
标准库中strcpy的函数原型为:char *strcpy(char *strDest, char *strSrc);不能调用C/C++的字符串处理函数下的实现方法:#include<iostream>#include<assert.h> //调用assert函数using namespace std;//使用标准命名空间char* strcpy(char *...原创 2019-06-21 23:55:02 · 370 阅读 · 0 评论 -
C++ 经典面试题之简单Sring类
C++类中有一个BigThree的概念。也就是构造函数,拷贝构造函数,赋值函数。String类原型如下面代码所示:class String{public:String(const char *str == NULL); //普通的构造函数String(const String &other); //拷贝构造函数String operate=(const String &...转载 2019-07-01 23:11:12 · 216 阅读 · 0 评论 -
C++ Lambda表达式
lambda表达式的完整声明如下:[capture list](params list) mutable exception -> return type{function body} //capture list : 捕获列表 //[var]:以值的形式捕获,[&]:引用方式捕获,[=]:值捕获//params list : 参数列表//mutable : 捕获列表可以...转载 2019-07-02 09:09:01 · 200 阅读 · 0 评论 -
C++ STL常用容器
C++的STL中,有哪几种容器?容器在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。序列容器(7个)vectorvector是一段连续的内存地址,基于数组实现,其提供了自动内存管理功能(采用了STL普遍的内存管理器allocator),可以动态改变对象长度,提供随机访问。在尾部添加和删除元素的时间是常数的,但在头部或中间就是线性时间。在ve...原创 2019-07-02 15:11:04 · 8485 阅读 · 3 评论 -
C++ STL中的Hashmap
为什么需要hash_map用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能。例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改:岳不群-华山派掌门人,人称君子剑张三丰-武当掌门人,太极拳创始人东方不败-第一高手,葵花宝典…这些信息如果保存下来并不复杂,但是找起来比较麻烦。例如我要找"张三丰"的信息,最傻的方法就是取得所有的记录,然后...转载 2019-07-02 17:15:28 · 13808 阅读 · 3 评论 -
C++ STL中的RB-tree
RB-tree概述红黑树是平衡二叉搜索树的一种,其通过特定的操作来保持二叉查找树的平衡。二叉搜索树是指一个空树或者具有以下性质的二叉树:任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;任意节点的左、右子树也分别为二叉查找树;没有键值相等的节点。红黑树与AVL树的比较:AVL树的时间复杂度虽然优...转载 2019-07-02 18:07:22 · 830 阅读 · 0 评论 -
SQLite 基础
SQLiteSQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎,其源代码不受版权限制。SQLite是一个进程内的库,但不是一个独立的进程,可以按应用程序的需求进行静态或动态连接,SQLite直接访问其存储文件。为什么使用SQLite?不需要一个单独的服务器进程或操作的系统(无服务器的)。SQLite 不需要配置,这意味着不需要安装或管理。一...转载 2019-08-03 15:30:31 · 600 阅读 · 0 评论 -
C++ 常用设计模式
工厂模式策略模式适配器模式单例模式原型模式模板模式建造者模式外观模式组合模式代理模式享元模式桥接模式装饰模式备忘录模式中介者模式职责链模式观察者模式工厂模式工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式1)、简单工厂模式:主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类。typedef enum{ T8...转载 2019-06-17 20:51:46 · 7284 阅读 · 3 评论 -
C++智能指针
智能指针的作用C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的概念,方便管理堆内存。使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存。理解智能指针需要从下面三个层次:从较浅的层面看...转载 2019-06-21 17:59:13 · 719 阅读 · 0 评论 -
C++ 深拷贝与浅拷贝
深拷贝与浅拷贝简单的来说,浅拷贝是增加了一个指针,指向原来已经存在的内存。而深拷贝是增加了一个指针,并新开辟了一块空间让指针指向这块新开辟的空间。浅拷贝在多个对象指向一块空间的时候,释放一个空间会导致其他对象所使用的空间也被释放了,再次释放便会出现错误。浅拷贝为了形象化说明什么是深拷贝和浅拷贝,我们就先写一个String类(包含构造函数、拷贝构造函数、赋值运算符重载、析构函数和输出操作符"...转载 2019-06-19 14:07:11 · 336 阅读 · 0 评论 -
C++ 类成员初始化表
类成员初始化可以在构造函数当中实现,也可以在构造函数的初始化列表当中实现。但高手则一般选择后者,是什么原因呢?// 构造函数当中的实现CMyObject :: CMyObject (int id, string name){ m_id = id; m_name = name;} // 初始化列表中的实现CMyObject :: CMyObject(int id, st...转载 2019-06-19 14:13:15 · 303 阅读 · 0 评论 -
C++ #define、const和static
#define和const的区别两者区别(1)作用的阶段而言: #define是在编译的预处理阶段起作用,而const是在编译、运行阶段起作用。(2)作用的方式而言: #define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。(3)存储方式而言:#define只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存中...转载 2019-06-19 14:36:34 · 474 阅读 · 0 评论 -
C++ 多态与虚函数、与构造函数和析构函数的联系
多态与虚函数面向对象编程中,多态的含义是“一个接口,多种实现”。多态分为静态多态和动态多态。静态多态是通过模板化和重载技术来实现,在编译的时候确定。动态多态通过虚函数和继承关系来实现,执行动态绑定,在运行的时候确定。C++中运行时的多态是指根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。C++多态性是通过虚函数来实现的,虚...原创 2019-06-19 17:18:24 · 838 阅读 · 0 评论 -
C++ 继承中重载、重写、重定义的区别
重载overload:是函数名相同,参数列表不同 重载只是在类的内部存在。但是不能靠返回类型来判断。重写override:也叫做覆盖。子类重新定义父类中有相同名称和参数的虚函数。函数特征相同。但是具体实现不同,主要是在继承关系中实现的。重写需要注意:(1)被重写的函数不能是static的且必须是virtual的。(2)重写函数必须有相同的类型,名称和参数列表。(3)重写函数的访问修饰符可...转载 2019-06-19 18:45:46 · 435 阅读 · 1 评论 -
C++ 指针和引用
常见的野指针问题指针变量没有被初始化。任何指针变量在刚被创建的时候不会自动成为NULL指针,它的缺省值是随机的。所以指针变量在创建的时候,要么设置为NULL,要么指向合法的内存。指针p被free/delete之后,没有被置为NULL(最好加一句p = NULL;)。他们只是把指针指向的内存给释放掉,并没有把指针自身内容释放。指针操作超越了变量的作用范围。不要返回指向栈内存的指针或引用,因为...转载 2019-06-19 19:18:12 · 130 阅读 · 0 评论 -
new和malloc的区别
new和malloc的区别自身属性new/delete是C++关键字,需要编译器支持,因此属于操作符。malloc/free是库函数,需要头文件支持,因此属于标准库函数。内存区域new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存空间。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内...原创 2019-06-19 19:54:08 · 141 阅读 · 0 评论 -
C++ 基础
C++与C的区别面向对象的特点程序的内存分配符号常量误区函数重载函数模板函数参数默认值变量的引用作用域运算符字符串变量内存操作类封装与信息隐蔽类的数据与函数、对象与指针类的公用数据的保护类对象的赋值和复制,静态数据成员与函数,类的友元和模版提前声明类类的模版运算符重载继承与派生公用继承私有继承保护成员和保护继承派生类的构造函数虚基类多态性和...原创 2019-06-21 11:57:15 · 198 阅读 · 0 评论 -
C++ 多态中的动态绑定和静态绑定
动态绑定和静态绑定静态绑定和动态绑定是C++多态性的一种特性。对象的静态类型和动态类型对象的静态类型:对象在声明是采用的类型,在编译期确定;对象的动态类型:当前对象所指的类型,在运行期决定,对象的动态类型可以更改,但静态类型无法更改。class B{}; class C: public B{}; class D: public B{}; D* pD = new D();...转载 2019-06-21 12:40:05 · 291 阅读 · 0 评论 -
C++ 模版的全特化和偏特化
模板为什么要特化,因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的。模板分为类模板与函数模板,特化分为全特化与偏特化。全特化就是限定死模板实现的具体类型,偏特化就是如果这个模板有多个类型,那么只限定其中的一部分。template<typename T1, typename T2> //模板类class Test{public: Test(T...转载 2019-06-21 13:38:16 · 336 阅读 · 0 评论 -
C++ 强制转换的四种cast操作符
C风格(C-style)强制转型如下:(T) expression 或 T(expression) //函数风格(Function-style)两种形式之间没有本质上的不同。ANSI-C++标准定义的四个cast操作符对于转换简单类型而言C风格转型工作得很好。然而,这样的转换符也能不分皂白地应用于类和类的指针。ANSI-C++标准定义了四个新的转换符:reinterpret_cast, ...转载 2019-06-21 14:24:32 · 485 阅读 · 0 评论 -
C++字符串和字符数组
在C++中,有两种类型的字符串表示形式:C-风格字符串C++引入的string类C-风格字符串C 风格的字符串起源于C语言,并在C++中继续得到支持。字符串实际上是使用null字符‘\0’终止的一维字符数组。下面的声明和初始化创建了一个 “Hello” 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 “Hello” 的字符数多一个。char greeting[6] = ...转载 2019-06-19 11:45:46 · 1589 阅读 · 0 评论