C++
LaoJiu_
这个作者很懒,什么都没留下…
展开
-
nullptr与null
#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif#endif在C语言环境下,由于不存在函数重载等问题,直接将NULL定义为一个void*的指针就可以完美的解决一切问题。 但是在c++环境下情况就变得复杂起来, 首先我们不能原创 2017-03-31 09:41:52 · 1025 阅读 · 0 评论 -
c++保留有效数字,小数,格式化输出
1、保留有效数字问题#include#include#include "stdlib.h"using namespace std;int main(){ double PI=3.1415926; cout3)<<PI<<endl; system("pause"); return 0;}1234567891012345678910 2、保留小转载 2017-05-12 09:45:29 · 11932 阅读 · 0 评论 -
c语言中realloc()函数解析
realloc(void *__ptr, size_t __size):更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小。如果将分配的内存减少,realloc仅仅是改变索引的信息。如果是将分配的内存扩大,则有以下情况: 1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。 2)如果当前内存段后面的空闲字节不够,那么就使用堆中的第转载 2017-04-15 09:48:50 · 2000 阅读 · 0 评论 -
void及void指针含义的深刻解析
void的含义 void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。void指针使用规范 ①void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值。例如:int * pint;void *pvoid;pvoid = pint; /* 不过不能 pint= pvoid; */如果要将pvoid赋给其他类型指针,则需要强制类型转换如:pint=转载 2017-04-15 09:46:04 · 498 阅读 · 0 评论 -
C++虚函数的底层实现原理
在C++中,多态是利用虚函数来实现的。比如说,有如下代码:#include using namespace std; class Animal { public: void Cry() { cout << "Animal cry!" << endl; } }; class Dog :public Animal转载 2016-01-14 11:15:44 · 1145 阅读 · 0 评论 -
自己实现nullptr
来自维基的代码:const class nullptr_t{public: template<class T> inline operator T*() const //隐式转化 { return 0; } template<class C, class T> //隐式转化 inline operator T C::*() const原创 2017-04-01 17:54:34 · 1778 阅读 · 0 评论 -
C++成员变量指针和成员函数指针
深度探索C++对象模型这本书还有提到C++类的成员变量指针和成员函数指针,虽然在实际开发中用的不多,但是还是需要理解下。一:成员变量指针1.1 非静态成员指针类成员变量指针,实际上并不是真正意义上的指针,即它并不是指向内存中某个地址,而是该成员变量与对象指针的偏移量。该偏移量只有附着在某个具体对象,才能指向对象成员变量的具体地址。如下程序:#include <cstdio>#include <cs转载 2017-04-01 18:00:55 · 7459 阅读 · 0 评论 -
ADT(Abstract Data Type)
在stackoverflow上找到了答案,第二个人的回答: Abstract Data Type(ADT) is a data type, where only behavior is defined but not implementation. Opposite of ADT is Concrete Data Type (CDT), where it contains an imp原创 2017-03-26 09:03:13 · 1513 阅读 · 0 评论 -
#ifndef...#define...#endif与#pragma once深度解析(不是比较区别)
——————- 文件 1.h ———————————-#pragma onceclass A{public: static int x;public: void func();};int A::x = 1;——————– 文件 1.cpp ———————–#include "1.h"void A::func(){ ;}——————– 文件 main.cpp ——原创 2017-04-11 14:32:45 · 685 阅读 · 0 评论 -
数组指针与指针数组
在看见数组指针和指针数组的时候,觉得有必要整理一下,而指针数组的应用也很有妙处,看下文吧。数组指针:int a[2][2] = { 0 };int b[2] = { 0 };int c[2][3] = { 0 };int(*p)[2];p = a;//rightp = b;//errorp = c;//error这里的p是一个指向连续2个元素的数组指针变量。第七行,将a原创 2016-01-02 20:04:08 · 10598 阅读 · 0 评论 -
代码运行前内存分配
大家是不是很疑惑,我们平时写的代码,内存中是如何去存储的?分两种情况,程序运行前,与运行时的程序内存分配情况。知识补充:文件布局在内存中的映射 从上到下依次递减,最上面为高地址:栈 堆 .bss .data .rodata .text 未映射区域第一种情况:代码程序没运行前的内存分布情况1.未初始化的全局变量和静态变量主要存放在 .bss中 int A; static i转载 2017-03-31 17:07:06 · 569 阅读 · 0 评论 -
通过指针修改const变量
const int a = 1;int * p = (int*)&a;*p = 2;cout << &a << " " << p << endl; //00D6FB90 00D6FB90cout << a << " " << *p << endl; //1 2一个内存地址竟然同时存两个值,有点诧异。这就牵涉到了常量折叠。常量折叠的概念:在编译器里进行语法分析的时候,将常量表达式计算求值,原创 2017-03-31 09:58:57 · 942 阅读 · 0 评论 -
enum
enum内的值都是常量,不可改变。它并不是在预编译的时候进行替换,而是在运行时,从enum定义的常量存储区取定义的常量值。因此,同样的常量定义,如果用#define,代码中多处用到该常量的话,编译出来的会比用enum定义使用的常量存储区大。关于占用内存的大小,enum类型本身是不占内存的,编译器直接替换。但是enum类型的变量肯定是占内存的(关于占用内存的大小,看后面详述)。enum需要特别注意的是转载 2017-03-31 16:38:00 · 868 阅读 · 0 评论 -
C++ trivial和non-trivial及POD类型POD(Plain Old Data)
POD全称Plain Old Data是指C风格的struct结构体定义的数据结构,其中struct结构体中只能定义常规数据类型(不能含有自定义数据类型)。它仅作为被动的收藏的字段值,不使用封包或者other object-oriented特征。对于POD类型T的对象,不管这个对象是否拥有类型T的有效值,如果将该对象的底层字节序列复制到一个字符数组(或者无符号字符数组)中,再将其复制回对象,那么该对转载 2017-03-26 09:10:27 · 2023 阅读 · 0 评论 -
const与define的区别
(1) 编译器处理方式不同 define宏是在预处理阶段展开。 const常量是编译运行阶段使用。(2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开。 const常量有具体的类型,在编译阶段会执行类型检查。(3) 存储方式不同 define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。(宏定义不分配内存,变量定义分配内存。) const常量会在内原创 2017-03-31 10:30:54 · 604 阅读 · 0 评论 -
C++ 中 const
一:定义常量 const关键字指定变量的值是恒定的,以防止程序员修改它,并且在定义一个const变量时必须初始化它,除非你用了extern关键词准备来进行外部链接。const int i = 5; //right,和 int const i=5; 等价 const int j; //error,未初始化extern const int k; //right,外部链接二:指针原创 2017-02-20 19:13:18 · 694 阅读 · 1 评论 -
细说new与malloc的10点区别
前言几个星期前去面试C++研发的实习岗位,面试官问了个问题:new与malloc有什么区别?这是个老生常谈的问题。当时我回答new从自由存储区上分配内存,malloc从堆上分配内存;new/delete会调用构造函数/析构函数对对象进行初始化与销毁;operator new/delete可以进行重载;然后强行分析了一下自由存储区与堆的区别。回来后感觉这个问题其实回答得不怎么好,因为关于new与mal转载 2017-03-31 08:30:51 · 509 阅读 · 0 评论 -
堆内存与栈内存的区别
栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。 堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。区别和联系:1.申请方式 堆是由程序员自己申请并指明大小,在c中malloc函数 如p1 = (char *)malloc(10); 栈由系统自动分配,如声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间2.转载 2017-03-31 00:00:13 · 551 阅读 · 0 评论 -
字符数组与字符串
char ch[2] = { '1','2' };char ch1[2] = "12";//error前者属于字符数组;后者是以字符串初始化字符数组,ch1只有两个字节的空间,而“12”是三个(字符串需要在末尾加'\0',它单独占一个字节),因此后者报错。原创 2017-05-12 13:51:39 · 541 阅读 · 0 评论 -
C++链接属性
欢迎到我的新博客访问原文链接:http://www.61mon.com/index.php/archives/165/ 编译器将.cpp编译成.obj,而.obj就是编译单元。 一个程序,可以由一个编译单元组成,也可以由多个编译单元组成. 如果你不想让你的源代码变得很难阅读的话,就请使用多个编译单元吧。那么就是一个.cpp对应一个.obj,然后将所有的.obj链接起来(通过一个叫链接器的程序原创 2016-12-31 20:05:57 · 1250 阅读 · 1 评论 -
C/C++与Python混合编程
C++中嵌入python程序——使用API接口,从函数到类 C++中嵌入python程序——参数传递 如何实现 C/C++ 与 Python 的通信?原创 2017-04-23 19:57:32 · 6468 阅读 · 0 评论 -
C++的头文件和实现文件分别写什么
原文链接:http://www.cnblogs.com/ider/archive/2011/06/30/what_is_in_cpp_header_and_implementation_file.html在C++编程过程中,随着项目的越来越大,代码也会越来越多,并且难以管理和分析。于是,在C++中就要分出了头(.h)文件和实现(.cpp)文件,并且也有了Package的概念。对于以转载 2017-04-11 09:20:36 · 1132 阅读 · 0 评论 -
STL空间配置器的union obj
最近学习《STL源码剖析》一书,看到SGI的第二级配置器时,空闲内存链表使用了一个神奇的联合体(union)结构,代码如下:[cpp] view plain copy union obj{ union obj * free_list_link; char client_data[1]; /* The client sees this.*/ }; 书中描述为这样:由于uni转载 2017-08-26 14:33:11 · 1119 阅读 · 0 评论 -
trivial destructor
项目中有一些地方为了得到较快的速度,使用了无需释放的简易内存分配器:先一次分配一大块内存,然后每次需要内存的时候从这块内存里面直接递增分配合适大小的内存块。当使用完这些内存了以后,不做显式的释放,直到整个大任务结束了以后,才一次释放那整块内存。这样做优点在于内存分配非常快速,仅仅递增指针即可没有释放的开销(除了整块释放)不会有碎片这种做法是很多引擎的常见选择。但是也有一个很大的缺陷转载 2017-08-26 13:21:41 · 695 阅读 · 0 评论 -
弱类型、强类型、动态类型、静态类型语言
动态语言和静态语言(1)动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。(2)静态类型语言:静态类型语言与动态类原创 2017-08-04 22:19:24 · 884 阅读 · 0 评论 -
C++静态库与动态库
C++静态库与动态库这次分享的宗旨是——让大家学会创建与使用静态库、动态库,知道静态库与动态库的区别,知道使用的时候如何选择。这里不深入介绍静态库、动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书《程序员的自我修养——链接、装载与库》。什么是库库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非转载 2017-07-31 11:40:23 · 616 阅读 · 0 评论 -
C语言学习之指针的右左法则
C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标 准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的,两者可以说是相反的。右左法则的英文原文是这样说的:The right-left rule: Start reading转载 2017-06-21 18:07:32 · 744 阅读 · 0 评论 -
shared_ptr智能指针源码剖析
前几天有个人问了我一个问题: 如何将一个智能指针作为函数的返回值传递出来。当时这个问题一下子把我问倒了,后来经人提醒有一个叫shared_ptr的智能指针可以解决这个问题。将shared_ptr作为函数返回值的代码是这样的:#include <tr1/memory>#include <stdio.h>using std::tr1::shared_ptr;shared_ptr<int> Retur转载 2017-06-09 16:23:53 · 1127 阅读 · 0 评论 -
exit和return
Terminate calling processTerminates the process normally, performing the regular cleanup for terminating programs.Normal program termination performs the following (in the same order):Object转载 2017-06-09 08:50:03 · 683 阅读 · 0 评论 -
c/c++ 函数指针的用法
c语言函数指针的定义形式:返回类型 (*函数指针名称)(参数类型,参数类型,参数类型,…);c++函数指针的定义形式:返回类型 (类名称::*函数成员名称)(参数类型,参数类型,参数类型,….); 以下代码编译环境:codeblocks with gcc in win 7c语言函数指针使用举例: #include #include i转载 2017-06-02 14:39:05 · 635 阅读 · 0 评论 -
将基类指针赋给派生类的问题
将派生类地址赋给基类指针,也就是基类指针指派生类对象,也就是我们平时说的多态但是反过来的时候,必须经过强制类型转换才可以编译通过,下来直接代码:#includeusingnamespacestd;class Base{public:virtual void print(){ cout<<"base"<<endl;}};class Derive转载 2017-05-31 18:57:20 · 1504 阅读 · 0 评论 -
static_cast和reinterpret_cast
该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。②用于基本数据类型之间的转换,如把int转换成ch转载 2017-05-31 15:03:42 · 568 阅读 · 0 评论 -
实现一个无法被继承的C++类
一个类不能被继承,也就是说它的子类不能构造父类,这样子类就没有办法实例化整个子类从而实现子类无法继承父类。我们可以将一个类的构造函数声明为私有,使得这个类的构造函数对子类不可见,那么这个类也就不能继承了。但是,这引出一个问题,客户程序岂不是也无法实例化这个类了?OK,让我们参考一下Singleton模式,用一个static函数来帮助创建这个类的实例,问题就解决了!class CPa转载 2017-05-30 19:09:22 · 563 阅读 · 0 评论 -
C++中static详解
欢迎到我的新博客访问原文链接http://www.61mon.com/index.php/archives/166/ 要想深层次的理解static,必须先理解C++中内存分配方式和C++链接属性。一:C++内存分配方式 先看C++中内存的分配方式。 在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,在执行函数时,函数内局部变量的存储单元都可原创 2016-12-31 19:36:04 · 585 阅读 · 0 评论 -
C++与C的保留小数
首先看C++的:C++要实现对浮点型数据小数位的保留,需要添加头文件,C++一共有三种小数保留方式,具体看代码实现更简便点。#include#includeusing namespace std;int main(){ double a = 3.141111; double b = 3.149999; //第一种 cout << fixed << setprecisio原创 2016-01-10 13:02:08 · 7039 阅读 · 0 评论 -
C++与C的输出对齐
首先看C++的:C++输出对齐需要包含头文件,当然对齐方式也分为左右两种,直接看代码更好理解。#include #includeusing namespace std;int main(){ int a = 9999; int b = 999; int c = 99; //默认右对齐 cout << "默认右对齐为:\n"; cout << setw(6) << a原创 2016-01-10 10:40:20 · 36048 阅读 · 0 评论 -
二级指针实现单链表的插入、删除及 linux内核源码双向链表之奇技
二级指针实现单链表的插入、删除今天看了coolshell上关于二级指针删除单链表节点的文章。文章中Linus 举例:例如,我见过很多人在删除一个单项链表的时候,维护了一个”prev”表项指针,然后删除当前表项,就像这样:[cpp] view plain copy if (prev) prev->nex转载 2017-05-07 09:59:51 · 938 阅读 · 0 评论 -
不具名的命名空间(unnamed namespaces)
众所周知,命名空间是用来防止对象的重复定义的。 如下,编译不会出错:namespace n1{ int x;}namespace n2{ int x;}//访问n1.x;n2.x;上面是具名的名字空间,不具名的名字空间也是防止对象重复定义用,只是他没有名字而已。//file1.cpp:namespace { //变量x和方法fun只在file1.cpp转载 2017-04-08 09:54:49 · 1224 阅读 · 0 评论 -
free store与heap的区别
这个问题有点争议,看了很多博客,也去技术论坛搜了下,基本得出以下结论:malloc在堆上分配内存,new在自由存储区上分配内存。但是两者有何区别呢?http://www.devx.com/tips/Tip/13757上所说: The terms heap and free-store are used interchangeably when referring to dynamically a原创 2017-03-30 23:21:25 · 1209 阅读 · 0 评论 -
cpp到obj再到exe,重定义的问题
一个工程项目,会有很多.cpp,每个.cpp先生成对应的.obj,即编译单元;接着链接器把所有编译单元链接起来,组成一个.exe,这就是程序了。 include的目的是我们可能会在当前的cpp中使用其他cpp内定义的东西,但是我们不可以直接include该cpp,因为这会导致在链接的时候出现重定义的错误(cpp本身有一份定义,又被别人include了一份定义,链接的时候就会有两份定义)。因原创 2017-03-29 10:15:50 · 4397 阅读 · 0 评论