类与对象初步
发布日期:2022-02-07 06:39:45
浏览次数:6
分类:技术文章
本文共 4674 字,大约阅读时间需要 15 分钟。
类与对象
大纲
1. 什么是类,对象 2. 定义一个类 3. 使用类 4. 实现类成员函数 5. 使用类 6. 多文件处理
类与对象
以前说到过
类之于对象,就与类型之于变量有点像 我们把某一类实体所具有的所有共性整理在一起 然后就可以用这一些共性抽象出一个类 然后用这个类,就可以定义其他具有相似性质的对象可能有点抽象?
在下面的例子中,我会以人类为例子尽可能解释清楚
一个个活生生的人,都是一个个对象 而我们从这么多个人中, 找到了人所应当具有的共性 这共性有两个方面 1. 人的某些属性(类的数据成员) 3. 体重? 4. 年龄? 4. 颜值? 5. …… 2. 人的行为(类的方法成员) 3. 人会吃饭 4. 还会学习 5. 还有运动呢 6. 整容。。 6. ……我们将根据这些共性
定义一个person类定义一个类
定义类的语法,与定义结构体相似
关键字:class
下面我们根据人的共性
给出一个person类的不完整的定义class person{private: int weight; int age;public: int yanzhi;//颜值 void eat(int ); //还有其他的方法,等下再补充};
区别
从语法上而言
1. 关键字从结构体的struct变成了class 2. 多了几个词 3. private 4. public提醒
同结构体一样 代码块后面的分号不能漏
访问权限控制
多出来的private和public有什么用呢?
嘿嘿嘿 private就是不能被被外界轻易知道嘛 public就是外界能够知道呀 (后面会继续详细说明)使用类
- 声明对象
- 初始化对象
- 使用对象中的公有方法
声明对象
现在类定义好了
(还不太完整,会继续补充) 我们先尝试使用一下 先用类,声明一个叫做jack的人类person jack;
现在jack就是一个person类的对象了
初始化对象
我们可以这样子吗?
jack.weight = 65;jack.age = 18;jack.yanzhi = 100;
!!!!!编译都不会通过
再说访问权限控制
在类的外部,
只能够访问类定义中的public部分的成员 (也就是公有成员) 在private部分的私有成员 不能够在类的外部访问
因此,在这里,只有一条语句可行
jack.yanzhi = 100;
(也的确嘛,身高体重年龄什么的 都是不容易看不出来 也不能够随便改变的……) 使用公有方法成员
既然在类的外部不能够访问私有成员
我们可以通过公有方法 在类的内部去设置 下面类的定义中class person{private: int weight; int age;public: int yanzhi;//颜值 void set_weight(int w) { weight = w;} void set_age(int a){ age = a;} void eat(int ); //还有其他的方法,等下再补充};
这里我在公有方法中,增加了两个函数
用于设置里面的成员 函数的定义因为比较短 也一并放了进去 然后我们就可以通过成员运算符 调用公有的方法成员去进行初始化int main(){ person jack; jack.yanzhi = 100; jack.set_weight(65); jack.set_age(18);}
实现类成员函数
下面我来继续实现其他的几个人类所具有的行为
(类成员函数)class person{private: int weight; int age;public: int yanzhi;//颜值 void set_weight(int w) { weight = w;} void set_age(int a){ age = a;} void eat(int );// 吃 void study(); // 学习 void sport(); // 运动 bool face_lift();//整容 //还有其他的方法,等下再补充};
现在我们还有四个函数没有实现
我们先来实现一个吃的函数void eat(int w){ weight += w; //吃多少重多少嘛}
注意!
由于函数的定义不在类的内部 这样的定义是错误的 因为不能够访问类的内部成员 为了进入类的内部 需要使用作用域解析运算符
//在函数名前使用作用域解析运算符void person::eat(int w){ weight += w; //吃多少重多少嘛}
同样的道理,我们来实现其他的几个函数
//记得作用域解析运算符void person::study(){ weight--; //据说沉迷学习日渐消瘦?}void person::sport(){ weight--;}
这个整容的函数有点难写
毕竟不是百分百能够使颜值上升的 用个rand()产生随机数好了rand()产生从0-RAND_MAX范围的随机数
srand()用来指定产生随机数的种子 (这里为了方便就不重设种子了,默认以1为种子)
//大概百分之十的整容失败概率bool person::face_lift(){ if (rand() % 10 == 2) { yanzhi = 0; return false; } else { yanzhi++; return true; }}
来使用类吧
现在已经把类中所有的东西都实现了
可以在main()中使用了#includeusing namespace std;int main(){ person jack; jack.yanzhi = 100; jack.set_weight(65); jack.set_age(18); jack.stduy(); jack.eat(2); if (jack.face_lift()) cout << "整容成功"; else cout << "整容失败";}
调用类的数据成员和类方法的方式
上面也展示了一下 不过 这依旧是一个具有很多缺陷的类 比如我没有办法查看体重年龄 这个可以通过自己多定义一个类成员函数来实现 比如void person::show(){ cout << "My height is " << height << " cm." << endl; cout << "My age is " << age << " years old." << endl;}
然后我们就可以通过
jack.show();
来输出他的体重和年龄 关于多文件处理
看到这么多的代码,可能还不知道怎么组织吧
一般而言,会分为3个文件储存
- 头文件.h 一般放类的定义
- 方法文件.cpp 一般放类的方法的实现
- 使用类的文件.cpp 就是main()函数那个文件
需要注意的问题
1. 头文件使用宏定义防止多次重复包含 2. 方法文件和main函数的文件 都需要包含头文件#include "person.h"
下面我以上面作为例子
头文件person.h#ifdef PERSON_H#define PERSON_Hclass person{private: int weight; int age;public: int yanzhi;//颜值 void set_weight(int w) { weight = w;} void set_age(int a){ age = a;} void eat(int );// 吃 void study(); // 学习 void sport(); // 运动 bool face_lift();//整容 void show();};#endif //宏定义是用来防止多次包含
方法文件person.cpp
#include "person.h"#includeusing namespace std;//在函数名前使用作用域解析运算符void person::eat(int w){ weight += w; //吃多少重多少嘛}void person::study(){ weight--; //据说沉迷学习日渐消瘦?}void person::sport(){ weight--;}//大概百分之十的整容失败概率bool person::face_lift(){ if (rand() % 10 == 2) { yanzhi = 0; return false; } else { yanzhi++; return true; }}void person::show(){ cout << "My height is " << height << " cm." << endl; cout << "My age is " << age << " years old." << endl;}
main
#include "person.h"#includeusing namespace std;int main(){ person jack; jack.yanzhi = 100; jack.set_weight(65); jack.set_age(18); jack.stduy(); jack.eat(2); if (jack.face_lift()) cout << "整容成功"; else cout << "整容失败"; jack.show(); return 0; }
当定义好一个类之后
我们在main里面写的程序就会 特别简洁 可读性特别强 而且类的私有成员不会被随意地不小心地改动 (数据隐藏是面向对象编程的特点之一)总结注意事项
- private与public的区别 及访问权限控制
- 类的成员函数需要使用作用域解析运算符来实现
一些拓展
关于类的特殊成员函数
关于构造函数
可能你会想能不能够以这样的方式初始化
person jack {65,18,100};
C++11中列表初始化的语法是通用的 因此这里是可以用 前提是定义了构造函数 构造函数是什么? 是类对象在初始化的时候自动调用的一个函数 明天写如何定义。 关于析构函数
自动变量在过去后会自动销毁
对象也不例外 此时就会调用析构函数来销毁自身 明天再写转载地址:https://blog.csdn.net/wyfwyf12321/article/details/54710130 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月03日 06时43分14秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
ROW/COW 快照技术原理解析
2019-04-27
OpenStack 实现技术分解 (7) 通用库 — oslo_config
2019-04-27
KVM/QEMU/qemu-kvm/libvirt 概念全解
2019-04-27
如何理解写文档这件事情 ?
2019-04-27
QCOW2/RAW/qemu-img 概念浅析
2019-04-27
OpenStack 多节点纳管 vCenter 5.5
2019-04-27
Openstack_通用模块_Oslo_vmware 创建 vSS PortGroup
2019-04-27
VMware vMotion 配置要求
2019-04-27
CAS KVM 虚拟机的保护与恢复
2019-04-27
再谈 COW、ROW 快照技术
2019-04-27
从 2017 OpenStack Days China 看国内云计算的发展现状
2019-04-27
Python Module_Socket_网络编程
2019-04-27
VMware 虚拟机的虚拟磁盘编程知识点扫盲之一
2019-04-27
疑难杂症——bash: /dev/null: Permission denied
2019-04-27
VMware 虚拟机的虚拟磁盘编程知识点扫盲之二
2019-04-27
VMware 虚拟化编程(2) — 虚拟磁盘文件类型详解
2019-04-27
让人失望透顶的 CSDN 博客改版
2019-04-27