《C++编程思想-.pdf》由会员分享,可在线阅读,更多相关《C++编程思想-.pdf(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+编程思想 1 学了好久的C+了 发现自己对于C/C+还是没有深入的了解于是咬咬牙啃起了C+编程思想希望能有所感悟。我以前是直接学C+的对于 C 不是很了解,然而又是在VC 下 学习所以没有好好的去学习 标准 C+,直到我看起 C+编程思想我发现真应该从头再学一遍了。1、定义的声明的区别:声明是声明了标示符的存在并没有为其分配空间,而定义是为其分配的一定的存储空间int*p;/这是对指针的声明并且定义int p;/这是对整形变量的声明并且定义exern void show();=void show();对于函数来说只要没有函数体那么都是声明extern 表示对函数的声明表示这个函数是再外部定
2、义的。我们在编译器下同时写下int i;int i;/会出现冲的定义的错误编译器会理解为我到底改用那个i 呢?extern int i;int i;/那么就不会出现错误原因是第一个 i 是一个对于变量的声明并没有分配存储空间第二次才为i 分配了存储空间2、memcpy 函数void *memcpy(void*dest,const void*src,size_t count);这个函数我们在C 中经常用到,其实他 跟 strcpy 很类似都是向目的类型的地址拷贝n个 内存块注意这里的参数是void*因为我们是对内存块进行操作所以可以是任意数据类型程序员对于内存的理解应该一视同仁没有类型的区别。只
3、是我们在使用内存的时候将二进制代码进行了数据化了3、malloc 函数和calloc 函数assert 函数void*malloc(size_tsize);void*calloc(size_t num,size_t size );void assert(intexpression);/如果参数是FALSE那么强制终止程序的运行也就是非 0 退出这两个函数都是在堆中分配指定大小的void*内存区域只是 calloc可以进行初始化而 malloc函数不进行初始化。当 malloc函数分配的内存在第一次被使用的时候那么它的每个单元的数据可能是0但是如果分配来的这块内存区域被使用过了那么就可能使任意数
4、了。这里我们会问free 函数做什么了?free 函数只是告诉编译器我们之前用malloc分配的内存区域可以重复使用而已,在一定程度上可以理解为释放现在想想我们的fopen 函数和fclose 函数所用到的FILE 结构体也是由此而来的4、标准库的发放形式我们在VC 中用到string.h 等等头文件就可以使用里面定义的函数等等我们可以找到String.h但是我们却找不到他的实现文件CPP(也就是源文件)在以往的 C 库的编写中我们通常将具有统一功能和 分类的一组数据类型和函数放在一个头文件中定义 ,然后再原文件中实现。然而我们到微软提供的VC 下面却找不到这些对应文件的实现。这是因为对于微软
5、而言我们是使用VC 的用户,虽然我们是软件开发者,但是我们是在微软的平台下使用。微软给我提供了的借口是头文件+动态链接库的形式而不是头文件+源文件的形式。对于微软而言不会给我们库的实现部分。只需要给我们提供动态链接库,我们就可以使用它们所定义的函数以及类型5、重复定义的问题#ifndef test#define final#endif 在一个较大的工程中我们可能会用到多个头文件架设我们在多个头文件中同时包含了一个头文件那么在 编译器进行编译链接的时候就会发生数据类型或者函数的重复定义问题为了解决这个问题那么我们要用到预编译指令如果在lib.h 的头文件下有int i;为了防止被重复定义那么我们
6、在lib.cpp 中应该这样定义#ifndef lib_H_ int ;#endif ;这样就可以防止统一数据被重复定义的问题6、C+的封装C+的封装这是一个歧义的问题?有些人把封装用在解释隐藏上,而我觉得用来解释类这一个抽象数据类型很合适、在以前的 C 中struct 结构体中我们吧一组相关的属性组合成一个结构体那么这个结构体 只是作为数据的封装,没有其他的实际意义。但是在 C+中则不同了。类中可以加入函数,等操作行为使面向对象的思想得以很好的实现,一个类代表一类事物,一个类的实例代表一个对象,这个对象有自己的属性和行为。我们把操作的函数封装在类中也可以避免C 中函数命名重复的问题。6、联合
7、Union 枚举enum 的简单实用对于联合来说他的大小是成员中数据类型字节最大的存储我们在使用的时候使用数据类型中的一个可以节约存储空间enum 其实定义的是基于0 开始的一些数据成员当然我们可以对枚举成员进行赋值简单应用如下#include using namespace std;enum Day one=433,two,three;union Me int a;char buf100 ;void main()Day a=one;Day b=two;coutaendl;coutbendl;Me me1,me2;me1.a=100;strcpy(me2.buf,dsfds);coutUnio
8、n中的数字:me1.aendl;coutUnion中的字符串:me2.bufendl;coutUnion的大小是:sizeof(Me)endl;c+编程思想 2-友元存储控制友元 friend 在 c+中的应用我们知道在c+的类访问权限中,private 和 protected 在类外面进行访问的时候会因为权限而不能访问,友元就解决了这个问题。可以这样理解,他为外部的函数或者类进行了访问授权,其实这已经超出OOP 的范畴,但是对于 C+而言是以实用为主,所以说 C+并不是完全面向对象的语言C+这一特性就破坏的C+的安全性。我们要使用友元函数或者类我们就要在类的定义中用friend 进行相应的声
9、明。下面是友元函数的利用,我们利用友元函数进行对于类的私有成员和保护成员进行修改#include using namespace std;class A public:A()this-x=0;this-y=0;void Show()coutx=xendl;couty=yx+;a-y+;void main()A*a=new A();Add(a);a-Show();下面是利用对于内部类进行授权进行访问,对于内部类来说我们在类内部声明,但是并没有赋予内部类访问包容类私有成员的权限所以我们要利用friend 将内部类声明为全局.注意在 java 中 内部类是具有访问外部类的权限的。#include u
10、sing namespace std;class A private:int x;public:A()this-x=0;class B public:void add(A*tem)tem-x+;friend A:B;/对内部类进行全局声明 void show()coutx=xendl;void main()A:B c;A a;c.add(&a);a.show();3、利用友元类进行访问#include using namespace std;class A public:A()x=0;void show()coutx=xendl;friend class B;private:int x;cla
11、ss B public:A a;void add()a.x+;void main()B b;b.add();b.a.show();C+编程思想 3-利用 C+进行文件操作封装C 函数我们知道在C 语言中许多文件操作的函数很零散,在使用的时候不得不四处查找,我们是否能向 C+中 的CFile 类等一样封装我们自己的文件操作呢?当然可以,我们这里我封装的是 C 语言的文件操作函数。实际上我们可以直接封装win32 的 API 函数 利用文件句柄进行文件操作,MFC 的 CFile 类封装的就是 WIN32 的 API,这里我只做测试用C 来实现封装类 File,下面的File 类可以实现对文件的读
12、写以及清空功能,简单的功能反应出面向对象的程序设计的好处,将对文件袋饿操作封装成了一个整体,文件有了自己的属性和行为。对于 FILE 结构体指针我们应该设计其为私有,这样做的是为了隐藏底层实现,从而实更好的封装,用户程序员只需要根据我们提供的接口进行文件操作,而不必考虑细节的实现。我们对文件操作现在由分散转换成了集中,好处在自己编写代码的过程中就有所体会。#ifndef FILE_CLASS_DEFINE#define FILE_CLASS_DEFINE#include#include stdlib.h#include string.h#include windows.h class File
13、 public:File()this-f=NULL;this-path=;this-modeAttribute=;File(char*path,char*mode)FILE*p=fopen(path,mode);this-path=path;this-modeAttribute=mode;if(p=NULL)printf(文件打开失败!n);return;this-f=p;File()if(!this-f=NULL)fclose(this-f);bool WriteTextToFile(char nChar,int length)if(this-f=NULL)printf(请先打开文件!n);
14、int item=fwrite(nChar,1,length,this-f);if(itemf;int ReadAllText(char buf)char tem11=;while(!feof(f)memset(tem,0,11);int len=fread(tem,1,10,this-f);strcat(buf,tem);return 1;void CloseFile()fclose(this-f);void ClearFile()this-CloseFile();/关闭文件 DeleteFile(this-path);this-f=fopen(this-path,this-modeAttr
15、ibute);private:FILE*f;/隐藏实现细节 char*path;char*modeAttribute ;#endif void main()File f(d:1.txt,a);char buf100=this is a test!;f.WriteTextToFile(buf,strlen(buf);f.CloseFile();File f2(d:1.txt,a+);f2.ReadAllText(buf);printf(buf);f2.ClearFile();IO 格式化控制操做算子#include using namespace std;void main()/操作算子的应用进行格式控制等等这些操作算子都在IOSTREAM.H头文件中定义couthex0 x443endl;coutoct0443endl;coutdec443endl;coutflush;/只刷新缓冲区coutendl;/刷新缓冲区并且换行清空缓冲区中没有输出地数据coutends;/和 endl 一样仅仅用于strstreams
限制150内