目录
4. 类和对象
- C++面向对象的三大特征为:封装、继承、多态
C++认为万事万物皆为对象,对象有其属性和行为。
例如:
人可以作为对象,属性有姓名、年龄、身高、体重...,行为有走、跑、跳、吃饭...
车也可以作为对象,属性有轮胎、方向盘、车灯...,行为有载人、放音乐、开空调...
4.1 封装
封装是C++面向对象三大特征之一。
4.1.1 封装的意义
封装的意义:
- 将属性和行为作为一个整体,表现生活中的事物。
- 将属性和行为加以权限控制。
封装的意义一:在设计类的时候,属性和行为写在一起,表现事物。
语法:
class 类名 { 访问权限: 属性 / 行为 };
C++封装一些名词:
- 类中的属性和行为,统一称为 成员。
- 实例化 :通过一个类,创建一个对象的过程。
- 属性 也叫:成员属性 / 成员变量。
- 行为 也叫:成员函数 / 成员方法。
示例1:
class Student
{
public:// 公共权限
// 类中的属性和行为,统一称为 成员
// 属性 成员属性 成员变量
string Name; // 姓名
int ID; // 学号
// 行为 成员函数 成员方法
// 显示姓名和学号
void showStudent()
{
cout << "姓名: " << Name << " 学号: " << ID << endl;
}
void setName(string xname)
{
Name = xname;
}
};
int main() {
Student s1;
s1.Name = "XiaoMing";
s1.ID = 20200804;
s1.showStudent();
s1.setName("小明");
s1.showStudent();
system("pause");
return 0;
}
-----------------------------------------------------------------------
姓名: XiaoMing 学号: 20200804
姓名: 小明 学号: 20200804
请按任意键继续. . .
封装的意义二:类在设计时,可以把属性和行为放在不同的权限下,加以控制。
访问权限有三种:
- 1. public 公共资源。成员 类内可以访问,类外可以访问。
- 2. protected 保护资源。成员 类内可以访问,类外不可以访问。继承时,子类可以访问父类中的保护内容。
- 3. private 私有资源。成员 类内可以访问,类外不可以访问。继承时,子类不可以访问父类中的私有内容。
4.1.2 class和struct的区别
在C++中,class和struct的唯一区别就在于默认的访问权限不同。
区别:
struct 默认权限为公共。class默认权限为私有。
class C1
{
int A;
};
struct C2
{
int A;
};
int main() {
C1 c1;
c1.A = 10; // 编译器报错,访问权限是私有
C2 c2;
c2.A = 10; // 正确,访问权限是公共
system("pause");
return 0;
}
4.1.3 成员属性设置为私有
优点1:将所有成员属性设置为私有,可以自己控制读写权限。
优点2:对于写权限,我们可以检测数据的有效性。
全部设置为私有,然后定义函数getxxx、setxxx去读写,而且可以对输入值进行预处理,不符合需求的数据可以不要。
class Person
{
public:
string getName()
{
return name;
}
void setName(string xname)
{
name = xname;
}
int getAge()
{
return age;
}
void setAge(int xage)
{
if (xage > 150 || xage < 0)
{
cout << "年龄输入有误,请控制输入在 0~150 之内" << endl;
return;
}
else
{
age = xage;
}
}
private:
string name;
int age;
int height;
};
int main() {
Person p;
p.setName("XiaoMing");
p.setAge(22);
cout << "姓名: " << p.getName() << " 年龄: " << p.getAge() << endl;
p.setAge(180);
cout << "姓名: " << p.getName() << " 年龄: " << p.getAge() << endl;
system("pause");
return 0;
}
----------------------------------------------------------------------------
姓名: XiaoMing 年龄: 22
年龄输入有误,请控制输入在 0~150 之内
姓名: XiaoMing 年龄: 22
请按任意键继续. . .
4.1.4 类拆分成.h.c编写方法
类拆分成.h.c编写方法:(P105)
- .h 文件中,开头添加 #pragma once 防止头文件重复包含。再将类复制过来,删除成员函数的实现,加 ; 补全。成员变量不用改变。
- .c 文件中,将类复制过来,删除 类声明、括号、public:、private:、成员变量,只留下成员函数。将每个成员函数加上类名的作用域。
- main所在的文件,包含 .h头文件。
示例:(将上一节的代码拆分)
person.h
#pragma once
#include <iostream>
using namespace std;
class Person
{
public:
string getName();
void setName(string xname);
int getAge();
void setAge(int xage);
private:
string name;
int age;
int height;
};
person.cpp
#include "person.h"
string Person::getName()
{
return name;
}
void Person::setName(string xname)
{
name = xname;
}
int Person::getAge()
{
return age;
}
void Person::setAge(int xage)
{
if (xage > 150 || xage < 0)
{
cout << "年龄输入有误,请控制输入在 0~150 之内" << endl;
return;
}
else
{
age = xage;
}
}
demo.cpp
#include <iostream>
using namespace std;
#include <string>
#include "person.h"
int main() {
Person p;
p.setName("XiaoMing");
p.setAge(22);
cout << "姓名: " << p.getName() << " 年龄: " << p.getAge() << endl;
p.setAge(180);
cout << "姓名: " << p.getName() << " 年龄: " << p.getAge() << endl;
system("pause");
return 0;
}
相关教程
- 开发环境搭建:Visual Studio 2019 C++开发环境搭建
- 推荐视频:https://www.bilibili.com/video/BV1et411b73Z?from=search&seid=4205594350351753444
- 已投币三连,非常细致的视频教程,感谢up主。