13,类和对象(封装)

c++面向对象三大特性为:封装、继承、多态

c++认为万事万物都皆为对象,对象上有其属性和行为

具有相同性质的对象,我们可以抽象称为类,人属于认类,车属于车类

13.1封装的意义

封装是面向对象三大特性之一

封装的意义:

将属性和行为作为一个整体,表现生活中的事物

将属性和行为加以权限控制

13.2封装意义

13.2.1封装意义一(语法)

在设计类的时候,属性和行为写在一起,表现事物

语法:class  类名{  访问权限:  属性  /  行为  };

#include
using namespace std;
const double PI = 3.14;//定义Π
class Circle
{
public://公共权限
    int m_r;//半径
    double calculateZC()//获取圆的周长
    {
        return 2 * PI * m_r;
    }
};
int main()
{
    Circle c1;//通过圆类创建具体的园(对象)实例化(通过一个类,创建一个对象的过程)
    c1.m_r = 10;//给圆对象的属性进行赋值
    cout << "圆的周长为:" << c1.calculateZC() << endl;
    system("pause");
    return 0;
}

eg:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号

第一种

#include
using namespace std;
class Student
{
public:
    string m_Name;     //姓名
    int m_Id;          //学号
    void showStudent()
    {
        cout << "学生姓名为:" << m_Name << " 学生学号为:" << m_Id << endl;
    }
};
int main()
{
    Student s1;
    s1.m_Name = "大傻";
    s1.m_Id = 191818;
    s1.showStudent();//给s1对象赋值
    system("pause");
    return 0;
}

第二种

#include
using namespace std;
class Student
{
public:
    void setName(string name)
    {
        m_Name = name;
    }
    void setId(int id)
    {
        m_Id = id;
    }
    void showStudent()
    {
        cout << "学生姓名为:" << m_Name << " 学生学号为:" << m_Id << endl;
    }
public:
    string m_Name;     //姓名
    int m_Id;          //学号
};
int main()
{
    Student s2;
    s2.setName("二蛋");//传给void setName(string name)的name,之后传给里面m_Name = name;
    s2.setId(191819);
    s2.showStudent();
    system("pause");
    return 0;
}

总结:类中的属性和行为我们统一称为成员

属性(称呼)  成员属性 成员变量

行为(称呼) 成员函数 成员方法

13.2.2封装意义二(访问权限)

类在设计时,可以把属性和行为放在不同的权限下,加以控制

访问权限有三种:

public            公共权限(类内可以访问,类外可以访问)

protected      保护权限(类内可以访问,类外不可以访问)(子类可以访问父类中的保护内容)

private          私有权限(类内可以访问,类外不可以访问)(子类不可以访问父类中的私有内容)

#include
using namespace std;
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 p1;
    p1.m_Name = "李四";
    //p1.m_Car = "奔驰";放在类外会报错,保护权限内容在类外访问不到
    //p1.m_Password = 654321;放在类外会报错,私有权限内容在类外访问不到
    system("pause");
    return 0;
}

13.3struct和class区别

在c++中struct和class唯一区别在于默认的访问权限不同

struct默认权限为公共

class默认权限为私有

13.4成员属性设置为私有

优点:

将所有成员属性设置为私有,可以控制读写权限

对于写权限,我们可以检测数据的有效性

13.4.1将所有成员属性设置为私有,可以控制读写权限

#include
using namespace std;
class Person
{
public:
    void setName(string name)      //设置姓名 可读可写
    {
        m_Name = name;
    }
    string getName()//获取姓名
    {
        return m_Name;
    }
    int getAge()                            //获取年龄 可读
    {
        m_Age = 0;    //初始化为0岁
        return m_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;
    cout << "年龄为:" << p.getAge() << endl;
    p.setLover("三丫");//不可以访问到此
    //cout << "情人名为:" << p.getLover() << endl;会报错,没用定义getLover
    system("pause");
    return 0;
}

13.4.2对于写权限,我们可以检测数据的有效性

#include
using namespace std;
class Person
{
public:
    void setName(string name)//设置姓名
    {
        m_Name = name;
    }
    string getName()
    {
        return m_Name;
    }
    void setAge(int age)
    {
        if (age < 0 || age>150)
        {
            m_Age = 0;
            cout << "输入的结果有误" << endl;
            return;
        }
        m_Age = age;
    }
    int getAge()
    {
        return m_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(18);
    cout << "年龄为:" << p.getAge() << endl;
    p.setLover("三丫");
    system("pause");
    return 0;
}

13.5例题

13.5.1设计立方体类(Cube) 

