在C++中将关联的数据和算法封装起来,形成结构体或类。
类(class):完成某一功能的数据和算法的集合,是抽象的概念。
对象:类的实例,具体的概念,是存在于内存中的。
定义格式:class: C++定义类关键字,名字一般以C开头,类中包含类成员方法和类成员属性。
class CPeople {
//定义类成员属性(类成员变量),一般以m_作为开头
string m_strName;//名字
bool m_bSex; //性别
int m_nAge; //年龄
void eat() //类成员方法
{
cout << m_strName << "在吃饭" << endl;
}
void showPeople() //类成员方法
{
cout << "name: " << m_strName << ", sex: " << m_bSex << ",age: " << m_nAge << endl;
}
};
定义类对象格式:类名 类对象的名字。
调用类成员属性和类成员方法的写法:类对象.类成员属性或者类成员方法。
CPeople peo;//类对象
peo.m_strName = "小刘";
peo.eat();//输出结果为小刘在吃饭
注意:在类中定义的类成员属性和类成员方法默认是私有的,想要调用就需要将他们变为共同的,需要在前面加上访问修饰符(public,protected,private),都是关键字。
public:公共的,在类内和类外都可以使用
protected:在类内,和继承中的子类中可以使用
private:在类内使用
修改后的类的代码:
class CPeople {
public:
string m_strName;//定义类成员属性(类成员变量),一般以m_作为开头
bool m_bSex;
int m_nAge;
public:
void eat() {//类成员方法
cout << m_strName << "在吃饭" << endl;
}
void showPeople() {
cout << "name: " << m_strName << ", sex: " << m_bSex << ",age: " << m_nAge << endl;
}
};
如果类成员属性为私有或者是保护的,我们不能在主函数中去初始化,我们就需要利用构造函数去定义类成员属性。
构造函数:写法:类名(){}
如果是编译器提供的默认的,则是无参的,如果是自己手动重构,参数自定,无返回类型(并不是void) 当定义对象时会自动调用构造函数 一个类中构造函数可以有多个,是函数重载的关系,会根据实参自动匹配。
如果手动重构了任何的构造函数,编译器就不会提供默认的构造函数了,默认构造函数:CPeople() {}
CPeople() {//无参
m_bSex = true;
m_nAge = 20;
}
CPeople(string name,int age) {//有参
m_strName = name;
m_bSex = true;
m_nAge = age;
}
在主函数调用时直接使用方法就可以。
CPeople peo2;//自动调用构造函数
peo2.showPeople();
CPeople peo3("小浩", 21);//匹配带参数的构造函数
peo3.showPeople();
一般情况下我们额外申请空间的时候最后回收空间我们需要用delete,当我们在构造函数中new了一个空间后,我们需要使用析构函数。
析构函数,写法:~类名(){}
如果没有手动重构析构函数,编译器会提供一个默认的析构函数~CPeople(){},如果有,则不会提供。
一个类中只有一个析构函数。
作用:用来回收额外申请的空间。
调用析构函数的时间:当对象生命周期结束时,自动调用析构函数,顺序:先调用析构,再回收对象本身的空间,new-delete类型,delete结束为生命周期结束。
例子:
//在类中
CPeople(string name,int age)
{
m_strName = name;
m_bSex = true;
m_nAge = age;
m_pNote = new char[20] {"学生"};
}
~CPeople()
{
if (m_pNote)
{
delete[]m_pNote;
m_pNote = nullptr;
}
}
public:
char* m_pNote;
int main()
{
CPeople peo("小李",20);
cout << "职业为" << peo.m_pNote << endl;
system("pause");
return 0;
}