类和对象(类封装对象的属性(数据)和行为(函数))
c语言的思想
typedef struct{
char name[32];
int age;
}Person;
typedef struct{
char name[32];
int age;
int type;
}Animal;
void personeat(Person *p){
count<<p->name<<"eat"<<endl;
}
void main(){
Person person = {"wang",43};
personeat(&person);
}
结构体不能放函数,因此数据和方法分开,相互独立,容易发生错乱。
封装
1、把变量(属性)和函数(操作)合成一个整体,封装在一个类中。
2、对变量和函数进行访问控制(公有,私有,保护),权限控制。
3、在类的内部(作用域范围),没有权限之分,所有成员可以互相访问。
4、在类的外部,访问权限才有意义。
5、类的外部,只有public修饰的成员才能访问,在没有涉及继承和派生时,private和protected时同等级的,外部不允许访问。
类的初始
class 类名{//抽象的概念 系统不会为其分配空间
private: //私有 类的外部不可直接访问
protected: //保护 类的外部不可直接访问
public: //公有 类的外部可直接访问
数据;
方法;
//在类的内部 没有权限之分 都可以互相访问
};
#include <iostream>
using namespace std;
class Person{
private:
int m_money;//private
protected:
int age;
public:
void dese(){
cout<<"funny"<<endl;
}
};
int main(int argc, char *argv[])//用类实例化对象>>Person定义变量
{
Person rex;
rex.m_money = 200;//err
cout << rex.m_money << endl;//err
return 0;
}
m_money是私有数据,无法在外部访问。
int main(int argc, char *argv[])//用类实例化对象>>Person定义变量
{
Person rex;
//rex.m_money = 200;//err
//cout << rex.m_money << endl;//err
rex.age = 200;//err
cout << rex.age << endl;//err
return 0;
}
age也不行,除非是继承,否则保护的数据也不能访问
int main(int argc, char *argv[])//用类实例化对象>>Person定义变量
{
Person rex;
//rex.m_money = 200;//err
//cout << rex.m_money << endl;//err
//rex.age = 200;//err
//cout << rex.age << endl;//err
rex.dese();
return 0;
}
只有公有的dese()函数能正常外部访问
#include <iostream>
using namespace std;
class Person{
private:
int m_money;//private
protected:
int age;
public:
void dese(){
m_money = 100;
age = 18;
cout<<"money"<<m_money<<" age"<<age<<" funny"<<endl;
}
};
int main(int argc, char *argv[])//用类实例化对象>>Person定义变量
{
Person rex;
//rex.m_money = 200;//err
//cout << rex.m_money << endl;//err
//rex.age = 200;//err
//cout << rex.age << endl;//err
rex.dese();
}
可以通过dese()函数间接访问私有和保护数据
struct和class类的区别:struct默认权限为公有,class的默认权限为私有
Person类的设计![](https://i-blog.csdnimg.cn/blog_migrate/67f805ea9444f716272609f6dda26083.png)
#include <iostream>
#include <string.h>
using namespace std;
class Person{
private:
char m_name[32];//定义类时,不要给成员初始化赋值
int m_age;
public:
//初始化
void initPerson(char* name, int age){
strcpy(m_name, name);
m_age = age;
cout<<"name= "<<m_name<<" age= "<<m_age<<endl;
}
//name写操作
void setname(char* name){
strcpy(m_name, name);
cout<<"name change to "<<m_name<<endl;
}
//name读操作,name是字符串,所以返回值是char
char* getname(){
return m_name;
}
//age写操作
void setage(int age){
if (age>0 && age<100){
m_age = age;
cout<<"age chagne to "<<m_age<<endl;
}
else
cout<<"err"<<endl;
}
//age读操作
int getage(){
return m_age;
}
void show(){
cout<<"name: "<<m_name<<" age: "<<m_age<<endl;
}
};
int main(int argc, char *argv[])//用类实例化对象>>Person定义变量
{
Person rex;//实例化
//对象只能借助公有方法操作数据
rex.initPerson("Rex", 18);
//获取姓名
cout<<"name=="<<rex.getname()<<endl;
//获取年龄
cout<<"age=="<<rex.getage()<<endl;
//修改name
rex.setname("lucy");
//修改age
rex.setage(20);
//遍历
rex.show();
}
注:本文档仅学习总结