C++面向对象编程——封装
C++面向对象的三大特性为:封装、继承、多态
C++认为万事万物都皆为对象,对象上有其属性和行为
例如:
人可以作为对象,属性有姓名、年龄、身高、体重.,行为有走、跑、跳、吃饭、唱歌...
车也可以作为对象,属性有轮胎、方向盘、车灯…行为有载人、放音乐、放空调...
具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类
封装
封装的意义:
①将属性和行为作为一个整体,表现生活中的事物
语法:class 类名{ 访问权限:属性/行为 };
类中的属性和行为,我们统称为成员
属性:成员属性 成员变量
行为:成员函数 成员方法
//圆周率
const double PI = 3.14;//设计一个圆类,求圆的周长
//圆求周长的公式:2*PI*半径
//class代表设计一个类,类后面紧跟着的就是类名称
class Circle{//访问权限//公共权限
public://属性//半径int m_r;//行为//获取圆的周长double calculateZC(){return 2*PI*m_r;}//给半径赋值void set(String name){m_name = name;}
}int main(){//通过圆类创建具体的圆//实例化(通过一个类 创建一个对象的过程)Circle c1;//给圆对象的属性进行赋值c1.m_r = 10;c1.set(10);cout << "圆的周长为:" <<cl.calculateZC()<<endl;}
②将属性和行为加以权限控制
访问权限有三种:
public 公共权限 类内可以访问 类外可以访问
protected 保护权限 类内可以访问 类外不可以访问
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 p1;p1.m_Name = "李四"p1.m_Car = "奔驰"//保护权限内容,在类外访问不到p1.m_Password = 123;//私有权限内容,类外访问不到}
struct和class的区别
在C++中struct和class唯一的区别就在于默认的访问权限不同
①struct默认权限为公共
②class默认权限为私有
class C1
{int m_A;//默认权限,是私有
};struct C2
{int m_A;//默认权限,是公共
};int main(){//在class里默认权限 私有,因此类外不可以访问C1 c1://在struct默认的权限为公共,因此可以访问C2 c2:c2.m_A = 100;
}
成员属性设置为私有
优点:
①将所有成员属性设置为私有,可以自己控制读写权限
②对于写权限,我们可以检测数据的有效性
class Person{
public:void setName(string name){m_Name = name;}string getName(){return m_Name;}int getAge(){return m_Age;}//设置年龄(0~150)int setAge(int Age){if(Age<0 || Age>150 ){cout<<"年龄输入有误,赋值失败"<<endl;return;}m_Age = Age;}void setIdol(string idol){m_Idol = idol;}private:string m_Name; //可读可写int m_Age = 18; //只读string m_Idol; //只写}int main(){Person p;p.seyName("张三");cout<<"姓名:"<<p.getName()<<endl;p.setAge(20);p.m_Age = 20;cout<<"年龄:"<<p.getAge()<<endl;p.setIdol("小明");cout<<"偶像:"<<p.setIdol()<<endl; }
静态成员
静态成员就是在成员变量和成员函数前加上关键字static,成为静态成员变量
静态成员变量分为:
1、静态成员变量
①所有对象共享同一份数据
②在编译阶段分配内存
③类内声明,类外初始化
//类内声明,类外初始化
class Person{
public:static int m_A;//静态成员变量也是有访问权限的
private:static int m_B;
};
int Person::m_A = 100;
int Person::m_B = 200;void test01(){Person p;cout << p.m_A <<endl;Person p2;p2.m_A = 200;cout <<p.m_A <<endl;
}//静态成员变量,不属于某个对象上,所有对象都共享同一份数据
//因此静态成员变量有两种访问方式
void test02(){//通过对象进行访问Person p;cout << p.m_A <<endl;//通过类名进行访问cout <<Person::m_A <<endl;//类外访问不到私有静态成员变量cout <<Person::m_B <<endl;
}
2、静态成员函数
①所有对象共享同一个函数
②静态成员函数只能访问静态成员变量
class Person{
public:static void func(){m_A = 100;//静态成员函数可以访问静态成员变量m_B = 200;//静态成员函数不可以访问非静态成员变量cout << "static void func调用" <<endl;}static int m_A;int m_B;
//静态成员函数也是有访问权限的
private:static void func2(){cout << "static void func2调用" << endl;}
};
int Person::m_A=0;void test01(){//通过对象访问Person p;p.func;//通过类名访问Person::func();//类外访问不到私有静态成员函数Person::func2();
}