1、定义的声明的区别 :声明是 声明了标示符的存在 并没有为 其分配空间 ,而定义 是为其分配的一定的存储空间int * p ;//这是对指针的声明 并且定义int p;//这是对整形变量的声明并且定义exern void show() ;==void show() ;对于函数来说只要没有函数体 那么都是声明 extern 表示对函数的声明 表示这个函数是再外部定义的 .我们在编译器下 同时写下int i;int i ;//会出现冲的定义的错误 编译器会理解为"我到底改用那个i呢?"
extern int i ;int i ;//那么就不会出现错误 原因是 第一个i是一个对于变量的声明 并没有分配存储空间 第二次 才为 i分配了存储空间
2、 memcpy 函数 void *memcpy( void *dest, const void *src, size_tcount );这个函数我们在C中经常用到 ,其实 他 跟 strcpy很类似 都是向目的类型的地址 拷贝 n个 内存块注意这里的参数是 void* 因为我们是对内存块进行操作 所以可以是任意数据类型程序员对于内存的理解应该一视同仁 没有类型的区别 . 只是我们在使用内存的时候 将二进制代码 进行了 数据化了
3、 malloc函数和 calloc函数 assert函数void *malloc( size_t size);void *calloc( size_t num, size_tsize );void assert( int expression ); //如果参数是FALSE那么 强制终止程序的运行 也就是 非0 退出这两个函数都是在堆中分配指定大小的void* 内存区域 只是calloc可以进行初始化而 malloc函数不进行初始化 .当malloc函数分配的内存在 第一次被使用的时候 那么 它的每个单元的数据可能是 0但是 如果分配来的这块内存区域被使用过了 那么就可能使任意数了 .这里我们会问free函数 做什么了?free函数 只是告诉编译器 我们之前用malloc分配的内存区域 可以重复使用而已,在一定程度上可以理解为释放现在想想 我们的 fopen 函数和 fclose函数 所 用到的 FILE结构体也是 由此 而来的
4、标准库的发放形式.我们在 VC中用到 string.h 等等头文件 就可以使用里面定义的函数 等等 我们可以找到 String.h 但是我们却找不到他的实现文件 CPP (也就是源文件)
在以往的C库的编写中我们通常 将具有 统一功能 和 分类的 一组 数据类型 和函数放在一个 头文件中定义 ,然后再原文件中实现 .然而我们到 微软提供的VC下面却找不到 这些对应文件的实现 .这是因为对于 微软而言 我们是使用VC的用户 ,虽然我们是软件开发者,但是我们是在微软的平台下使用。
微软给我提供了的借口是 头文件+动态链接库的 形式 而不是 头文件+源文件的形式 .对于微软而言 不会给我们 库的实现部分 .只需要给我们提供动态链接库,我们就可以使用它们所定义的函数 以及类型
5、重复定义的问题#ifndef test #define final #endif
在一个较大的工程中我们可能会用到多个头文件 架设 我们在多个头文件中同时包含了 一个头文件 那么 在 编译器进行编译链接的时候就会发生 数据类型或者 函数的 重复定义问题 为了解决这个问题 那么我们要用到 预编译指令如果在 lib.h的头文件下有 int i ; 为了防止被重复定义 那么 我们在 lib.cpp中应该这样定义#ifndef lib_H_ int ;#endif ;这样就可以防止统一数据 被重复定义的问题
6、 C++的封装C++的封装 这是一个歧义的问题?
有些人把封装用在解释隐藏上 ,而我觉得用来解释类这一个抽象数据类型很合适 、在以前的C中 struct 结构体中我们吧 一组相关的 属性组合成一个结构体 那么这个结构体 只是作为数据的封装,没有其他的实际意义。但是在C++中则不同了。类中可以加入函数 ,等操作行为 使面向对象的思想得以很好的实现,一个类代表一类事物,一个类的实例代表一个对象 ,这个对象有自己的属性和行为 .我们把操作的函数封装在类中 也可以避免C中函数命名重复的问题 .
7、联合 Union 枚举 enum的简单实用对于联合 来说他的大小是成员中数据类型字节最大的存储 我们在使用的时候 使用数据类型中的一个 可以节约存储空间enum其实定义的是基于 0开始的 一些数据成员 当然我们可以对枚举成员进行赋值 简单应用如下#include <iostream> using namespace std ;enum Day { one =433,two ,three };union Me { int a ;char buf[100] ;};void main(){ Day a =one;Day b= two ;cout<<a<<endl ;cout<<b<<endl ;Me me1,me2 ;me1.a=100 ;strcpy(me2.buf,"dsfds") ;cout<<"Union中的数字:"<<me1.a<<endl ;cout<<"Union中的字符串:"<<me2.buf<<endl;cout<<"Union的大小是:"<<sizeof(Me)<<endl ;
}
(责任编辑:admin) |