学习C++ - 类(Classes)的定义与实现
一、"类" 的介绍
在C++中, 用 "类" 来描述 "对象", 所谓的"对象"是指现实世界中的一切事物。那么类就可以看做是对相似事物的抽象, 找到这些不同事物间的共同点, 如自行车和摩托车, 首先他们都属于"对象", 并且具有一定得相同点, 和一些不同点, 相同点如他们都有质量、都有两个轮子, 都是属于交通工具等。"都有质量"、"两个轮子"属于这个对象的属性, 而"都能够当做交通工具"属于该对象具有的行为, 也称方法。
类是属于用户自定义的数据类型, 并且该类型的数据具有一定的行为能力, 也就是类中说描述的方法。通常来说, 一个类的定义包含两部分的内容, 一是该类的属性, 另一部分是它所拥有的方法。以 "人类" 这个类来说, 每个人都有自己的姓名、年龄、出生日期、体重等, 为 人类 的属性部分, 此外, 人能够吃饭、睡觉、行走、说话等属于人类所具有的行为。
上面举例中所描述的 "人" 类仅仅是具有人这种对象的最基础的一些属性和行为, 可以称之为人的"基类"。 再说说一些具有一些职业的人, 例如学生, 一个学生还具有"基类"中所没有的属性, 如学校、班级、学号; 也可以具有基类所不具有的行为, 如每天需要去上课, 需要考试等。
学生类可以看做是基类的一个扩展, 因为他具有基类的所有属性和行为, 并且在此基础上增加了一些基类所没有的属性和行为, 像"学生"这样的类称为"人类"这个基类的"派生类"或者"子类"。在学生的基础上海可以进一步的扩展出其他更高级的类, 如"研究生"类。
到此, 我们不再更深的去介绍类的其他相关知识。
二、C++类的定义
C++中使用关键字 class 来定义类, 其基本形式如下:
class 类名{public://公共的行为或属性private://公共的行为或属性};
说明:
①. 类名 需要遵循一般的命名规则;
②. public 与 private 为属性/方法限制的关键字, private 表示该部分内容是私密的, 不能被外部所访问或调用, 只能被本类内部访问; 而 public 表示公开的属性和方法, 外界可以直接访问或者调用。
一般来说类的属性成员都应设置为private, public只留给那些被外界用来调用的函数接口, 但这并非是强制规定, 可以根据需要进行调整;
③. 结束部分的分号不能省略。
类定义示例:
定义一个点(Point)类, 具有以下属性和方法:
■ 属性: x坐标, y坐标
■ 方法: 1.设置x,y的坐标值; 2.输出坐标的信息。
实现代码如下:
class Point{public:void setPoint(int x, int y);void printPoint();private:int xPos;int yPos;};
代码说明:
上段代码中定义了一个名为 Point 的类, 具有两个私密属性, int型的xPos和yPos, 分别用来表示x点和y点。在方法上, setPoint 用来设置属性, 也就是 xPos 和 yPos 的值; printPoint 用来输出点的信息。
类在定义时有以下几点需要注意:
①. 类的数据成员中不能使用 auto、extern和register等进行修饰, 也不能在定义时进行初始化, 如 int xPos = 0; //错;
②. 类定义时 private 和 public 关键词出现的顺序和次数可以是任意的;
③. 结束时的分号不能省略, 切记!
三、C++类的实现
在上面的定义示例中我们只是定义了这个类的一些属性和方法声明, 并没有去实现它, 类的实现就是完成其方法的过程。类的实现有两种方式, 一种是在类定义时完成对成员函数的定义, 另一种是在类定义的外部进行完成。
1>. 在类定义时定义成员函数
成员函数的实现可以在类定义时同时完成, 如代码:
1 #include <iostream> 2 3 using namespace std; 4 5 class Point 6 { 7 public: 8 void setPoint(int x, int y) //实现setPoint函数 9 { 10 xPos = x; 11 yPos = y; 12 } 13 14 void printPoint() //实现printPoint函数 15 { 16 cout<< "x = " << xPos << endl; 17 cout<< "y = " << yPos << endl; 18 } 19 20 private: 21 int xPos; 22 int yPos; 23 }; 24 25 int main() 26 { 27 Point M; //用定义好的类创建一个对象 点M 28 M.setPoint(10, 20); //设置 M点 的x,y值 29 M.printPoint(); //输出 M点 的信息 30 31 return 0; 32 }
运行输出:
x = 10y = 20Process returned 0 (0x0) execution time : 0.406 sPress any key to continue.
与类的定义相比, 在类内实现成员函数不再是在类内进行声明, 而是直接将函数进行定义, 在类中定义成员函数时, 编译器默认会争取将其定义为 inline 型函数。
2>. 在类外定义成员函数
在类外定义成员函数通过在类内进行声明, 然后在类外通过作用域操作符 :: 进行实现, 形式如下:
返回类型 类名::成员函数名(参数列表){//函数体}
将示例中的代码改用类外定义成员函数的代码:
1 #include <iostream> 2 3 using namespace std; 4 5 class Point 6 { 7 public: 8 void setPoint(int x, int y); //在类内对成员函数进行声明 9 void printPoint(); 10 11 private: 12 int xPos; 13 int yPos; 14 }; 15 16 void Point::setPoint(int x, int y) //通过作用域操作符 '::' 实现setPoint函数 17 { 18 xPos = x; 19 yPos = y; 20 } 21 22 void Point::printPoint() //实现printPoint函数 23 { 24 cout<< "x = " << xPos << endl; 25 cout<< "y = " << yPos << endl; 26 } 27 28 int main() 29 { 30 Point M; //用定义好的类创建一个对象 点M 31 M.setPoint(10, 20); //设置 M点 的x,y值 32 M.printPoint(); //输出 M点 的信息 33 34 return 0; 35 }
依 setPoint 成员函数来说, 在类内声明的形式为 void setPoint(int x, int y); 那么在类外对其定义时函数头就应该是 void Point::setPoint(int x, int y) 这种形式, 其返回类型、成员函数名、参数列表都要与类内声明的形式一致。
四、C++类的使用
将一个类定义并实现后, 就可以用该类来创建对象了, 创建的过程如同 int、char 等基本数据类型声明一个变量一样简单, 例如我们有一个Point类, 要创建一个Point的对象只需要:
Point 对象名;
创建一个类的对象称为该类的实例化, 在创建时我们还可以对对象的属性进行相关的初始化, 这样在创建完成后该对象就已经具有了一定得属性, 这种创建方式将在下一篇博文中进行学习。
将类进行实例化后系统才会根据该对象的实际需要分配一定的存储空间。这样就可以使用该对象来访问或调用该对象所能提供的属性或方法了。
还以上面的代码为例, 为了减少篇幅, 我们把 Point 类的实现放在 Point.h 头文件中, 这里不再贴出 Point 类的实现代码。
1 #include <iostream> 2 #include "Point.h" 3 4 using namespace std; 5 6 int main() 7 { 8 Point M; //用定义好的类创建一个对象 点M 9 M.setPoint(10, 20); //设置 M点 的x,y值 10 M.printPoint(); //输出 M点 的信息 11 cout<< M.xPos <<endl; //尝试通过对象M访问属性xPos 12 13 return 0; 14 }
代码在编译时会出现错误, 提示 error: 'int Point::xPos' is private, 这是 cout<< M.xPos <<endl; 这行造成的, 他试图访问一个 private 对象中的私密数据 xPos, 如果将这行去掉便可正常运行。
通过 对象名.公有函数名(参数列表); 的形式就可以调用该类对象所具有的方法, 通过 对象名.公有数据成员; 的形式可以访问对象中的数据成员。
五、对象的作用域、可见域与生存周期
类对象的作用域、可见域以及生存周期与普通变量的保持相同, 当对象生存周期结束时对象被自动撤销, 所占用的内存被回收, 需要注意的是, 如果对象的成员函数中有使用 new 或者 malloc 申请的动态内存程序不会对其进行释放, 需要我们手动进行清理, 否则会造成内存泄露。
--------------------
wid, 2013.02.18
学习C++ - 类(Classes)的定义与实现相关推荐
- 学习C++ 丨 类(Classes)的定义与实现!C/C++必学知识点!
一."类" 的介绍 在C++中, 用 "类" 来描述 "对象", 所谓的"对象"是指现实世界中的一切事物.那么类就可以看 ...
- typescript学习之路(三) —— ts定义类的方法(包含es5以及es6的定义类)
提起类,不得不说一下,强类型编程语言,如php,java,c++等都有类的概念.而js作为一门弱类型语言,是没有类这个概念的,虽然也能模拟类的实现,但总归不是类.so,ts也只是模拟类而已,使得更贴切 ...
- python学习笔记(八)类(classes)
Python的类机制使用尽可能少的新语法和语义将类引入语言.python的类提供了面向对象程序设计语言所有的 标准特性:类继承机制允许有多个基类,一个派生类可以覆盖基类中的任何方法,一个方法可以使用相 ...
- C++学习笔记-类定义的注意事项和C#的区别
1: 类当中的一批函数可以被一个public关键字引导 来标明这些函数是公开的 2: 成员函数可以放在类的外部定义 但必须在类的内部做声明 在类外部做定义的时候必须形如这样: bool YorClas ...
- 小白对于学习对象和类的总结,定义一个圆柱体类Cylinder,并创建相应的对象,然后计算圆柱体的底面积和面积.
类和对象 类:类的概念就是让程序设计能更清楚卖出日常生活中的事物,也可以理解为对一类事物的统称包含对于属性描述和行为描述!注解:属性描述:描述当前类有哪些属性.行为描述:描述当前有哪些行为.举例: 以 ...
- 【面向对象编程】(2) 类属性的定义及使用;__repr__()方法
各位同学好,在上一节中我们学习了类实例化的基本方法:https://blog.csdn.net/dgvv4/article/details/122275348?spm=1001.2014.3001.5 ...
- java中蛇的属性有哪些_学习Java类的属性
学习Java类的属性-武汉北大青鸟 Public.private.protected显示了三种类中的属性和服务的类型,public是可以随意访问的.private是外界不能访问的(显示了数据的封装性) ...
- React学习:事件绑定、组件定义、for、map循环-学习笔记
文章目录 React学习:事件绑定.组件定义.for.map循环-学习笔记 事件绑定 组件定义 (参数传递) for.map循环 React学习:事件绑定.组件定义.for.map循环-学习笔记 事件 ...
- vba 定义类_类模块的定义及设计
你已选中了添加链接的内容蓝字关注,加微信NZ9668获资料信息 VBA解决方案 系列丛书作者 头条百家平台 VBA资深创作者 _______________________________ ( ...
最新文章
- Web services 安全实践: 基于 HTTP Basic Authentication 为 Web services 配置传输层安全机制...
- SQL Cookbook:一、检索记录(1)从表中检索所有行和列
- mysql 5.7直接安装版,mysql5.7怎么安装 mysql 5.7安装图文教程
- SpringBoot中Mybatis打印sql日志
- 关于物联网规则引擎技术,你想要知道的都在这儿!
- Adjacent Bit Counts(01组合数)
- 第二节:使用反射构建动态可扩展应用程序
- 社区发现(六)--模块度
- Spring实战4:面向切面编程
- Unit 11 电话转接
- 新的开始,从CSDN
- Tomcat的安装与配置
- java车牌识别字符分割_车牌识别之字符分割
- 计算机房 噪声 标准,机房的噪音检测标准及治理方法
- min函数python_python内置函数之min
- rss阅读器一览导入opml文件
- 硬核科普:年薪30万的数据分析师,每天到底在干些什么?
- AnimationPacker重写
- android sim卡槽,识别Android平板电脑是否具有SIM卡插槽
- yocto下的cmake版本hello world,追加分层使用
热门文章
- 几款流行的HTML5 UI 框架比较
- Linux下I/O多路转接之select --fd_set
- 【drp 11】使用Junit简单测试接口方法
- web安全_暴力破解
- 查找linux所有目录中包含字符,Linux查找目录下包含有某字符串的全部文件
- [网络安全自学篇] 六十五.Vulnhub靶机渗透之环境搭建及JIS-CTF入门和蚁剑提权示例(一)
- Swift之源码编译的环境搭建和编译流程
- 37. Sudoku Solver
- 2013\National _C_C++_B\4.高僧斗法
- LeetCode Algorithm 35. 搜索插入位置