c++
文章平均质量分 62
MachineChen
这个作者很懒,什么都没留下…
展开
-
c/c++中define用法详解及代码示例
c++中define用法define在c++语言中用法比较多,这里对其进行整理。1.无参宏定义无参宏的宏名后不带参数。 其定义的一般形式为:#define 标识符 字符串其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。 例如:#define MAXNUM 99999这样MAX原创 2016-09-15 12:46:41 · 147327 阅读 · 8 评论 -
C++中虚析构函数和纯虚函数的作用
一. 虚析构函数为了能够正确的调用对象的析构函数,一般要求具有层次结构的顶级类定义其析构函数为虚函数。因为在delete一个抽象类指针时候,必须要通过虚函数找到真正的析构函数。class Base{public: Base(){} virtual ~Base(){}};class Derived: public Base{public: Derived(){}; ~转载 2017-12-26 23:38:10 · 8268 阅读 · 1 评论 -
C++不要在构造函数和析构函数中调用虚函数
这里先运行个示例代码:#include<iostream> using namespace std;class Base {public: Base() { cout << "Base::Base()" << endl; fun(); //fun_();//编译错误 } virtual void fun() {转载 2018-01-02 22:03:09 · 2235 阅读 · 0 评论 -
C11 标准新特性
C11标准是C语言标准的第三版(2011年由ISO/IEC发布),前一个标准版本是C99标准。相比C99,C11有哪些变化呢1、 对齐处理alignof(T)返回T的对齐方式,aligned_alloc()以指定字节和对齐方式分配内存,头文件定义了这些内容。alignof( 类型标识 ) 返回 std::size_t 类型值。 返回由类型标识所指示的类型的任何实例所要求的对齐字原创 2018-01-21 18:08:08 · 25792 阅读 · 1 评论 -
二叉查找树(BST)
什么是二叉查找树二叉查找树(Binary Search Tree)又叫二叉排序树(Binary Sort Tree),它是一种数据结构,支持多种动态集合操作,如 Search、Insert、Delete、Minimum 和 Maximum 等。二叉查找树要么是一棵空树,要么是一棵具有如下性质的非空二叉树:若左子树非空,则左子树上的所有结点的关键字值均小于根结点的关键字值。若右子树非转载 2018-01-13 18:44:02 · 882 阅读 · 0 评论 -
C++ String 类的简单实现
String类里面主要包含构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等方法。#include <iostream>#include <cstring>using namespace std;class String{public: // 默认构造函数 String(char *str = NULL); // 复制构造函数 String(Stri原创 2018-01-31 00:06:12 · 3771 阅读 · 3 评论 -
C++中的类型转换(static_cast、const_cast、dynamic_cast、reinterpret_cast)
1. c强制转换与c++强制转换c语言强制类型转换主要用于基础的数据类型间的转换,语法为:(type-id)expression//转换格式1type-id(expression)//转换格式2c++除了能使用c语言的强制类型转换外,还新增了四种强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast,主要运用于继承关系类间的强制转化,语转载 2018-01-06 22:30:26 · 3131 阅读 · 0 评论 -
C++ 中内存对齐原理及作用
struct/class/union内存对齐原则有四个:1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括struct/clas转载 2018-01-07 16:54:46 · 5679 阅读 · 0 评论 -
C++中宏与内联函数的优缺点
宏为什么要使用宏呢?因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。 而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比转载 2018-01-07 18:38:37 · 2112 阅读 · 0 评论 -
常用函数strcpy strcat strcmp strlen memcpy memset
strcpystrcpy是拷贝字符串,以’\0’为标志结束 strcpy的原型为//这里不考虑源字符串长度比目标字符串长度长的情况char* strcpy(char * dst, const char * src){ assert((dst != NULL) && (src != NULL)); char * cp = dst; while ( *cp++原创 2018-02-01 00:06:23 · 1529 阅读 · 0 评论 -
C/C++内存管理详解
内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C+转载 2018-01-08 23:42:59 · 319 阅读 · 0 评论 -
SGI-STL内存池实现原理
STL之父Alexander Stepanov离开HP之后就去了SGI(Silicon Graphics Computer System, Inc),然后和Matt Austern这些STL大牛一起搞了SGI STL。它也是HP STL的一个继承版本。它属于开放源码,因此你可以修改和销售它。SGI STL被GCC(linux下的C++编译器)所采用,你可以在GCC的Include子目录下找到所有头文转载 2018-01-28 16:40:59 · 1194 阅读 · 0 评论 -
STL中vector,Map,Set的实现原理
vectorvector的数据安排以及操作方式,与array非常类似,两者唯一的区别是空间运用的灵活性,array是静态空间,一旦配置了就不能改变,如果你想要大一点的空间,就必须首先配置一块新空间,然后将原来的元素一一复制进来,再把原来的空间释放给系统。但是vector是动态空间,随着元素的增加,它的内部机制会自行扩充空间以容纳新元素,因此vector的运用对于内存的合理利用与运用的灵活性有很大的帮转载 2018-01-29 00:01:42 · 5754 阅读 · 0 评论 -
C++中垃圾回收机制中几种经典的垃圾回收算法
前言垃圾收集器是一种动态存储分配器,它自动释放程序不再需要的已分配的块,这些块也称为 垃圾 。在程序员看来,垃圾就是不再被引用的对象。自动回收垃圾的过程则称为 垃圾收集(garbage collection) 。在一个支持垃圾收集的语言中,程序显式地申请内存,但从不需要显式的释放它们。垃圾收集器会定期识别垃圾块,并将垃圾块放回空闲链表中。显然,C语言的malloc包不是一个带GC功能的分配器,程序员转载 2018-01-01 20:46:23 · 13386 阅读 · 0 评论 -
C++中构造函数和析构函数抛出异常问题
一. 抛出异常1.1 抛出异常(也称为抛弃异常)即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常。该语句的格式为: throw 表达式;如果在try语句块的程序段中(包括在其中调用的函数)发现了异常,且抛弃了该异常,则这个异常就可以被try语句块后的某个catch语句所捕获并处理,捕获和处理的条件是被抛弃的异常的类型与catch语句的异常类型相匹配。由于C+转载 2018-01-01 14:45:44 · 9544 阅读 · 1 评论 -
C++中类对象的内存布局以及虚函数表生成
类对象内存布局计算l 空类、单一继承的空类、多重继承的空类所占空间大小为:1(字节,下同);l 一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间的;l 因此一个对象的大小≥所有非静态成员大小的总和;l 当类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针vPtr指向虚函数表VTable;l 虚承继的情况:由转载 2017-12-24 23:59:16 · 2014 阅读 · 0 评论 -
Visual Studio 2015 中关于运行时库的设置 /MD[d]、/MT[d]、/LD[d]
该设置指示多线程模块是否为 DLL,并指定运行库的零售版本或调试版本。语法:/MD[d] /MT[d] /LD[d]备注: 选项 说明 /MD 使此应用程序使用特定于多线程和 DLL 的运行库版本。 定义 _MT 和 _DLL,并使编译器将库名 MSVCRT.lib 放入 .obj 文件中。用此选项编译的应用程序静态链接到 MSVCRT.lib。 此库提供使链接器能够解析外部引用的翻译 2016-12-13 21:55:43 · 2979 阅读 · 0 评论 -
Visual Studio 2015 自动生成 *.VC.db 文件的问题
用vs2015创建Visual C++项目,编写生成后,每次都会生成一个project_name.VC.db文件,而且会随着你工程修改运行变的越来越大。project_name.VC.db是sqlite后端用于intellisense的新数据库,相当于之前的*.sdf SQL Server Compact数据库。它与VS2015提供的智能感知、代码恢复、团队本地仓库功能有关,VS重新加载解决方案时速原创 2016-12-11 19:52:12 · 22322 阅读 · 4 评论 -
32位与64位系统基本数据类型的字节数
32位与64位系统数据类型不同的平台上对不同的数据类型分配的字节数是不同的,一般的,数据类型的字节数是由编辑器决定的(编译期间决定数据类型长度)。简单来说,平台就是CPU+OS+Compiler,cpu的位是指一次性可处理的数据量是多少,1字节=8位,32位处理器可以一次性处理4个字节的数据量,依次类推。32位操作系统针对的32位的CPU设计。64位操作系统针对的64位的CPU设计。所以平台是三者的原创 2016-09-08 01:58:12 · 51088 阅读 · 7 评论 -
【C/C++】对char* 和 char[]区别的一些理解
相同点首先 这两种类型都可以对应一个字符串,比如: char * a=”string1”; char b[]=”string2”; printf(“a=%s, b=%s”, a, b); 其中a是一个指向char变量的指针,b则是一个char数组(字符数组),其次 ,很多时候二者可以混用,像函数传参数的时候,实参可以是char*,形参可以是 char[],比如: void fun1(cha转载 2017-10-20 00:30:58 · 67707 阅读 · 8 评论 -
C/C++中new与malloc的区别
1. 申请的内存所在位置new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。那么自由转载 2017-12-08 23:09:05 · 394 阅读 · 0 评论 -
C/C++中static关键字作用
1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。 举例来说明。同时编译两个源文件,一个是a.c,另一个是main.c。//a.cchar a = 'A'; // global variablevoid msg(){ printf("He转载 2017-12-02 21:36:05 · 234 阅读 · 0 评论 -
C/C++中 extern 关键字详解
基本解释extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。也就是说extern有两个作用,第一个,当它与”C”一起连用时,如: extern “C” void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规转载 2017-12-02 20:17:00 · 6397 阅读 · 0 评论 -
C/C++中volatile关键字详解
1. 为什么用volatile?C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier。这是 BS 在 “The C++ Programming Language” 对 volatile 修饰词的说明:A volatile specifier is a hint to a compiler that an object ma转载 2017-12-03 22:28:20 · 222 阅读 · 0 评论 -
C/C++中const使用详解
C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性。一、Const作用 NO. 作用 说明 参考 1 可以定义const常量 const int Max = 100; 2 便于进行类型检查 const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换转载 2017-12-05 16:42:05 · 1771 阅读 · 1 评论 -
程序内存中的堆和栈的区别
一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap)一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3、全局区(静态区)(stati转载 2017-11-26 23:45:52 · 1440 阅读 · 0 评论 -
C++中动态类型与动态绑定、虚函数、运行时多态的实现
动态类型与静态类型静态类型是指不需要考虑表达式的执行期语义,仅分析程序文本而决定的表达式类型。静态类型仅依赖于包含表达式的程序文本的形式,而在程序运行时不会改变。通俗的讲,就是上下文无关,在编译时就可以确定其类型。动态类型是指由一个左值表达式表示的左值所引用的最终派生对象的类型。例:如果一个静态类型为“类 B ”的指针p 指向一个继承于 B的类 D 的对象,则表达式 *p 的动态类型为“D”。引用按转载 2017-12-17 22:52:43 · 1077 阅读 · 0 评论 -
C++中动多态实现之虚函数与虚表指针
1、静多态与命名倾轧,动多态与虚函数:(1)概述: 我们知道,C++的多态有静多态(Static polymorphism)与动多态(Dynamic polymorphism)之分,静多态是依靠函数重载(function overloading)实现的,而且这种依靠函数重载的多态的实现是采用命名倾轧(关于命名倾轧可参考:C++函数重载与重载原理:命名倾轧 )的方式,是在编译阶段就已经完成了的;而动转载 2017-12-16 15:43:03 · 795 阅读 · 0 评论 -
必须使用【初始化列表】初始化数据成员的情况
类对象的构造顺序是这样的: 1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员; 2.进入构造函数后在构造函数中执行一般赋值与计算。使用初始化列表有两个原因: 原因1.必须这样做:《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表: 情况一、需要初始化的数据成员是对象的情况(这里包含了继承情况下,通过显示调用父类的构造函数对父类数据成员进行初始化);转载 2018-01-29 22:31:17 · 4728 阅读 · 0 评论