面向对象day3:类和对象|封装的意义
- C++认为万事万物皆为对象,对象上有其属性和行为.
例如:
- 人可以作为对象,属性有年龄,性别,身高。体重…行为有走,跑,跳,吃饭…
- 车也可以作为对象,属性有轮胎,方向盘,车灯…行为有载人,放音乐…
- 具有相同性质的对象可以抽象为类,人属于人类,车属于车类.
C++面向对象的三大特性:封装,继承,多态。
下面是C++面向对象的特性封装:
1.封装的意义
- 将属性和行为作为一个整体,表现生活中的事物。
- 将属性和行为加以权限控制。
封装的意义一:
将属性和行为作为一个整体,表现生活中的事物。
语法:clsss 类名{访问权限:属性/行为};
示例1:设计一个圆类,计算圆的周长
#include<iostream>
using namespace std;
//设计一个圆类,计算圆的周长
//周长=2*pi*r
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;
return 0;
}
示例2:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,也可以输出姓名和学号:
#include<iostream>
#include<string>
using namespace std;
//封装示例:创建一个学生类
class Student{
//访问权限
public://公共权限
//类中的属性和行为统称为成员
//属性 成员属性 成员变量
string m_name;
string m_number;
//行为 成员函数 成员方法
void showStudent(){
cout<<"name:"<<m_name<<endl;
cout<<"number:"<<m_number<<endl;
}
//通过行为给属性赋值
void SetName(string name,string number){
m_name=name;
m_number=number;
}
};
int main()
{
//根据类创建一个对象 实例化对象
Student s1;
s1.m_name="zhangsan";
s1.m_number="01";
s1.showStudent();
Student s2;
s2.m_name="lisi";
s2.m_number="02";
s2.showStudent();
Student s3;
s3.SetName("wangwu","03");
s3.showStudent();
return 0;
}
封装的意义二:
将对象的属性和行为加以权限控制。
访问权限有三种:
- public 公共权限
- private 私有权限
- protected 保护权限
#include<iostream>
#include<string>
using namespace std;
//访问权限
/*
公共权限 public 成员类内可以访问类外也可以访问
保护权限 protected 成员类内可以访问类外不可以访问 儿子也可以访问父亲保护中的内容
私有权限 private 成员类内可以访问类外不可以访问 儿子不可以访问父亲私有的内容
*/
class Person{
public:
string m_Name;
protected:
string m_Car;
private:
int m_Password;
private:
void func(){
m_Name="zhangsan";
m_Car="car1";
m_Password=123;
}
};
int main()
{
Person p1;
p1.m_Name="lisi";
return 0;
}
2.struct和class的区别
在C++中struct也可用于声明一个类,它和class唯一的区别就是默认访问权限不同。
- struct默认public
- class默认private
#include<iostream>
using namespace std;
//C++中struct和class的区别
class C1{
int m_num;//默认是私有权限
};
struct C2{
int m_num;//默认是公共权限
};
int main()
{
C1 c1;
//c1.m_num;默认私有权限不可以访问
C2 c2;
c2.m_num=10;//默认公共权限
return 0;
}
3.成员属性设置为私有
- 优点一:将成员属性设置为私有,加以读写权限的控制,可以设置外部接口进行访问。
- 优点二:对于写权限,我们可以检测数据的有效性。
#include<iostream>
#include<string>
using namespace std;
//成员属性设置为私有
class Person{
public:
//设置姓名 提供公共的成员函数
void setName(string name){
m_Name=name;
}
//读取姓名
string getName(){
return m_Name;
}
int getAge(){
m_Age=18;
return m_Age;
}
void setNum(string num){
m_Number=num;
}
private:
//姓名 可读可写
string m_Name;
//年龄 只读
int m_Age;
//电话号码 只写
string m_Number;
};
int main()
{
Person p;
p.setName("zhangsan");
cout<<"姓名是"<<p.getName()<<endl;
cout<<"年龄是"<<p.getAge()<<endl;
//p.m_Age=20;只读
p.setNum("123");
//cout<<"电话号码是"<<p.m_Number<<endl;
return 0;
}
检测数据的有效性:
#include<iostream>
#include<string>
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(){
//m_Age=18;
return m_Age;
}
void setNum(string num){
m_Number=num;
}
private:
//姓名 可读可写
string m_Name;
//年龄 可读可写(0-100)用于检测数据有效性
int m_Age;
//电话号码 只写
string m_Number;
};
int main()
{
Person p;
p.setName("zhangsan");
cout<<"姓名是"<<p.getName()<<endl;
p.setAge(160);//检测数据有效性
cout<<"年龄是"<<p.getAge()<<endl;
//p.m_Age=20;只读
p.setNum("123");
//cout<<"电话号码是"<<p.m_Number<<endl;
return 0;
}
参考:黑马程序员