C++类的详解

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

C++类的详解

码农有道   2020-03-15 我要评论
[toc] 超女选秀的例子我们玩了很久,为了学习的需要,暂时离开美眉们,我将采用实际项目开发的例子来讲解类的更多知识。 在C语言基础知识中已学习过文件操作,在实际开发中,为了提高效率,我会把文件操作封装成一个类,类的声明如下: ```cpp // 文件操作类声明 class CFile { private: FILE *m_fp; // 文件指针 bool m_bEnBuffer; // 是否启用缓冲区,true-启用;false-不启用 public: CFile(); // 类的构造函数 CFile(bool bEnBuffer); // 类的构造函数 ~CFile(); // 类的析构函数 void EnBuffer(bool bEnBuffer=true); // 启、禁用缓冲区 // 打开文件,参数与fopen相同,打开成功true,失败返回false bool Open(const char *filename,const char *openmode); // 调用fprintf向文件写入数据 void Fprintf(const char *fmt, ... ); // 调用fgets从文件中读取一行 bool Fgets(char *strBuffer,const int ReadSize); // 关闭文件指针 void Close(); }; ``` 一、类成员的访问权限 ==================== C++通过 public、protected、private三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。所谓访问权限,就是类外面的代码访问该类中成员权限。 在类的内部,即类的成员函数中,无论成员被声明为 public、protected 还是private,都是可以互相访问的,没有访问权限的限制。 在类的外部(定义类的代码之外),只能通过对象访问public的成员,不能访问 private、protected属性的成员。 本节重点介绍 public 和 private,protected 将在以后介绍。 private 后面的成员都是私有的,如m_fp和m_bEnBuffer,直到有 public出现才会变成共有的;public 之后再无其他限定符,所以 public后面的成员都是共有的。 private关键字的作用在于更好地隐藏类的内部实现,该向外暴露的接口(能通过对象访问的成员)都声明为public,不希望外部知道、或者只在类内部使用的、或者对外部没有影响的成员,都建议声明为private。 声明为 private 的成员和声明为 public 的成员的次序任意,既可以先出现 private部分,也可以先出现 public 部分。如果既不写 private 也不写 public,就默认为private。 在一个类体中,private 和 public可以分别出现多次。每个部分的有效范围到出现另一个访问限定符或类体结束时(最后一个右花括号)为止。 您可能会说,将成员变量全部设置为 public 省事,确实,这样做 99.9%的情况下都不是一种错误,我也不认为这样做有什么不妥;但是,将成员变量设置为private 是一种软件设计规范,尤其是在大中型项目中,还是请大家尽量遵守这一原则。 二、成员变量的命名 ================== 成员变量大都以m_开头,这是约定成俗的写法,不是语法规定的内容。以m_开头既可以一眼看出这是成员变量,又可以和成员函数中的参数名字区分开。 例如成员函数EnBuffer的函数体如下: ```cpp // 启、禁用缓冲区 void CFile::EnBuffer(bool bEnBuffer) { m_bEnBuffer=bEnBuffer; } ``` 三、构造函数 ============ 在CFile类的声明中,有一些特殊的成员函数CFile(),它就是构造函数(constructor)。 ```cpp CFile(); // 类的构造函数 CFile(bool bEnBuffer); // 类的构造函数 ``` 构造函数的名字和类名相同,没有返回值,不能被显式的调用,而是在创建对象时自动执行。 构造函数具备以下特点: 1)构造函数必须是 public 属性。 2)构造函数没有返回值,因为没有变量来接收返回值,即使有也毫无用处,不管是声明还是定义,函数名前面都不能出现返回值类型,即使是void 也不允许。 3)构造函数可以有参数,允许重载。一个类可以有多个重载的构造函数,创建对象时根据传递的参数来判断调用哪一个构造函数。 4)构造函数在实际开发中会大量使用,它往往用来做一些初始化工作,对成员变量进行初始化等,注意,不能用memset对整下类进行初始化。 示例 ```cpp CFile::CFile() // 类的构造函数 { m_fp=0; m_bEnBuffer=true; } CFile::CFile(bool bEnBuffer) // 类的构造函数 { m_fp=0; m_bEnBuffer=bEnBuffer; } ``` 四、析构函数 ============ 在CFile类的声明中,还有一个特殊的成员函数\~CFile(),它就是析构函数(destructor)。 ```cpp ~CFile(); // 类的析构函数 ``` 析构函数的名字在类的名字前加\~,没有返回值,但可以被显式的调用,在对象销毁时自动执行,用于进行清理工作,例如释放分配的内存、关闭打开的文件等,这个用途非常重要,可以防止程序员犯错。 析构函数具备以下特点: 1)构造函数必须是 public 属性的。 2)构造函数没有返回值,因为没有变量来接收返回值,即使有也毫无用处,不管是声明还是定义,函数名前面都不能出现返回值类型,即使是void 也不允许。 3)析构函数不允许重载的。一个类只能有一个析构函数。 ```cpp CFile::~CFile() // 类的析构函数 { Close(); // 调用Close释放资源 } ``` 五、C++程序也很优雅 =================== 很多人说C/C++程序很烦锁,python程序很优雅,说这话人的很荒谬,那是因为他C/C++并不了解,只要我们愿意,可以写出和python一样优雅简洁的代码,在book210.cpp中,main函数的代码极为精简。 示例(book210.cpp) ```cpp /* * 程序名:book210.cpp,此程序演示用C++类的更多知识。 * 作者:C语言技术网(www.freecplus.net) 日期:20190525 */ #include

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们