`
txf2004
  • 浏览: 6872012 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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 ;


}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics