C++编程思想1

学了好久的 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 ;


}

 

 

 

 

上一篇:深入浅出 jackrabbit 九 索引合并(下)


下一篇:深入浅出 jackrabbit 八 索引合并(上)