1.每个对象都具有自己的性质,具有相同性质的对象抽象为类
第一部分 --- 封装
可以将生活中的事物理解为生活中的对象
其中半径就是圆的一个属性,特点
括号内跟着的是1.访问权限2.属性3.行为 --- 一个类就由这三部分组成
关于访问权限 --- 后面的课程再将,现在先统一使用公共权限 --- public:
1.属性一般指变量,而行为一般指函数 --- 比如说对于一个圆类 --- 它拥有属性半径(变量),然后我们对其做出行为 --- 求周长(函数)
2.我们可以通过圆类来创建一个具体的圆 -- 这个具体的圆就被我们称为对象了
首先一个对象包含了属性和行为,比如人包含了姓名,年龄(属性),会吃饭,睡觉(行为)
将具有相同属性和行为的一系列对象的抽象为一个统一的模板,这个模板就是类比如人类就是将各种人相同的属性和行为抽象出的一个通用模板(在这个模板中包含了每个人都具有的属性和行为)
通过这个模板我们可以不停的创造具有模板内的属性和行为的对象
1.创建一个类需要关键字 calss,class后面跟的是类名
类中包含了三部分:1.访问权限2.属性3.行为
其中属性是我们创建的变量,行为是我们创建的函数
2.创建一个对象的前提是我们有创建这个对象的类,有了类的话创建语法如下:
计算机只能通过类(模板)来创建对象
类名 对象名 ; 这就创建成功 --- 如 Circle c1;
如果要给对象的属性赋值:对象名+点操作符+属性 = 想赋的值
让对象执行行为的话 --- 对象名+点操作符+对象具有的行为 --- 即类中的行为--- 即调用类中的函数(执行行为的本质就是调用函数)
通过一个类创建一个对象的过程称为实例化
设计类的时候不要忘了在花括号的最后加上一个分号 ;
关于属性的赋值:
除了用点操作符赋值以外,我们还可以通过类中的行为(函数)对属性进行赋值
三种权限:
1.公共权限 public --- 类内的成员(属性和行为)可以从类外访问和操作,同时成员也可以从类内访问和操作
2.保护权限 protected --- 类内的成员可以从类内访问和操作,但不能从类外访问和操作,不过有一个例外,那就是在继承中,儿子可以访问父亲中的保护内容
3.私有权限 private ---- 类内的成员只可以从类内访问和操作
在类中的行为对属性赋值,这是类内对成员进行访问和操作,是没有问题的
1.每一个成员都可以单独设置自己的权限。
2.在一个权限下面所有的成员都具有相同的权限。
这里就是从类外访问和操作具有保护权限/私有权限的成员的例子 --- 这是一种非法操作
在类内可以访问和操作具有三种权限中任意一种权限的成员,而在内外则只能访问具有公共权限的成员,私有权限和保护权限都无法访问
第二部分 --- struct 和 class 的区别
分别建立类和结构体,如果我们没有人为给定它们的成员权限的话,则
类中的成员都默认为私有权限
结构体中的成员都默认为公共权限
第三部分 --- 成员属性设置为私有
将所有的成员属性的权限设为私有,然后我们在通过设置具有公共权限的函数(行为)的方式,来为这些属性设创建对应的读写接口
比如说我们在类内创建了一个具有公共权限的函数,这个函数实现的功能是在类内给一个具有私有权限的成员属性赋值,这个函数就是这个成员属性的写函数,又称为这个成员属性的写接口
只有我们设置了对应的接口,具有私有权限的成员属性才能够从类外被读/写
比如这就是名字的写接口,类外可以通过这个接口来对具有私有权限的姓名成员属性进行写操作
通过这种方式我们就掌握了成员属性的读写权限 ---- 一个具有私有权限的成员属性到底是可读?可写?还是即可读又可写?都是有我们是否设置读写接口来决定的
综上,由于我们是通过行为(即设置函数)的方式来为具有私有权限的成员变量设置读写权限的,所以我们在设置写权限的时候,可以在函数中添加数据判断,如果数据合理则写入,否则不写入 --- 这样子我们就可以确保数据的合理性和有效性。
如果是公共权限的成员属性的话,则可以直接被点操作符写,无法进行数据判断
补充知识:类中的成员属性(变量)相较于成员行为(函数)而言是全局变量
(注意!!!只是相对而言)
1.对象之间不能够直接进行比较,但是对象的属性之间可以进行比较
2.对象可以作为函数实参传给形参(传参的本质是将实参赋值给形参,所以又称为值传递) --- 直接值传递的话会要=重复开辟内存空间,与其傻傻的值传递,不如用地址传递的方式利用旧的内存空间,实现空间的高效利用。
而地址传递在c++中有一种优化用法 --- 那就是引用,用引用的话就不需要再取地址,解引用这么麻烦,而是直接通过别名对原内存空间进行访问和操作 --- 这种方法称为引用传递。
引用做形参 --- int &a --- 传参过程其实就是给别名找原名的过程 --- int &a = b --- 此时我们就给别名a找到了原名b ,然后我们就可以直接通过别名对原名所对应的内存空间和数据进行操作了。
然后对象也可以取别名,结构体同理
switch 括号中的内容必须是整型
在一个类a中调用类b的对象时,类b必须在类a前创建
即在一个类a中,可以让令一个类b作为本类的成员,但是类b必须在类a之前创建
相同类的对象之间可以相互赋值
在写正式的工程的时候,我们不会把所有的类都写在一个源文件中,而是将其拆分为类的声明和类的实现写在不同的源文件中
所有的声明都放在 .h文件中,所有的实现都放在 .c 文件中
类的声明主要是针对于成员函数 --- 其实所谓类的声明和实现就是将其成员函数的声明和实现分别写在.h和.c文件中,成员属性无需变化。
如下:
这是用于声明的头文件
#pragma once --- 这行代码的出现是为了防止头文件重复包含
在装有类的实现的.cpp 文件中写的其实就是类的成员函数的实现
首先我们第一步是包含这个类的头文件
然后是写上类中的所有成员函数的实现(就正常写)
不过这里有和正常写不同的一点:
我们要在每一个成员函数名前加上 该成员函数所属的类的 类名:: --- > 如上面的 Circle::setR() --- 这是为了告诉计算机这个函数是类Circle的成员函数
如果在头文件中已经写了 #include <iostrream>和 using namespace std; 的话,只要在源文件中包含了这个头文件,就不再需要写这两个了
c++中引用自制的头文件是用 “ ”