类和对象
c++面向对象的三大特性:封装,继承,多态。
在c++中,认为万物皆对象,对象有属性和行为。
类和类的实例化
在c++中,用关键字 class 去封装对象。
语法:
class 类名
{
//1.属性
//2.行为
}
属性我们又叫成员变量,成员属性。
行为我们又叫成员函数,成员方法。叫法不同但是都是一个意思。
创建一个对象又叫实例化对象。
由于 class定义出来的对象并不是一个对象,是千千万万个相同属性和行为方法的对象,所以我们抽象出来这个类名,用类名去创建一个具体的对象。
看一个例子感受以下类:
设计一个圆,求其圆的周长
//圆周率
const double PI = 3.14;
//封装一个圆类,求圆的周长
//class代表设计一个类,后面跟着的是类名
class Circle
{
public:
//属性
int m_r;//半径
//行为
//获取到圆的周长
double calculateZC()
{
return 2 * PI * m_r;
}
};
int main() {
//通过圆类,创建圆的对象
// c1就是一个具体的圆
Circle c1;
c1.m_r = 10; //给圆对象的半径 进行赋值操作
//2 * pi * 10 = = 62.8
cout << "圆的周长为: " << c1.calculateZC() << endl;
system("pause");
return 0;
设计了一个圆类 Circle,用圆类创建了一个对象 c1;这个对象拥有了圆类 Circle 属性和方法。如何使用Circle 的属性和方法呢?用 对象.属性 和 对象.行为即可。
用类类型创建对象的过程,称为类的实例化
- 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它;
- 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量;
- 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间;
访问权限
在设计类时候,可以给成员变量和成员函数加以权限的设定,来设定他们的访问。
在c++中访问权限有三种:
public:共有权限。类内可以访问,类外可以访问。
private: 私有权限。类内可以访问,类外不可以访问。
protect: 保护权限。类内可以访问,类外不可以访问。
访问:就是对该变量和方法进行读写或者其他一些操作。
private和protect的区别:private的成员变量和方法只有自己类可以访问,但是protect的成员变量和方法父类也可以访问。
c++中的class和struct 的区别:
其实没什么区别,在c++中为了兼容c语言,就保留了struct这个关键字,两者的区别就在于class默认权限是私有的,struct默认权限是共有的。
成员属性私有化
在c++中,成员属性一般设置为private的权限:
这样你可以在类内读和写自己的成员变量。
可以检查写入时候的数据有效性。
那问题来了,你把成员属性设置为pivate,外面如何访问你的成员变量呢?可以通过设置一个共有的函数,对外提供接口,通过函数去访问里面的变量。
class Person {
public:
//姓名设置可读可写
void setName(string name) {
m_Name = name;
}
string getName()
{
return m_Name;
}
//获取年龄
int getAge() {
return m_Age;
}
//设置年龄
void setAge(int age) {
//检测写入数据的有效性
if (age < 0 || age > 150) {
cout << "你个老妖精!" << endl;
return;
}
m_Age = age;
}
//情人设置为只写
void setLover(string lover) {
m_Lover = lover;
}
private:
string m_Name; //可读可写 姓名
int m_Age; //只读 年龄
string m_Lover; //只写 情人
};
int main() {
Person p;
//姓名设置
p.setName("张三");
cout << "姓名: " << p.getName() << endl;
//年龄设置
p.setAge(50);
cout << "年龄: " << p.getAge() << endl;
//情人设置
p.setLover("苍井");
//cout << "情人: " << p.m_Lover << endl; //只写属性,不可以读取
system("pause");
return 0;
}
封装
在c++中,是通过class关键字将成员属性和成员方法封装成为一个类名,对外隐藏数据和实现细节,这个类名就可以被当成一个数据类型去创建对象了,这样的好处有很多:不让外界访问数据,只给访问必要的接口,减少很多不必要的错误。
比如一个栈的类的设计,你top指针可以有两种设计方式,第一种是一开始指向下标0,第二种一开始指向下标1;假如你不清楚这个类的top指针设计方式,去通过访问top指针得到栈顶元素,那么就很容易出错,得不到你想要的结果;
假如数据被保护了,只提供接口,那么就好很多了,因为接口都是完成一样的功能,比如说top()接口,获取栈顶元素,此时,你不需要再访问数据top指针,直接调用接口就可以得到你要的栈顶元素了;这样减少了不必要的错误发生;
封装体现在两个方面:
- 数据和方法封装在一起;
- 访问限定符对数据和方法的访问限制外界的访问;