【类和对象】深入浅出类和对象
学习导航
- 1. 什么是对象?
- 2. 什么是类?
- 3. 如何定义类?
- 4. 封装
- 5. 访问限定符
- 6. 类的定义域
- 7. 成员函数的定义
- 8. 实例化
- 9. 对象的大小如何计算?
- 10. this指针的介绍
1. 什么是对象?
对象是一个抽象概念,表示任意存在的事物。世间万物皆可为对象,现实世界中,随处可见的一个事物都是对象,对象是事物存在的实体,一个具体的人是对象,一本具体的书也可以是对象……
2. 什么是类?
类是封装对象“属性”和“行为”的载体。反过来说,具有相同属性和行为的一类实体被称为类。举个例子:
(图片来自网络)
类的范围可大可小,只要具有相同的属性和行为就可以归为一类。如果我们将类实例化,就可以得到一个具体的对象。
3. 如何定义类?
类的定义有两种方式,早期使用struct来定义类,后来引入的关键字class来定义类,现在我们还是习惯于用class来定义类。
①用class定义类
class className {// 类体:由成员函数和成员变量组成 }; // 一定要注意后面的分号
②用struct定义类:
struct dog {//动作void eat() {cout << "The dog is eating!" << endl;}//属性int _age;char _name[10]; };
C++中结构体被升级为类:
结构体名称可以直接作为类型
struct ListNode {int val;ListNode* next; // C++中不需要再加struct };
“结构体”中可以定义函数
当然为了兼容C语言,C语言中关于结构体的操作都是相同的
4. 封装
在C语言中,数据和方法是分离的。数据和方法分离的时候,虽然使用者自由度更高,但是对使用者的素养要求也更高。举个形象的例子:景区如果不设立围墙,不设置固定的出入口,那么人们就可以随意进出,随意破坏景点了;对应到我们的程序,就存在数据被篡改的风险。
我们可以看到,C++中的类将数据和方法放在一起,通过访问限定符来保护某些成员变量和成员函数,从而保证了类内部数据结构的完整性,防止外部操作对内部数据的干扰。
5. 访问限定符
访问限定符有三种,有以下几个注意点:
- public 修饰的成员在类外可以直接被访问
- protected 和 private 修饰的成员在类外不能直接被访问(在封装中protected 和 private 的功能是类似的 )
- 一个类中可以有多个访问限定符,访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
- class 的默认访问权限为 private,struct 为 public(因为struct要兼容C)
class classname {public:// …… 成员函数访问权限通常为publicprivate:// …… 成员变量的访问权限通常为private };
6. 类的定义域
由于类是一个整体,查找变量的时候会在整个类里面查找,所以成员函数可以定义在任何位置。
7. 成员函数的定义
成员函数的定义也有两种方式:
①在类里面定义
class student {public:void init(int age, int score){_age = age;_score = score;}private:int _age;int _score; };
- 在类里面定义的函数默认都是内联函数。这也给我们写代码指明了方向,在类里面定义的函数适合是短小的函数
- 成员变量习惯前面加上“_”,否则 init 函数的参数名就比较别扭
②在类外面定义
class student {public:void init(int age, int score);private:int _age;int _score; };void student::init(int age, int score) {_age = age;_score = score; }
在类里面放声明,定义放在类外面
为了说明这个函数是类的成员函数,需要在函数名前加上类名和作用域分解运算符
8. 实例化
// 例如用上面的ListNode类来创建对象; int main() {ListNode node; }
反思:类中的成员变量占是定义还是声明?
【答】定义还是声明取决是是否开辟空间。在创建类的时候并为成员变量开辟空间,所以只是声明,只有在实例化的时候才算是定义
9. 对象的大小如何计算?
对象中既有成员变量又有成员函数。对于成员变量而言,各个对象之间必然是相互独立且相互不同的,然而成员函数只需在固定的地方存储一份即可。具体存储模式如下图所示。在计算成员变量大小的时候仍然需要遵守内存对齐的规则。
在反汇编下我们可以观察到,同一个类创建的多个对象在调用成员函数的时候,call指令所对应的函数地址都是相同的。
10. this指针的介绍
【问题】成员函数存储在公共代码区,所以函数体中没有关于不同对象的区分,那么函数是如何知道操作的是哪一个对象呢?
【解决方法】C++引入关键字 this 指针。每个非静态成员函数都有一个隐藏参数 this 指针,在调用非静态成员函数的时候也会默认传入一个指针参数,该指针的作用是指向当前的对象。
我们以下面的例子加以说明:class Date {public :void Display (){cout <<_year<< "-" <<_month << "-"<< _day <<endl;}void SetDate(int year , int month , int day){_year = year;_month = month;_day = day;} private :int _year ; // 年int _month ; // 月int _day ; // 日 };
特性总结:
① this 指针的作用是保证每个对象拥有自己的数据成员,但共享处理这些数据的代码
② 静态成员函数(函数名前加有static)为全体对象所共有,所以没有this指针
③ this 指针是由编译器自动传递的,不能写在形参中,也不能在传参的时候不能手动传递。但this指针是可以使用的
同时也可以证明 this 指针 指向当前对象
【类和对象】深入浅出类和对象相关推荐
- 客快物流大数据项目(五十六): 编写SparkSession对象工具类
编写SparkSession对象工具类 后续业务开发过程中,每个子业务(kudu.es.clickhouse等等)都会创建SparkSession对象,以及初始化开发环境,因此将环境初始化操作封装成工 ...
- Java 对象和类 的理解
学而时习之,温故而知新. 对象: 对象是类的一个实例,有状态和行为 类: 类为对象定义属性和行为 识别对象和类, 自己的的知识里面 一般 new 之后的是对象, class后面的是类 对象的特征: 1 ...
- C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)
1. 类的定义 类定义是以关键字 class 开头,后跟类的名称.并在它后面依次包含类名,一组放在 {} 内的成员属性和成员函数,以及结尾的分号. 类声明将类本身及其属性告诉编译器.类声明本身并不能改 ...
- java查看对象锁级别_对象级别锁 vs 类级别锁(Java)
前言 对于多线程(并发)和Spring Boot这两块在同步进行学习中,在看到使用synchronized关键字使操作同步时,看到和C#中不一样的东西,所以这里呢,就深入学习了下,若有错误之处,还望指 ...
- java封装对象实体类_Java 接口自动化系列--实体类之entity封装
实体包entity下面有4个类,主要存放java对象,每个类必须有私有属性,空参构造,get set方法 具体excel中数据信息见---工具类excel文章 1.API类 解析excel中接口信息的 ...
- 一天一个Java基础——对象和类
1.在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象 2.可以在类中设置两种类型的元素:字段(也被称作数据成员)和方法(也被称作成员函数) 3.字段可以是任何类型的对象 ...
- python的类和对象_Python类与对象实验
一.任务描述 本实验任务主要对Python类与对象进行一些基本操作,通过完成本实验任务,要求学生熟练掌握Python类与对象的关系,并对Python类与对象的基本操作进行整理并填写工作任务报告. 二. ...
- Python面对对象编程——对象、类详解及实例
Python中类与对象的初认识 1.Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的 ...
- Swift中文教程(五)--对象和类
原文:Swift中文教程(五)--对象和类 Class 类 在Swift中可以用class关键字后跟类名创建一个类.在类里,一个属性的声明写法同一个常量或变量的声明写法一样,除非这个属性是在类的上下文 ...
最新文章
- Jquery和javascript常用技巧
- 动态规划最常见的习题 (最长公共子串、最长公共子序列、最短编辑距离)
- 国内可用的NTP服务器地址列表 网络时间 服务器
- 技术有时间衰减因子.
- Python:高阶错误
- 『软件工程3』你应该知道的三种原型实现模型:抛弃式、演化式、增量式
- php怎么把字符转成大写,php怎么把字符串转换为大写
- 嵌入式杂谈之文件系统
- 视频跟踪——CMT算法
- C Primer Plus 第8章 字符输入/输出和输入确认 8.11 编程练习答案
- 思科(Cisco)路由器常用命令总结
- 童年修复系列-SNES芯片组介绍及FPGA实现
- SQLite3 Cpp基本使用
- 部分国家人均GDP和生活满意度可视化
- 简图 新聚合图床源码 自带鉴黄功能
- 2017070506嵌入式开发系统概述和开发工具的使用
- 阿里云个人镜像仓库日常基本使用
- git stash、git branch使用方法
- mysql pt工具 加索引_[转]MySQL中如何为连接添加索引
- 怎么转换CAD文件的版本?分享两种转换版本的方法