代码改变世界

随笔分类 -  C++

C语言中的关于“位域”的说明(转载,有修改)

2012-03-29 11:55 by Rollen Holt, 886 阅读, 收藏, 编辑
摘要: 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为: struct 位域结构名 { 位域列表 };其中位域列表的形式为: 类型说明符 位域名:位域长度例如:struct bs{ in 阅读全文

C++查缺补漏4,赶紧的

2012-03-28 22:56 by Rollen Holt, 1106 阅读, 收藏, 编辑
摘要: 请说出const与#define 相比,有何优点?答案:1)const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。 2)有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。在8086 汇编下,逻辑地址和物理地址是怎样转换的?(Intel)答案:通用寄存器给出的地址,是段内偏移地址,相应段寄存器地址*10H+通用寄存器内地址,就得到了真正要访问的地址。当一个类A 中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少,如果不是零,请解释一下编译器为 阅读全文

C++查缺补漏3,赶紧的

2012-03-28 22:30 by Rollen Holt, 491 阅读, 收藏, 编辑
摘要: 如何判断一段程序是由C 编译程序还是由C++编译程序编译的? 答案: #ifdef __cpluspluscout<<"c++";#elsecout<<"c";#endif如何打印出当前源文件的文件名以及源文件的当前行号? 答案: cout << __FILE__ ; cout<<__LINE__ ; __FILE__和__LINE__是系统预定义宏,这种宏并不是在某个文... 阅读全文

C++查缺补漏2,赶紧的

2012-03-28 21:29 by Rollen Holt, 525 阅读, 收藏, 编辑
摘要: 先来看一段代码把: #include <iostream>#include <typeinfo>using namespace std;void foo(void){ unsigned int a = 6; int b = -20; (a+b > 6) ? puts("> 6") : puts("<= 6");}int _tmain(int argc, _TCHAR* argv[]){... 阅读全文

一道面试题: 预处理器标识#error的目的是什么?

2012-03-28 20:51 by Rollen Holt, 4860 阅读, 收藏, 编辑
摘要: 编译程序时,只要遇到#error就会跳出一个编译错误,既然是编译错误,要它干嘛呢?其目的就是保证程序是按照你所设想的那样进行编译的。下面举个例子:程序中往往有很多的预处理指令#ifdefXXX...#else#endif当程序比较大时,往往有些宏定义是在外部指定的(如makefile),或是在系统头文件中指定的,当你不太确定当前是否定义了XXX时,就可以改成如下这样进行编译:#ifdefXXX...#error"XXXhasbeendefined"#else#endif这样,如果编译时出现错误,输出了XXXhasbeendefined,表明宏XXX已经被定义了。用处就是这样 阅读全文

C++查缺补漏,赶紧的

2012-03-28 20:50 by Rollen Holt, 768 阅读, 收藏, 编辑
摘要: c++中 switch支持的数据类型为实型 (麻烦朋友们给我解释一下什么是实型) 支持的有int long unsigned short enum类型,不支持的是:float double string 回答下面的问题: Void GetMemory(char **p, int num){*p = (char *)malloc(num);}void Test(void){char *s... 阅读全文

几种函数调用方式

2012-03-28 20:19 by Rollen Holt, 937 阅读, 收藏, 编辑
摘要: __cdecl 是C DECLaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。 _stdcall 是StandardCall的缩写,是C++的标准调用方式:所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针。这些堆栈中的参数由被调用的函数在返回后清除,使用的指令是 retnX,X表示参数占用的字节数,CPU在ret之后自动弹出X个字节的堆栈空间。称为自动清栈。. 阅读全文

一个类的实例化对象所占空间的大小

2012-03-28 19:34 by Rollen Holt, 5609 阅读, 收藏, 编辑
摘要: 注意不要说类的大小,是类的对象的大小.首先,类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的。用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小。如果Class A;A obj;那么sizeof(A)==sizeof(obj)那么sizeof(A)的大小和成员的大小总和是什么关系呢,很简单,一个对象的大小大于等于所有非静态成员大小的总和。为什么是大于等于而不是正好相等呢?超出的部分主要有以下两方面:1) C++对象模型本身对于具有虚函数的类型来说,需要有一个方法为它的实体提供类型信息(RTTI)和虚函数入口,常见的方法是建立一个虚函数入口表,这个表可为相同类型的 阅读全文

const_iterator和const iterator的区别

2012-03-27 21:14 by Rollen Holt, 632 阅读, 收藏, 编辑
摘要: #include <iostream>#include <string>#include<fstream>#include <algorithm>#include <iterator>#include <vector>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ vector<int> myVec; myVec.push_back(0); myVec.push_back(1); myVec.push_back(2); copy( myVec. 阅读全文

boost 学习笔记

2012-03-27 11:05 by Rollen Holt, 2919 阅读, 收藏, 编辑
摘要: 先来看看如何赋值把: #include <iostream>#include <vector>#include <string>#include<deque>#include <set>#include <map>#include <boost/assign.hpp>using namespace std; int _tmain(int argc, _TCHAR* argv[]){ us... 阅读全文

Boost中的一些实用技术

2012-03-26 22:11 by Rollen Holt, 994 阅读, 收藏, 编辑
摘要: 类型推断: #include <iostream>#include <vector>#include <string>#include <boost/typeof/typeof.hpp>using namespace std;vector<string> func(){ vector<string> v(10); return v;}int _tmain(int argc, _TCHAR* ar... 阅读全文

boost date_time

2012-03-26 20:05 by Rollen Holt, 2370 阅读, 收藏, 编辑
摘要: #include <iostream>#include <boost/date_time/gregorian/gregorian.hpp>#include <boost/static_assert.hpp>using namespace std;using namespace boost::gregorian;int _tmain(int argc, _TCHAR* argv[]){ date ... 阅读全文

progress_display

2012-03-26 18:10 by Rollen Holt, 350 阅读, 收藏, 编辑
摘要: #include <iostream>#include <vector>#include<boost/progress.hpp>using namespace std;using namespace boost;int _tmain(int argc, _TCHAR* argv[]){ vector<int> v; progress_display pd(10000); for(int i=0... 阅读全文

Boost–progress_timer

2012-03-26 17:43 by Rollen Holt, 604 阅读, 收藏, 编辑
摘要: progress_timer继承自timer,但是精度为2,为了扩展精度,我们自己实现一个类,代码如下: #include <iostream>#include<boost/progress.hpp>#include <boost/static_assert.hpp>using namespace std;using namespace boost;template<int N=2>cla... 阅读全文

boost学习之 时间和日期 timer

2012-03-26 17:23 by Rollen Holt, 1271 阅读, 收藏, 编辑
摘要: #include <iostream>#include<boost/timer.hpp>using namespace std;using namespace boost;int _tmain(int argc, _TCHAR* argv[]){ timer t; //构造函数自动启动计时工作 cout<<"max timespan(hours): "<<t.elapsed_max()/3600<<endl; cout<<"min timespan(seconds): "<&l 阅读全文

《C++必知必会》读书笔记4

2012-03-25 13:53 by Rollen Holt, 402 阅读, 收藏, 编辑
摘要: int *f(); //一个返回值为int* 的函数int (*f)(); //一个函数指针,指向一个返回类型为int的并且无参数的函数const int N=12;int *a[N]; //首先,提醒这段代码在c中不行。 这个是一个具有N个int * 元素的数组int (*a)[N]; //一个指针,指向一个具有N个int元素的数组。int(**p)[N]; //一个指针,指向一个指针,后者指向一个具有N哥int元素的数组int *(*p)[N]; //一个指针,指向一个具有N个int * 元素的数组int (**const p)()const =0; //一个常量指针,指向一个指向函数的指 阅读全文

《C++必知必会》读书笔记3

2012-03-25 12:45 by Rollen Holt, 391 阅读, 收藏, 编辑
摘要: 指向数据成员的“指针”并非指针。#include <iostream>using namespace std;class A{public: A(){ //do nothing here. } A(int num,double num2){ this->num=num; this->num2=num2; } int num; double num2;};int _tmain(int argc, _TCHAR* argv[]){ A* pA=new A(5,6); int A::* p=&A::num; //p是一个指针,指向A的一个int成员 double A: 阅读全文

《C++必知必会》读书笔记2

2012-03-24 23:54 by Rollen Holt, 490 阅读, 收藏, 编辑
摘要: 在类X的非常量成员函数中,this指针的类型为 X *const .也就是说他是指向非常量X的常量指针。 但是在类X的常量成员函数中,this的类型为const X* const . 这就是常量成员函数和非常量成员函数的区别。 类的非静态数据成员可以被声明为mutable,这将容许她们的值可以被这个类的常量成员函数(也包括非常量成员函数)修改。 如果一个类声明了一个或者多个虚函数,那么... 阅读全文

《C++必知必会》读书笔记1

2012-03-24 21:16 by Rollen Holt, 501 阅读, 收藏, 编辑
摘要: 指针和引用的区别: 1)不存在空引用 2)所有的引用都需要初始化 3)一个引用始终指向对他初始化的那个对象 数组作为参数的时候,会退化为指针。同样的例子也发生在函数上。一个函数型参数会退化为一个函数指针。 由于数组形参中数组的边界被忽略了,所以在声明的时候最好将其忽略。然而如果函数期望接受一个指向一个元素序列的指针作为参数的时候,而不是接受单个的指针,那么最好采... 阅读全文

微软面试题:利用天平砝码,三次将140克的盐 分成50、90克两份?

2012-03-23 23:05 by Rollen Holt, 3710 阅读, 收藏, 编辑
摘要: 有一个天平,2克和7克砝码各一个。如何利用天平砝码在三次内将140克盐分成50,90克两份。 第一种方法: 第一次:先称 7+2克盐 (相当于有三个法码2,7,9) 第二次:称2+7+9=18克盐 (相当于有2,7,9,18四个法码) 第三次:称7+18=x+2,得出x是23,23+9+18=50克盐. 剩下就是90克了. 第二种方法: 1.先把140克盐分为两... 阅读全文