3-1:类与对象入门——类的引入和类的定义以及访问限定符和封装还有对面向对象的理解
文章目录
- 一:面向对象与面向过程
- 二:类的引入
- 三:类的定义
- (1)C++类的定义
- (2)类的两种定义方式
- A:声明和定义全部放在类体中
- B:定义和声明分开放
- 四:类的访问限定符及封装
- (1)访问限定符
- (2)封装
- 五:类的实例化
- (1)类的实例化
- (2)面向对象
一:面向对象与面向过程
- 此部分属于软件工程重点内容,概念相当多,如果需要深入了解,请点击跳转【专栏必读】软件工程导论第六版(张海藩)专栏学习笔记目录导航和Anki分享
- 后面介绍时,只是从编程语言的角度出发帮助大家理解。解释的可能较为浅显
二:类的引入
在C语言中,结构体用于把一些具有不同类型的变量组合到一起
struct Student
{char _name[20];char _gender[3];int _age;
}
而在C++中,其结构体内不止可以定义变量,还可以定义函数、
struct Student
{char _name[20];char _gender[3];int _age;void SetStudentInfo(const char* name,const char* gender,int age){strcpy(_name,name);strcpy(_gender,gender);_age=age;}
};int main()
{Student s;s.SetStudentInfo("Bob","男",18);return 0;
}
这样,在C++中结构体就有了一个新的名字——类(因为具有了属性和方法),同时会使用class代替struct
三:类的定义
(1)C++类的定义
根据以上叙述,在C++中,类是这样定义的
class className
{//成员函数//成员变量};//注意分号
所以简单来说,类就是属性和方法的集合,属性就是类中的数据,方法就是使用这些数据进行操作的函数
(2)类的两种定义方式
A:声明和定义全部放在类体中
注意当成员函数在类中定义时,编译器会将其当作内联函数处理。
class Person//人就是一个类
{public://成员函数void showinfo()//显示这个人的信息{std::cout<<_name<<std::endl;std::cout<<_sex<<std::endl;std::cout<<_age<<std::endl;}
public://成员变量char* _name;char* _sex;int _age;
};
B:定义和声明分开放
这种方式最常采用
四:类的访问限定符及封装
(1)访问限定符
上面类的定义中,有一个特殊的地方就是public
,它叫做访问限定符。除了public(公有)
,其它访问限定符还有protected(保护)
、private(私有)
访问限定符用于修饰成员,被修饰的成员具有不同的权限,这些权限将体现在外部访问、继承等性质中。比如被public
修饰的成员可以在类的外面直接被访问,而被protected
和private
修饰的成员变量则不行
注意以下几点
- 访问限定符的作用域是从该访问限定符出现的位置开始直到下一个访问限定符为止
- class的默认访问权限(就是没有给出)为
private
,struct则为public
- 访问限定符限制的是外面,就像锁子防的是外人
(2)封装
封装是面向对象三大特性之一。封装本质是一种管理手段,将属性(数据)和方法(接口)有机结合起来,再隐藏他们,只对外公开接口(函数)来和其他对象进行交互)。不想给别人看的,就使用protected/private
进行修饰
- 之所以C语言不适合编写大型项目,是因为它不支持面向对象(不支持不意味着写不出来面向对象风格的程序,比如Linux就是个典型的例子),管理能力较弱,不是函数就是数据,就拿
struct
来说,其默认就是public
的,安全性也堪忧,总的来说,用C语言编写项目,会感觉很乱,模块与模块独立性很差
以实现数据结构为例(栈):C语言实现的栈,其方法和数据是分离的,就像一个完整的人被大卸八块;C++实现时,一个栈就可以作为一个对象,这个对象有它的数据(例如动态增长的数组、长度、容量等),还有它的方法(例如出栈、压栈等)。这些内容被封装在了一起,让人感觉很具体,而且便于管理(比如栈中的数据就会被设置为私有,因为不想被外界修改)
//stack.h
class Stack//类
{public:void Init(int capacity=4);//缺省参数。声明private: //数据私有int* _arr;int _length;int _capacity;//stack.cpp
void Stack::Init(int capacity)//该方法的实现
{_arr=(int*)malloc(sizeof(int)*capacity);_length=0;_capactiy=capacity;}
五:类的实例化
(1)类的实例化
类可以理解为一个房屋的图纸,这个图纸规定了一些基本信息(房子朝向是什么,有几扇窗户,房子材料是什么等等)。但图纸终归就是图纸,永远不是真实的房子(正如类仅仅是定义,并未开辟空间),所以我们要根据这个图纸的规定,修出相应的房子
根据图纸建造房子的过程,称为类的实例化,类实例化后将会占用实际内存空间
//stack.h
class Stack//类
{public:void Init(int capacity=4);//缺省参数。声明private: //数据私有int* _arr;int _length;int _capacity;//stack.cpp
void Stack::Init(int capacity)//该方法的实现
{_arr=(int*)malloc(sizeof(int)*capacity);_length=0;_capactiy=capacity;}//test.cpp
int main()
{Stack stack;stack._arr=4;//操作非法,成员是private的stack.Init();//初始化这个栈}
(2)面向对象
面向对象编程:其实很多学习编程的人,对于面向过程编程和面向对象编程这两个概念总是搞不清,具体的专业的定义在这里也不去说了,根据上面的叙述,我们可以这样去通俗的解释面向对象。
举个例子:我去洗澡,如果按照面向过程的角度考虑,那么我先进入浴室,然后打开水龙,然后洗漱,然后把身体擦干,也就是说面向过程关注的是解决问题的步骤;如果用面向对象考虑,只需记住一句话,万物皆对象,你是对象,水龙头也是对象,所以我先传递力的参数给浴室门,然后门就开了,然后我在传递消息给水龙头,水龙头得到消息,放水,最后传递消息给毛巾,毛巾利用它吸水的特性,调用吸水方法擦干身体,也就是说面向对象关注的是对象,将一个问题拆分为不同对象,依靠参数完成对象之间的交互。
为什么要进行面向对象编程这也是一个很值得思考的问题。举个例子,活字印刷术发明之前使用的是雕版印刷,这种方式弊端太大,如果需要改稿,那么雕版就必须重新雕刻,而活字印刷术则解决了这样的问题,需要改动,有可能只需改动几处。面向过程正如雕版印刷一样,也正如做数学题一样,中间某个环节一旦出现需求变更,那么整个工程几乎需要大改,要耗费大量时间精力。面向对象正如活字印刷术一样,如果需求变化了,可能只是修改其中一部分,也就是一个对象,而且最关键的一点是这些对象可以复用,就像活字印刷术一样,不是说这个对象在这个工程中发挥完之后,它就没有价值了,它还可能被其他工程所用
在面向对象编程下,一切均为对象,甚至类中的方法都是对象,所有细节均封装在对象中,项目的更改全部由对象间信息的传递方式所决定
3-1:类与对象入门——类的引入和类的定义以及访问限定符和封装还有对面向对象的理解相关推荐
- 深入篇【C++】类与对象:友元函数与友元类
深入篇[C++]类与对象:友元函数与友元类 ①.提出问题:重载operator<< ②.解决问题:友元 Ⅰ.友元函数 [特点] Ⅱ.友元类 [特点] ③.总结问题 ①.提出问题:重载ope ...
- c++类之“对象包含与成员函数不兼容的类型限定符”与“对象含有与成员 函数 “CarBody::Geta” 不兼容的类型限定符”错误的修改
首先看一段代码 #include<iostream> using namespace std; int car_num=0; struct position {double x, y; } ...
- 类是对象的抽象,对象是类的实例
类是对象的抽象,对象是类的实例 是 正确的 看:https://www.cnblogs.com/marlanchen/p/11563929.html[转载]
- [C# 类和对象]-C# 中的方法以及类和对象编程
################################################## 目录 C# 的方法 C# 定义方法 访问修饰符 返回值类型 方法名 参数列表 方法主体 方法名的命 ...
- python 类和对象 有必要学吗_类与对象-python学习19
类与对象 类:我们常用类来划分一个个特定的群体:我们所说的类,是物以类聚的类,是分门别类的类,是多个类似事物组成的群体的统称.类的概念能帮助我们快速理解和判断事物的性质. 类(class),比如整数. ...
- java类与对象实验报告心得体会_Java类与对象实验报告.doc
西 安 邮 电 大 学 (计算机学院) 课内实验报告 实验名称: 类与对象 专业名称: 计算机科学与技术 班 级: 计科1405班 学生姓名: 高宏伟 学 号: 指导教师: 刘霞林 实验日期: 201 ...
- 3-8:类与对象下篇——友元函数、友元类和内部类
文章目录 一:友元函数 (1)友元函数 (2)友元类 二:内部类 一:友元函数 C++运算符重载为我们带来了极大的便利.因此,对于日期类这样的自定义类型,就可以重载运算符<<,然后使用co ...
- 类和对象编程(九):类的静态成员
C++ 类的静态成员 我们可以使用 static 关键字来把类成员定义为静态的.当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本. 静态成员在类的所有对象中是共享的. ...
- 类和对象编程(一):类成员函数
C++ 类成员函数 类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样.类成员函数是类的一个成员,它可以操作类的任意对象,可以访问对象中的所有成员. 让我们看看之前定义的 ...
最新文章
- 计算机的桌面教案,《认识计算机桌面》教案-20210608141312.pdf-原创力文档
- 石川es6课程---18、ES6 复习
- 【区块链】Truffle 部署 编译 测试 智能合约 的 完整实践操作
- 安卓应用在各大应用市场上架方法整理
- CF1012B Chemical table 题解【二分图】【构造】
- pynput模块—键盘鼠标操作和监听
- 开源社交系统java_JAVA 开源 SNS 社交系统 JEESNS V0.8 发布
- 万字通俗讲解何为复杂度
- Unity面试题精选(4)
- FastDFS点滴记录
- xargs 将标准输入转换成命令行参数
- Flex 加载pdf
- SEO:提高关键词排名的28个SEO技巧
- Git:本地生成SSH KEY,并关联到git仓库
- 19.go fix 和 go tool fix
- 每日一技|活锁,也许你需要了解一下
- 微信小程序开发调用接口
- 美国伊利诺伊大学香槟分校计算机专业,伊利诺伊大学香槟分校
- Web3的先锋兵:虚拟人
- 2000/XP/2003常见问题集锦
热门文章
- 新手程序员不知道的小技巧!
- 性能优化(8):使用javascript缓存查询结果
- Nat Commun |完全开源!肿瘤基因组数据报告解读平台,可满足商业报告解决方案...
- NatureGenetics:所有五个异源四倍体棉花起源被厘清
- pyqt界面屏幕分辨率自适应_在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
- anaconda moviepy_Anaconda和PyCharm的详细安装步骤~小白专用,手把手教学
- asp.core api 通过socket和服务器通信发送udp_读懂Java中的Socket编程
- vue中rules校验是验证首字符_小白也能秒懂Vue源码中那些精细设计(选项处理)...
- asp.net 报表页面模板_CP:基于JSON配置和vue-cli插件机制的模板复用方案
- 前端笔记-thymeleaf获取及回显input标签type=date