学了好久的 C++了 发现自己对于C/C++还是没有深入的了解 于是 咬咬牙啃起了 C++编程思想 希望能有所感悟 。。
我以前是直接学C++的对于C不是很了解,然而又是在VC下 学习 所以 没有好好的 去学习 标准C++,直到我 看起C++编程思想 我发现真应该从头再学一遍了 。。。
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中函数命名重复的问题 。
6、联合 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 ;
}