C++提供了四个显式的数据类型转换函数
1 reinterpret_cast(在编译期间实现转换) reinterpret_cast类型转换函数将一个类型的指针转换成另一个类型的指针。这种转换不用于修改指针变量值数据存放的格式(不改变指针变量值),只需在编译期间重新解释指针的类型就可以做到。 reinterpret_cast可以将指针值转换为一个整型数。但是不能用于非指针类型的转换,否则将不会通过编译。 什么时候使用reinterpret_cast进行数据类型的转换: (1)将基本类型指针转换成另一个类型的指针。 例如: 基本类型指针的转换...
动态内存管理是C++重要的特性
众所周知,动态内存管理是C++的一个很重要的特性。 但是,在嵌入式系统中,尤其是对稳定性要求比较高的工业应用领域,可能面临的问题是,可以用的内存很小,一旦动态内存分配出现问题,导致系统异常后,会导致很严重的后果。 基于此,在这个项目中,我将尽量避免是用动态内存分配,尤其是在堆(heap)的动态内存分配。 参考了很多资料,在more effective c++找到一点启示。 确定如下几条原则: 1. 准备在项目中不使用new,mallac之类的内存分配函数。 2. 对于大部分的对象,准备禁用堆(stack...
动态内存(初始化和赋值)
#includeiostream using namespace std; class Person { char * pName; public: Person(char* pN="noName") { cout"constructing "pNendl; pName=new char[strlen(pN)+1]; if(pName)strcpy(pName,pN); } Person(const Person s)//拷贝构造函数 { cout"copy constructing "s.pNamee...
嵌套for循环的使用方法
1 如果两个或两个以上的for嵌套使用,则执行循环次数多的放最里面,即执行次数由内到外布局,这样可以提高执行速度,如以下应当这样: const int min = 10; const int max = 100; for(int i=0;imin;i++) { for(int j=0;jmax;j++) { } } 而不应当这样: const int min = 10; const int max = 100; for(int j=0;jmin;j++) { for(int i=0;imax;i++)...
C++中堆和栈的基础学习
堆:操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码 中的delete语句才能正确的释放本内存空间。我们常说的内存泄露,最常见的就是堆泄露(还有资源泄露),它是指程序在运行中出现泄露,如果程序被关闭掉的话,操作系统会帮助释放泄露的内存。 栈:在函数调用时第一个进栈的主函数中的下一条指令(函数调用语句的...
基础入门:C++中const的使用方法
1.const类型定义:指明变量或对象的值是不能被更新,引入目的是为了取代预编译指令 2.可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 3.编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。 4.可以节省空间,避免不必要的内存分配。 例如: #define PI 3.14159 file://常量宏 const doulbe Pi=3.14159; file://此时并未将Pi放入ROM中 …...
C++函数模板基础学习
1.template参数定义中,typename 和class 可以互换,尽量使用typename,不可以使用struct 2.模板参数可以使用任意类型,包括内置类型,自定义类,枚举等 3.模板参数名称可以使用任意名称 4.函数模板不是只编译一份满足多重需要,而是为每一种实例化类型编译一份 5.只有函数模板的使用才会引发实例化 6.为某种类型实例化模板,而此类型不完全支持模板内使用的操作会引发编译错误 7.每种模板会编译两次:1.如果没有用户请求实例化则只做语法检查 2.当用户请求实例化时,模板进行检查...
宏定义中的do...while(0)的使用
如果你是C++程序员,我有理由相信你用过,或者接触过,至少听说过MFC, 在MFC的afx.h文件里面, 你会发现很多宏定义都是用了do……while(0)或do……while(false), 比如说:#define AFXASSUME(cond) do { bool __afx_condVal=!!(cond); ASSERT(__afx_condVal); __analysis_assume(__afx_condVal); } while(0) 粗看我们就会觉得很奇怪,既然循环里面只执行了一次,我要...
基础入门:C++类学习指导
1.结构体 Struct 名称{ 类型名 变量; //定义成员数据 成员函数; }; 与类相似,可以使用public,private,protected.默认public. 2.共用体 Union 名称{ 类型名 变量1; 类型名 变量2; 类型名 变量3; }; 任何时刻,共用体只有一个成员起作用,且共用体所有成员共用一个存储空间,其大小由占用最大存储空间的成员决定。 不能对共用体变量直接输入输出。共用体类型成员可以是任意已定义类型。 3.枚举类型 enum 枚举类型名{枚举表}; 例如:enum d...
C++类成员属性的一种简洁实现
一般来说对于标准C++而言是不存在成员属性这个概念的,以前大家都是用GetXXX/SetXXX来访问或取得数据,好象也没有感觉到任何不便。但是当我们用过C#之类的语言之后,我们总觉得C++这个方式太老土了。于是我们想去实现“属性”这个C++语言缺乏的要素。事实上网络上有很多人已经做了这部分工作,实现的方法有很多种,一种是用模板,一种是根据特定语言来写的,如VC(指的是Microsoft实现的C++)。但是它们要么很复杂,要么很难记住它的准确用法,嗯我总是喜欢简单的东西,因为太复杂的东东会让我的头脑当机。...
C++类模板的特化方法
// general version templateclass T class Compare { public: static bool IsEqual(const T lh, const T rh) { return lh == rh; } }; 这是一个用于比较的类模板,里面可以有多种用于比较的函数, 以IsEqual为例。 一、特化为绝对类型 也就是说直接为某个特定类型做特化,这是我们最常见的一种特化方式, 如特化为float, double等 // specialize for float t...
基础入门:动态创建二维数组
标准方法: 动态开辟二维数组要分两步完成 一步是开行首指针列表 一步是开某一横行的指针 int **a; int n; int i; scanf("%d",n); a=(int **) malloc (n*sizeof(int *)); for (i=0;in;i++) { a[i]=(int *)malloc(n*sizeof(int)); } 其他方法: char arr**; char *GoodsName[1000]; //指针数组,每个指针指向一行 for(i=0;i1000,i++) Goo...