                                   13,类和对象(封装)_第1张图片

#include
using namespace std;
class Cube
{
public:
	void setL(int l)//设置长
	{
		m_L = l;
	}
	int getL()//获取长
	{
		return m_L;
	}
	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_L * m_H + 2 * m_W * m_H;
	}
	int calculateV()
	{
		return m_L* m_W* m_H;
	}
	bool isSameByClass(Cube&a)//成员函数中已经有m_L就不用写a1.getL()了,a2.getL()是外来的,可换成a.getL()
	{
		if (m_L == a.getL() && m_W == a.getW() && m_H == a.getH())
		{
			return true;
		}
		return false;
	}
private://
	int m_L;//长
	int m_W;//宽
	int m_H;//高
};
bool isSame(Cube a1,Cube a2)//利用全局函数判断两个立方体是否相等
{
	if (a1.getL() == a2.getL() && a1.getW() == a2.getW() && a1.getH() == a2.getH())
	{
		return true;
	}
	return false;
}
int main()
{
	Cube a1;//创建立方体对象a1
	a1.setL(10);
	a1.setW(10);
	a1.setH(10);
	cout<<"a1表面积为:"<

13.5.2点和圆的关系

设计一个圆形类(Circle),和一个点类(Point),计算点和圆的关系

#include
using namespace std;
class Point
{
public:
	void setX(int x)//设置点X坐标
	{
		m_X = x;
	}
	int getX()//获取点X坐标
	{
		return m_X;
	}
	void setY(int y)//设置点Y坐标
	{
		m_Y = y;
	}
	int getY()//获取点Y坐标
	{
		return m_Y;
	}
private:
	int m_X;
	int m_Y;
};
class Circle
{
public:
	void setR(int r)
	{
		m_R = r;
	}
	int getR()
	{
		return m_R;
	}
	void setCenter(Point center)
	{
		m_Center = center;
	}
	Point getCenter()
	{
		return m_Center;
	}
private:
	int m_R;//半径
	Point m_Center;//圆心
};
void isInCircle(Circle &c,Point &p)
{
	int distance = (c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) + (c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());
	int rDistance = c.getR() * c.getR();
	if (distance == rDistance)
	{
		cout << "点在圆上" << endl;
	}
	else if (distance > rDistance)
	{
		cout << "点在圆外" << endl;
	}
	else
	{
		cout << "点在圆内" << endl;
	}
}
int main()
{
	Circle c;//创建圆
	c.setR(10);
	Point center;
	center.setX(10);
	center.setY(0);
	c.setCenter(center);
	Point p;//创建点
	p.setX(10);
	p.setY(10);
	isInCircle(c, p);//判断关系
	system("pause");
	return 0;
}

另一种放置方式

在头文件创建point.h

#pragma once//防止头文件重复包含
#include 
using namespace std;
class Point//留下了函数声明和变量声明
{
public:
	void setX(int x);
	int getX();
	void setY(int y);
	int getY();
private:
	int m_X;
	int m_Y;
};

在源文件创建point.cpp

#include"point.h"
	void Point::setX(int x)//因为是成员函数,现在在全局函数中,加Point变成Point作用域下函数
	{
		m_X = x;
	}
	int Point::getX()//留下所有函数即可
	{
		return m_X;
	}
	void Point::setY(int y)
	{
		m_Y = y;
	}
	int Point::getY()
	{
		return m_Y;
	}

在头文件创建Clircle.h

#pragma once//防止头文件重复包含
#include 
using namespace std;
#include "Point.h"
class Circle
{
public:
	void setR(int r);
	int getR();
	void setCenter(Point center);
	Point getCenter();
private:
	int m_R;//半径
	Point m_Center;//圆心
};

在源文件创建Clircle.cpp

#include"Circle.h"
	void Circle::setR(int r)
	{
		m_R = r;
	}
	int  Circle::getR()
	{
		return m_R;
	}
	void  Circle::setCenter(Point center)
	{
		m_Center = center;
	}
	Point  Circle::getCenter()
	{
		return m_Center;
	}

hello.cpp中剩

#include
using namespace std;
#include"Circle.h"
#include"point.h"
void isInCircle(Circle &c,Point &p)
{
	int distance = (c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) + (c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());
	int rDistance = c.getR() * c.getR();
	if (distance == rDistance)
	{
		cout << "点在圆上" << endl;
	}
	else if (distance > rDistance)
	{
		cout << "点在圆外" << endl;
	}
	else
	{
		cout << "点在圆内" << endl;
	}
}
int main()
{
	Circle c;//创建圆
	c.setR(10);
	Point center;
	center.setX(10);
	center.setY(0);
	c.setCenter(center);
	Point p;//创建点
	p.setX(10);
	p.setY(10);
	isInCircle(c, p);//判断关系
	system("pause");
	return 0;
}

总结:在类中可以让另一个类,作为本来中的成员

.cpp中告诉成员函数.h中留下成员函数的声明和成员属性的声明

你可能感兴趣的:(c++,c++)