C/C++
文章平均质量分 73
xdonx
这个作者很懒,什么都没留下…
展开
-
函数模板与类模板
C++提供的函数模板可以定义一个对任何类型变量进行操作的函数,从而大大增强了函数设计的通用性。使用函数模板的方法是先说明函数模板,然后实例化成相应的模板函数进行调用执行。原创 2010-08-06 10:34:00 · 427 阅读 · 0 评论 -
复制构造函数在什么时候被调用?
转自:http://www.slyar.com/blog/cpp-copy-constructor.html 这个问题不是疑问了,查了一下国外网站,总结一下。假设Person是一个类,复制构造函数的调用会在以下几种情况下发生:1、对象在创建时使用其他的对象初始化Person p(q); //此时复制构造函数被用来创建实例pPerson p = q; //此时复制构造函数被用来在转载 2013-07-30 12:00:02 · 2791 阅读 · 0 评论 -
const、volatile区别
1、const下面的声明都是什么意思? const int a;int const a;const int *a;int * const a;int const * a const; /******/前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,转载 2013-07-29 12:33:47 · 1371 阅读 · 0 评论 -
reinterpret_cast,const_cast,static_cast,dynamic_cast 显式类型转换
reinterpret_cast,const_cast,static_cast,dynamic_cast 显式类型转换 Cpp代码 #include int main(void) { //reinterpret_cast //将一个类型指针转换为另一个类型指针,这种在转换不修改指针变量值数据存放格式 //只需在编译时重新解释指针的类转载 2013-07-22 14:01:53 · 599 阅读 · 0 评论 -
内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理]
转自:http://blog.sina.com.cn/s/blog_7edcf63b0100yhk9.html 一. 在c中分为这几个存储区1.栈 ——由编译器自动分配释放2.堆 ——一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收3.全局区(静态区)——全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态转载 2013-07-22 13:43:26 · 769 阅读 · 0 评论 -
C++ explicit关键字应用方法详解
C++编程语言中有很多比较重要的关键字在实际编程中起着非常重要的作用。我们今天为大家介绍的C++ explicit关键字就是其中一个应用比较频繁的关键字。下面就让我们一起来看看这方面的知识吧。C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?如果c++类的构造函数有一个参数,那么在编译的时候就会转载 2013-07-22 13:14:30 · 453 阅读 · 0 评论 -
类模板与模板类
1.类模板与模板类的概念⑴ 什么是类模板 一个类模板(也称为类属类或类生成类)允许用户为类定义一种模式,使得类中的某些数据成员、默写成员函数的参数、某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的)。 如果一个类中数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的、实际的类,而是代表着一类类。转载 2013-07-22 12:20:30 · 1345 阅读 · 0 评论 -
C++关键字
#pragma data_segC++关键字--volatileC++关键字(1)——constC++关键字(2)——externC++关键字(3)——staticC++ 运算符重载--operatorC++ 关键字——friend转载 2013-07-22 13:41:43 · 680 阅读 · 0 评论 -
C++ typeof基本应用方式解析
一、基本用法。1、C++ typeof表达式。以下是它列出的用法:a、取表达式的值的类型:template class A, class B> function operator*(A a, B b) -> typeof(a*b); // return type last // big change: function keyword // : and return are o转载 2013-07-22 16:56:18 · 3254 阅读 · 0 评论 -
C++构造函数虚拟化
虚拟构造函数当你有一个指针或引用,但是不知道其指向对象的真实类型是什么时,你可以调用虚拟函数来完成特定类型(type-specific)对象的行为。仅当你还没拥有一个对象但是你确切地知道想要对象的类型时,你才会调用构造函数。那么虚拟构造函数又从何谈起呢?例如假设你编写一个程序,用来进行新闻报道的工作,一条新闻报道由文字或图片组成。你可以这样管理它们:class NLCompon转载 2013-07-30 13:06:12 · 576 阅读 · 0 评论 -
Linux中brk(),sbrk(),mmap(),malloc(),calloc()的异同
Linux中brk(),sbrk(),mmap(),malloc(),calloc()的异同brk和sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的: 每个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只分配并不大的数据段空间,程序中动态分配的空间就是从这一块分配的。如果这块空间不够,malloc函数族(r转载 2013-07-23 16:41:54 · 1060 阅读 · 0 评论 -
C语言的5种存储类以及关键字volatile、restrict
《C Primer Plus》读到12章,我的C语言复习进展的挺不错。这一章介绍存储类、连接和内存管理,可以说是重中之重。C的5种存储类:自动——在一个代码块内(或在一个函数头部作为参量)声明的变量,无论有没有存储类修饰符auton,都属于自动存储类。该类具有自动存储时期、代码块的作用域和空链接(no linkage),如未初始化,它的值是不确定的(java要求局部变量必须初始化)转载 2013-07-29 12:22:32 · 529 阅读 · 0 评论 -
虚继承---虚基类 菱形继承关系
虚继承就是虚基类的使用;引入虚基类的目的是为了解决类继承过程中产生的二义性问题;这种二义性问题常见于具有菱形继承关系的类中;比如:有四个类:A、B、C、D;它们之间的继承关系是:B继承A,C继承A,D继承B和C;这就形成了一个菱形的继承关系;具有这种继承关系的图叫做有向无环图;那么类D就有两条继承路径:D-->B-->A和D-->C-->A;而类A是派生类D的两条继承路径上的公共基类,转载 2013-07-26 13:17:03 · 632 阅读 · 0 评论 -
C++中实现Singleton的正确方法
转自:http://yunli.blog.51cto.com/831344/758684 如果某个类管理了系统中唯一的某种资源,那么我们只能创建该类的一个实例,此时用到singleton设计模式(后面为了简化将省略“设计模式”四个字)就比较合适了。然而,如果不注意实现方法,就很有可能会让我们碰到一些莫名其妙的错误。图1是经过简化所得到的一个实现错误的例子。main.c 00001: #转载 2013-07-25 17:27:41 · 481 阅读 · 0 评论 -
C++完美实现Singleton模式
Singleton模式是常用的设计模式之一,但是要实现一个真正实用的设计模式却也不是件容易的事情。1. 标准的实现class Singleton{public: static Singleton * Instance() { if( 0== _instance) {转载 2013-07-25 17:24:26 · 677 阅读 · 0 评论 -
Xcode 4.3 xcode-select路径问题
事情是这样的。家里那台 Macbook Pro 装的是 Xcode 4.2.x,公司用的 Mini Mac 装的是 Xcode 4.3。发现想要在终端下通过 make 编译一些东西,似乎 Xcode 4.2.x 版本要比 4.3 好用。4.3 在终端下 make 编译会遇到错误,总是提示需要通过 xcode-select 来更新什么路径,也不太明白。直到遇到了 icyleaf 和 User y转载 2013-07-31 00:49:01 · 2874 阅读 · 0 评论 -
Vector 是线程安全的?
或许,大家经常也碰到类似的问题:Vector 与 ArrayList 的区别?好多人一拍脑门就出:Vector 是线程安全的 (在任何情况下都是)。。。原因可能是因为 Vector 的所有方法加上了 synchronized 关键字,从而保证访问 vector 的任何方法都必须获得对象的 intrinsic lock (或叫 monitor lock),也即,在vector内部,其转载 2013-07-25 10:47:37 · 18009 阅读 · 6 评论 -
关于C语言中继承和多态的实现
在C中实现继承。 对于例(1)中,有个重大的缺点,那就是缺乏类型安全。那么下面就可以使用继承来实现保证类型安全。typedef struct tagT_MsgHeader { int id; //...}MsgHeader;typedef struct tagT_Msg1 { MsgHeader h; int转载 2013-07-23 18:22:32 · 842 阅读 · 0 评论 -
异常与构造函数、析构函数
转自:异常与构造函数、析构函数 写Java代码的时候,遇到错误总是喜欢抛出异常,简单实用。最近开始写C++代码,发现异常没那么简单,使用须谨慎。 翻阅了《Effective C++》 《More Effective C++》《Inside The C++ Object Model》的相关章节,大概弄明白了一些东东,总结在本文。 本文不是总结普适的C++异常机制,还转载 2013-07-24 10:36:59 · 705 阅读 · 0 评论 -
placement new
今天看STL源码遇到一个问题: template inline void _Construct(_T1* __p, const _T2& __value) { new ((void*) __p) _T1(__value);} 上网搜到了一些文章,分享了: 原帖地址: http://www.ksarea.com/articles/20080124_cc.html转载 2013-07-23 11:31:01 · 796 阅读 · 0 评论 -
C++内存对齐详细使用指南
一、为什么会有C++内存对齐以下内容节选自《Intel Architecture 32 Manual》。为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。一个字或双字操作数跨越了4字节边界,或者一个四字操作数跨越了8字节边界,被认为是未对齐的,从而需要两次总线周期来访问内存转载 2013-07-22 14:40:48 · 608 阅读 · 0 评论 -
do...while(0)的妙用
1. do...while(0)消除goto语句。2 宏定义中的do...while(0)转载 2010-09-10 13:26:00 · 390 阅读 · 0 评论 -
关于算法的时间复杂度
常见的时间复杂度,按数量级递增排列依次为:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n^2)、立方阶O(n^3)、k次方阶O(n^k)、指数阶O(2^n)。原创 2010-08-11 23:24:00 · 743 阅读 · 0 评论 -
深刻剖析经典面试题之一:堆和栈的区别
一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统转载 2010-08-11 18:42:00 · 453 阅读 · 0 评论 -
析构函数virtual与非virtual区别
不用virtual 的几种情况:1、作为非公有基类。仅作为 private base class 使用的 class 不需要使用虚拟析构函数 2、不作为接口使用的基类。 3. 如果你可以保证这个类不被public继承(private/protected继承的话,在非friend函数/类中就无法用基类指针指向派生类了) 4. 如果它的所有派生类(包括派生类的派生类)的析构函数都是trivial的(这里的trivial指的是在程序员的层次什么事也不做)转载 2010-08-10 15:09:00 · 483 阅读 · 0 评论 -
为什么析构函数要声明成virtual呢?
如果一个类要被使用成多态(polymorphic)的,那么这个virtual是必须的。转载 2010-08-10 15:02:00 · 415 阅读 · 0 评论 -
重载(overload),覆盖(override),隐藏(hide)
<br />重载(overload):<br />必须在一个域中,函数名称相同但是函数参数不同,重载的作用就是同一个函数有不同的行为,因此不是在一个域中的函数是无法构成重载的,这个是重载的重要特征<br /><br />覆盖(override):<br />覆盖指的是派生类的虚拟函数覆盖了基类的同名且参数相同的函数,既然是和虚拟函数挂钩,说明了这个是一个多态支持的特性,所谓的覆盖指的是用基类对象的指针或者引用时访问虚拟函数的时候会根据实际的类型决定所调用的函数,因此此时派生类的成员函数可以"覆盖"掉基类的成原创 2010-08-10 14:18:00 · 334 阅读 · 0 评论 -
决不要重新定义继承而来的非虚函数
在一个类中声明一个非虚函数实际上为这个类建立了一种特殊性上的不变性,因为它表示的是不会改变的行为 ---- 不管一个派生类有多特殊,声明非虚函数的目的在于,使派生类继承函数的接口和强制性实现"原创 2010-08-10 13:53:00 · 429 阅读 · 0 评论 -
C++虚函数的原理
1、从包含虚函数的类派生一个类时,编译器就为该类创建一个VTABLE。其每一个表项是该类的虚函数地址。2、在定义该派生类对象时,先调用其基类的构造函数,然后再初始化VPTR,最后再调用派生类的构造函数(从二进制的视野来看,所谓基类子类是一个大结构体,其中this指针开头的四个字节存放虚函数表头指针。执行子类的构造函数的时候,首先调用基类构造函数,this指针作为参数,在基类构造函数中填入基类的vptr,然后回到子类的构造函数,填入子类的vptr,覆盖基类填入的vptr。如此以来完成vptr的初始化。)转载 2010-08-10 14:53:00 · 338 阅读 · 0 评论 -
函数参数中带省略号的用法
我们在C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: int printf( const char* format, ...);原创 2010-09-06 15:35:00 · 748 阅读 · 0 评论 -
C语言宏定义中#用法
一、一般用法我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.二、当宏参数是另一个宏的时候需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开原创 2010-09-06 15:31:00 · 463 阅读 · 0 评论 -
C++关键字——const
C++关键字(1)——const部分内容来自作者JuKevin1. const修饰普通变量和指针const修饰变量,一般有两种写法:const TYPE value;TYPE const value;这两种写法在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即va转载 2013-07-22 13:31:21 · 606 阅读 · 0 评论 -
C++ 关键字——friend
C++ 关键字——friend 友元是指:采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了转载 2013-07-22 13:19:12 · 591 阅读 · 0 评论 -
offsetof宏解析
offsetof宏解析今天看代码时,发现一个有用的东东,offsetof(s,m),这是一个宏,MSDN文档的说明如下:Retrieves the offset of a member from the beginning of its parent structure.size_t offsetof(structName,memberName );转载 2013-07-22 10:51:53 · 1454 阅读 · 0 评论 -
C++构造函数初始化顺序
C++构造函数初始化顺序C++构造函数按下列顺序被调用:(1)任何虚拟基类的构造函数按照它们被继承的顺序构造;(2)任何非虚拟基类的构造函数按照它们被继承的顺序构造;(3)任何成员对象的构造函数按照它们声明的顺序调用;(4)类自己的构造函数。#include using namespace std;class OBJ1{public:转载 2013-07-22 10:41:12 · 567 阅读 · 0 评论 -
C++ 初始化列表
何谓初始化列表与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。在C++中,struct和class的唯一区别是默认的克访问性不同,而这里我们不考虑访问性的问题,所以下面的代码都以struct来演示。struct foo{ string name ; int id ;转载 2013-06-09 13:14:04 · 581 阅读 · 0 评论 -
栈增长和大端/小端问题
栈增长和大端/小端问题是和CPU相关的两个问题。在内存管理中,与栈对应是堆。对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方式是向下的,是向着内存地址减小的方向增长。在内存中,“堆”和“栈”共用全部的自由空间,只不过各自的起始地址和增长方向不同,它们之间并没有一个固定的界限,如果在运行时,“堆”和 “栈”增长到发生了相互覆盖时,称为“栈堆冲突”,系统肯定垮台。转载 2013-06-09 18:20:25 · 719 阅读 · 0 评论 -
Objective-C 对 URL 进行 URLEncode 编码
在 iOS 程序访问 HTTP 资源时需要对 URL 进行 Encode,比如像拼出来的 http://unmi.cc?p1=%+&sd f&p2=中文,其中的中文、特殊符号&%和空格都必须进行转译才能正确访问。在 Java、.net 和 JS 中都有相应的 encodeURL 方法可用,在 Objective-C 语言中,你可以试下 - (NSString *)stringB转载 2012-08-16 13:57:12 · 1350 阅读 · 0 评论 -
为何new出的对象数组必须要用delete[]删除,而普通数组delete和delete[]都一样
温馨提示:该文所有测试没有特殊说明都是在Debug模式下!用的是VS2010编译器!==================================================================================================================================== 1.在释放堆栈中c++基本数据(包转载 2013-07-29 19:16:37 · 839 阅读 · 0 评论