![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 63
fisher_jiang
这个作者很懒,什么都没留下…
展开
-
C Printf and Scanf Reference
C Printf and Scanf Reference http://wpollock.com/CPlus/PrintfRef.htm©2001 by Wayne Pollock, Tampa Florida USA. All Rights Reserved. Table of Contents Background printfConversion type转载 2013-02-11 04:29:05 · 15211 阅读 · 0 评论 -
从一道题谈C++中构造函数调用构造函数
题目如下:问下列代码的打印结果为0吗? #include cstdlib>#include iostream>using namespace std;struct CLS...{ int m_i; CLS( int i ) : m_i(i)...{} CLS() ...{ CLS(0); }};int main()...{ CLS ob转载 2008-05-23 10:21:00 · 1491 阅读 · 0 评论 -
C++中禁止异常信息传递到析构函数外
在有两种情况下会调用析构函数。第一种是在正常情况下删除一个对象,例如对象超出了作用域或被显式地delete。第二种是异常传递的堆栈辗转开解(stack-unwinding)过程中,由异常处理系统删除一个对象。 在上述两种情况下,调用析构函数时异常可能处于激活状态也可能没有处于激活状态。遗憾的是没有办法在析构函数内部区分出这两种情况。因此在写析构函数时你必须保守地假设有异常被激活,因为如果转载 2008-05-25 11:17:00 · 1184 阅读 · 0 评论 -
临界区(Critical section)与互斥体(Mutex)的区别
1、临界区只能用于对象在同一进程里线程间的互斥访问;互斥体可以用于对象进程间或线程间的互斥访问。2、临界区是非内核对象,只在用户态进行锁操作,速度快;互斥体是内核对象,在核心态进行锁操作,速度慢。3、临界区和互斥体在Windows平台都下可用;Linux下只有互斥体可用。原创 2008-05-24 01:19:00 · 6024 阅读 · 0 评论 -
虚析构函数(√)、纯虚析构函数(√)、虚构造函数(X)
一. 虚析构函数我们知道,为了能够正确的调用对象的析构函数,一般要求具有层次结构的顶级类定义其析构函数为虚函数。因为在delete一个抽象类指针时候,必须要通过虚函数找到真正的析构函数。如:class Base...{public: Base()...{} virtual ~Base()...{}};class Derived: public Base...{public: D转载 2008-05-24 15:41:00 · 7546 阅读 · 2 评论 -
宏与内联函数(面试常考)
第一部分:宏为什么要使用宏呢?因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用原创 2008-05-23 10:33:00 · 13344 阅读 · 7 评论 -
C++中struct与class的区别
从语法上,在C++中(只讨论C++中)。class和struct做类型定义时只有两点区别: (一)默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理; (二)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。 除了这两点,class和struct基本就是一个东西。语法上没有任何原创 2008-05-23 00:46:00 · 1295 阅读 · 0 评论 -
请问如何避免用判断来实现求一个整数的绝对值
请问如何避免用判断来实现求一个整数的绝对值 把一个负数的补码连符号位求反后再加1,就是其绝对值了。比如对于-2来说:原码 反码 补码 补码全求反 再加110000010 11111101 11111110 00000001 00000010 假设是32位整数i原创 2008-05-15 00:48:00 · 1480 阅读 · 0 评论 -
构造函数和析构函数中的虚函数调用
构造函数和析构函数中的虚函数调用 一个类的虚函数在它自己的构造函数和析构函数中被调用的时候,它们就变成普通函数了,不“虚”了。也就是说不能在构造函数和析构函数中让自己“多态”。例如:class A...{public: A() ...{ foo();} // 在这里,无论如何都是A::foo()被调用! ~A() ...{ foo();} //原创 2008-05-07 16:49:00 · 698 阅读 · 0 评论 -
如何只在heap上创建对象,如何只在stack上建立对象?
只能在堆上创建的对象,代码如下 class HeapOnly...{public: void destroy() const ...{ delete this; }private: ~HeapOnly()...{};};int main()...{ //HeapOnly obj; HeapOnly *pobj = new HeapO原创 2008-05-01 01:16:00 · 919 阅读 · 0 评论 -
placement new释疑
placement new 是重载operator new的一个标准、全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本)。它的原型如下:void *operator new( size_t, void *p ) throw() { return p; }首先我们区分下几个容易混淆的关键词:new、opera原创 2008-04-30 20:57:00 · 860 阅读 · 1 评论 -
static_cast、dynamic_cast、reinterpret_cast、和const_cast
关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的《C++ 的设计和演化》。最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_cast, dynamic_cast。标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。下面对它们一一进行介绍。static原创 2008-04-30 17:37:00 · 1082 阅读 · 0 评论 -
解析“extern”
解析“extern” http://blog.csdn.net/keensword/archive/2005/06/23/401114.aspx 1、 声明外部变量 现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相透明的,也就是说,在编译时,全局变量的可见域限制在文件内部。下面举一个简单的例子。创建一个工程,里面含有A.cpp和B转载 2008-05-31 11:21:00 · 876 阅读 · 2 评论 -
C++中在多个编译单元中如何定义常量
C++中在多个编译单元中如何定义常量【方法一】: 在某个公用的头文件中直接在某个名字空间中或者全局名字空间中定 义符号常量并初始化(有无static)无所谓,例如:// CommonDef.hconst int MAX_LENGTH=1024;然后每一个使用它的编译单元#include改头文件即可【方法二】: 在某个公用头文件中并且在某个名字空间中或者全局名字空间中原创 2008-05-31 11:35:00 · 1650 阅读 · 0 评论 -
Hash Functions
Hash FunctionsA comprehensive collection of hash functions, a hash visualiser and some test results [see Mckenzie et al.Selecting a Hashing Algorithm, SP&E 20(2):209-224, Feb 1990] will be availab原创 2011-12-08 08:36:14 · 15102 阅读 · 0 评论 -
大白话解析模拟退火算法
优化算法入门系列文章目录(更新中): 1.模拟退火算法 2.遗传算法一. 爬山算法 ( Hill Climbing )介绍模拟退火前,先介绍爬山算法。爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解。如图1所示:假设转载 2011-11-16 23:42:19 · 15121 阅读 · 0 评论 -
C Programming Tips
http://www.stanford.edu/~pgbovine/c-programming-tips.htm#debug-tips转载 2011-10-24 00:50:40 · 1144 阅读 · 0 评论 -
C++好的面试题和不好的面试题
转载水木社区CPLUSPLUS版 C++在中国有很大的市场需求,几乎现在找工作,C++和Java还是最大的两块。从以前别人面试我,到我现在面试别人,谈不上什么面经,只能说我觉得的一些好的面试题目,和一些不太好的面试题目。 不好的面试题:[1] 虚函数如何实现的。 在i = 0; ++i++之后,就属这道题最囧了。我被别人问过,我也听过我同事问这个问题。我只想说,这个转载 2010-05-27 11:04:00 · 2705 阅读 · 1 评论 -
几个“Hello World"的代码混淆
下面的六个程序片段主要完成这些事情:输出Hello, World混乱C语言的源代码(加密源代码,嘿嘿)下面的所有程序都可以在GCC下编译通过,只有最后一个需要动用C++的编译器g++才能编程通过。hello1.c #define _________ } #define ________ putchar #define _______ main #define _(a) __原创 2009-06-07 12:53:00 · 3339 阅读 · 2 评论 -
关于delete 和 delete[ ] (二)
3. 下面我们来看看上面提到的4字节是干什么用的。 int main() { A *a = new A[100]; printf("Adress after new = %p/n", a); printf("number of A at %p = %d/n", (int*)a-1, *((int*)a-1)); printf("size of a转载 2008-11-23 11:02:00 · 1051 阅读 · 0 评论 -
关于delete 和 delete[] (一)
1. 按C++标准的说法,对于非数组类型,分配函数是operator new,释放函数是operator delete。对于数组类型,分配函数operator new[],释放函数是operator delete[]。 If the allocated type is a non-array type, the allocation function’s name is operator new转载 2008-11-23 11:01:00 · 1575 阅读 · 0 评论 -
位运算在算法编程中的使用技巧
原文: http://blog.csdn.net/xlvector/archive/2006/02/10/595842.aspx 在代码优化时,广泛引入位运算可以提高代码的运行速度,本文主要介绍一些常用的位运算的技巧。 求浮点数的绝对值double abs(double y){ double x = y; *(((int *) &x) + 1) &= 0x7fffff转载 2008-10-07 12:51:00 · 1425 阅读 · 1 评论 -
为什么C++编译器不能支持对模板的分离式编译
为什么C++编译器不能支持对模板的分离式编译 首先,C++标准中提到,一个编译单元[translation unit]是指一个.cpp文件以及它所include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件,后者拥有PE[Portable Executable,即windows可执行文件]文件格式,并且本身包含的就已经是二转载 2008-06-08 17:20:00 · 831 阅读 · 0 评论 -
程序检测底层数据是two complement(补码)还是one complement(反码)表示
int CheckComplement(){ union { unsigned int ui; signed int si; }uComplementChecker; uComplementChecker.si = -1; unsigned int ui = ~0; return (uC原创 2008-06-02 10:37:00 · 1118 阅读 · 0 评论 -
c++写不能被继承的类
题目:用C++设计一个不能被继承的类。分析:这是Adobe公司2007年校园招聘的最新笔试题。这道题除了考察应聘者的C++基本功底外,还能考察反应能力,是一道很好的题目。在Java中定义了关键字final,被final修饰的类不能被继承。但在C++中没有final这个关键字,要实现这个要求还是需要花费一些精力。首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类转载 2008-06-02 23:57:00 · 1093 阅读 · 0 评论 -
模板函数的声明和定义都放在.h文件
一个模板函数,把声明和定义分别放在.h文件和.cpp文件种,如果不调用这个函数的话,编译连接都能通过,但是如果调用这个函数的话,连接就有错误如下: --------------------Configuration: IRSEG - Win32 Release------------------ -- Compiling... Location.原创 2008-04-30 10:45:00 · 5111 阅读 · 3 评论 -
__cdecl,__fastcall与__stdcall
cdecl、pascal、stdcall、fastcall等修饰符号到底什么意思呢?非常简单,就是关于堆栈的一些说明,首先是函数参数压栈顺序,其次是压入堆栈的内容由谁来清除,调用者还是函数自己?这些开关用来告诉编译器产生什么样的汇编代码。 简单说明: __cdecl是C/C++和MFC程序默认使用的调用约定,也可以在函数声明时加上__cdecl关键字来手工指定。采用__cdecl约定时,函原创 2008-04-28 10:08:00 · 822 阅读 · 0 评论 -
下面的声明分别是什么意思?
int(* foo())()int(* foo())[]int(* foo[])()变态的:char * const *(*next)()更变态的:char *(* c[10])(int **p) int(* foo())()中,foo应该与右边的()先结合,后与左边的*结合,所以应该是:foo是个函数,它的返回值是个函数指针int(* foo())[] 返回值是整型数组的函数指针原创 2006-05-07 20:35:00 · 1975 阅读 · 0 评论 -
c++资源之不完全导引
撰文/ 曾毅 陶文最后更新:2004年6月12日声明:.本文2004年5月首发于《CSDN开发高手》,版权归该杂志与《程序员》杂志社所有。杂志限于篇幅部分内容有所删节,此处版本为相对完整版本。.本文为介绍性文章,会随笔者学习C++语言不断更新。前言无数次听到“我要开始学习C++!”的呐喊,无数次听到“C++太复杂了,我真的学不会”的无奈。Stan Lippman先生曾在《C转载 2006-04-06 18:16:00 · 1075 阅读 · 0 评论 -
C++的iostream标准库介绍
0 为什么需要iostream 我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的 stdio库不同,它从一开始就是用多重继承与虚拟继承实现的面向对象的层次结构,作为一个c++的标准库组件提供给程序员使用。 iostream为内置类型类型对象提供了输入输出支持,同时也支持文件的输入输出,类的设计者可以通转载 2006-04-01 10:52:00 · 1142 阅读 · 0 评论 -
字节对齐的问题
为了能使CPU对变量进行高效快速的访问,变量的起始地址应该具有某些特性,即所谓的“对齐”。例如对于4字节的int类型变量,其起始地址应位于4字节边界上,即起始地址能够被4整除。变量的对齐规则如下(32位系统):TypeAlignmentchar在字节边界上对齐short (16-bit)在双字节边界上对齐int and long (32-bit)在4字节边界上对齐float在4原创 2006-04-01 10:34:00 · 4082 阅读 · 0 评论 -
main 主函数执行完毕后,是否可能会再执行一段代码?
在网上看到朗讯的一道笔试题,题目是这样的:main 主函数执行完毕后,是否可能会再执行一段代码,给出说明?答案:可以,可以用_onexit 注册一个函数,它会在main 之后执行int fn1(void), fn2(void), fn3(void), fn4 (void); #include#include#includeusing namespace std;int main( vo原创 2006-03-25 14:16:00 · 3312 阅读 · 1 评论 -
Big Endian 和 Little Endian
谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是little endian呢?其实big endian是指低地址存放最高有效字节(MSB),而little end原创 2006-03-25 14:12:00 · 1064 阅读 · 0 评论 -
类的作用域
类的作用域简称类域,它是指在类的定义中由一对花括号所括起来的部分。每一个类都具有该类的类域,该类的成员局部于该类所属的类域中。 在类的定义中可知,类域中可以定义变量,也可以定义函数。从这一点上看类域与文件域很相似。但是,类域又不同于文件域,在类域中定义的变量不能使用auto,register和extern等修饰符,只能用static修饰符,而定义的函数也不能用extern修饰符。另外,在类域原创 2006-03-19 20:48:00 · 2125 阅读 · 0 评论 -
局部类和嵌套类
局部类 在一个函数体内定义的类称为局部类。局部类中只能使用它的外围作用域中的对象和函数进行联系,因为外围作用域中的变量与该局部类的对象无关。在定义局部类时需要注意:局部类中不能说明静态成员函数,并且所有成员函数都必须定义在类体内。在实践中,局部类是很少使用的。下面是一个局部类的例子。 int a; void fun() { static int s; class A {原创 2006-03-19 20:47:00 · 1068 阅读 · 0 评论 -
类
在面向对象的程序设计中,有经常接触类、对象等专业名词;到底什么是类、什么是对象呢?在程序又是怎样运用呢?类是面向对象程序设计的核心,它实际是一种新的数据类型,也是实现抽象类型的工具,因为类是通过抽象数据类型的方法来实现的一种数据类型。类是对某一类对象的抽象;而对象是某一种类的实例,因此,类和对象是密切相关的。没有脱离对象的类,也没有不依赖于类的对象。 什么是类 类是一种复杂的数据类型,原创 2006-03-19 20:47:00 · 878 阅读 · 0 评论 -
C++中的指针
在学习c/c+过程中,指针是一个比较让人头痛的问题,稍微不注意将会是程序编译无法通过,甚至造成死机。在程序设计过程中,指针也往往是产生隐含bug的原因。下面就来谈谈指针的应用以及需要注意的一些问题,里面也许就有你平时没有注意到的问题,希望能帮助各位读者理解好指针。 一、我们先来回忆一下指针的概念吧,方便下面的介绍 指针是存放地址值的变量或者常量。例如:int a=1;&a就表示指针原创 2006-03-19 20:46:00 · 979 阅读 · 0 评论 -
C++对象的初始化
构造函数和析构函数 构造函数和析构函数是在类体中说明的两种特殊的成员函数。构造函数的功能是在创建对象时,使用给定的值来将对象初化。析构函数的功能是用来释放一个对象的,在对象删除前,用它来做一些清理工作,它与构造函数的功能正好相反。下面举一例子来说明构造函数和析构函数的特点: class TDate { public: TDate(int y, int m, in原创 2006-03-19 20:44:00 · 2492 阅读 · 0 评论 -
#pragma预处理指令详解
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。 其格式一般为: #Pragma Para 其中Para原创 2006-06-04 22:00:00 · 5694 阅读 · 0 评论 -
memset函数的用法
原型:extern void *memset(void *buffer, int c, int count); 用法:#include 功能:把buffer所指内存区域的前count个字节设置成字符c。 说明:返回指向buffer的指针。 举例: // memset.c #include #include原创 2006-06-20 17:18:00 · 4420 阅读 · 0 评论