12,类和对象
C++面向对象三大特性:封装,继承,多态
C++认为万物皆为对象,对象上有其属性和行为。
4.1封装
4.1.1封装的意义
封装的意义:
- 将属性和行为作为一个整体,表现生活中的事物
- 将属性和行为加以权限控制
封装的意义一:
在设计类的对象,属性和行为写在一起,表现事物
类中的属性和行为都叫成员
属性 成员属性,成员变量
行为 成员函数,成员方法
//求圆的周长
const double PI = 3.14;
class Circle
{
//访问权限
public;//公共权限
int m_r;
double calculateZC()
{
return 2*PI*m_r;
}
};
int main()
{
Circle cl;//实例化
cl.m_r = 10;
cout<<"圆的周长为:"<<cl.calculateZC()<<endl;
system("pause");
return 0;
}
封装的意 义二:
类在设计时,可以把属性和行为放在不同的权限下,加以控制
访问权限有三种:
1,public 公共权限 类内和类外都可访问
2,protected 保护权限 类内可以访问,类外不可以访问 儿子可以访问父亲中的保护内容
3,private 私有权限 类内可以访问,类外不可以访问 儿子不可以访问父亲的私有内容
class Person
{
public:
string m_Name;
protected:
string m_Car;
private:
int m_Password;
public:
void func()
{
m_Name = "张三";
m_Car = "拖拉机";
m_password = 123456;
}
};
int main()
{
person pl;
pl.m_Name = "李四";
//pl.m_Car = "奔驰";//是错误的
//pl_password = 123456;//是错误的
pl.func();
system("pause");
return 0;
}
4.1.2struct和class的区别
在C++中struct和class的区别唯一区别就在于默认访问权限不同
区别:
- struct默认权限为公共
- class默认权限为私有
class C1
{
int m_A;//私有
};
struct C2
{
int m_A;//公共
}
int main()
{
C1 c1;
//c1.m_A = 100;不可访问
C2 c2;
c2.m_A = 100;
system("pause");
return 0;
}
4.1.3成员属性设置为私有
**优点1:**将所有成员属性设置为私有,可以自己控制读写权限
**优点2:**对于写权限,我们可以检测数据的有效性
示例:
#include<string>
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 = 18; //只读 年龄
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;
}
案例:设计立方体程序
#include<iostream>
using namespace std;
class Cube
{
public:
void setL(int l)
{
m_L = l;
}
int getL()
{
return m_W;
}
void setW(int w)
{
m_W = w;
}
int getW()
{
return m_W;
}
void setH(int h)
{
m_H = h;
}
int getH()
{
return m_H;
}
int calculateS()
{
return 2 * m_L * m_W + 2 * m_H * m_W + 2 * m_L * m_H;
}
int calculateV()
{
return m_L * m_W * m_H;
}
bool isSameByclass(Cube &c)
{
if (m_L == c.getL() && m_W == c.getW() && m_H == c.getH())
{
return true;
}
return false;
}
private:
int m_L;
int m_W;
int m_H;
};
bool isSame(Cube &c1, Cube &c2)
{
if(c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH())
{
return true;
}
return false;
}
int main( )
{
Cube c1;
c1.setL(10);
c1.setW(10);
c1.setH(10);
cout << "c1的面积为" << c1.calculateS() << endl;
cout << "c1的体积为" << c1.calculateV() << endl;
Cube c2;
c2.setL(10);
c2.setW(10);
c2.setH(10);
bool ret = isSame(c1, c2);
if (ret)
{
cout << "c1和c2是相等的" << endl;
}
else
{
cout << "c1和c2是不相等的" << endl;
}
bool ret2 = c1.isSameByclass(c2);
if (ret2)
{
cout << "c1和c2是相等的" << endl;
}
else
{
cout << "c1和c2是不相等的" << endl;
}
system("pause");
return 0;
}
4.2 对象的初始化和清理
- 生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全
- C++中的面向对象来源于生活,每个对象也都会有初始设置以及 对象销毁前的清理数据的设置。
4.2.1 构造函数和析构函数
对象的初始化和清理也是两个非常重要的安全问题
一个对象或者变量没有初始状态,对其使用后果是未知
同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题
c++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。
对象的初始化和清理工作是编译器强制要我们做的事情,因此如果我们不提供构造和析构,编译器会提供
编译器提供的构造函数和析构函数是空实现。
- 构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用。
- 析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。
构造函数语法:类名(){}
- 构造函数,没有返回值也不写void
- 函数名称与类名相同
- 构造函数可以有参数,因此可以发生重载
- 程序在调用对象时候会自动调用构造,无须手动调用,而且只会调用一次
析构函数语法: ~类名(){}
- 析构函数,没有返回值也不写void