一、类的内存空间
类的空间大小计算与结构体一致,都是根据内存对齐(字节对齐)原则,每次分配都是按照结构体中数据类型最大的字节数分配,结构体大小也和顺序有关。
//类
class test
{
public:
char a;
protected:
short c;
private:
int b;
float d;
}; // 12 个字节
1、类的大小与数据成员属性无关(public,protect,private)。
2、数据成员的空间是从上往下分配的,与属性无关
3、类的大小与成员函数无关,只与数据成员有关。(函数在未调用前是不分配空间的)。
二、类成员的函数类外编写
在类外使用类内的函数时必须加上::以表示是在类内空间访问的。(类名::函数名)。而且必须为public权限才行。
//设计一个文件管理类
class File
{
public:
File(); //声明一个构造函数
File(const char *file); //带参数的构造函数
~File(); //声明一个析构函数
private:
FILE *fp;
};
//构造函数
File::File()
{
cout << "无操作文件" << endl;
}
File::File(const char *file)
{
this->fp = fopen(file,"r+");
if(this->fp == NULL)
{
perror("");
}else
{
cout << "初始化文件成功" << endl;
}
}
//析构函数
File::~File()
{
fclose(fp);
}
三、类的组合
一个类中包含另一个类,比如一个人养了一只猫,人包含猫。相当于一个结构体包含另一个结构体。
人有:姓名,性别,年龄。
猫有:品种,颜色,年龄。
#include <iostream>
#include <string.h>
using namespace std;
//设计猫类
class cat
{
public:
cat(const char *Varieties="土猫",const char *color="黑色",int age=0):age(age)
{
strcpy(this->Varieties,Varieties);
strcpy(this->color,color);
}
//设计一个显示接口
void show()
{
cout << Varieties << " 颜色:" << color << " 年龄:" << age << endl;
}
private:
char Varieties[1024];
char color[20];
int age;
};
//设计一个人类
class person
{
public: //直接在参数列表中初始化这个猫,这样可以使用猫类
person(const char *name,const char *sex,int age,cat m):age(age),mao(m)
{
strcpy(this->name,name);
strcpy(this->sex,sex);
}
//显示这个人的所有信息,包括他养的猫
void show()
{
cout << "姓名" << name <<endl;
cout << "性别" << sex <<endl;
cout << "年龄" << age <<endl;
cout << "宠物:";
//显示宠物信息
mao.show();
}
private:
char name[1024];
char sex[10];
int age;
//人养了一只猫
cat mao; //私有成员定义一个猫类
};
int main()
{
//定义一只猫
cat mao("加菲猫","橘黄色",3);
//定义一个人对象
person xm("小明","男",18,mao); //直接将猫类对象传递到构造函数中初始化
xm.show();
}
重点:如何在类与类中相互调用数据?
可以在主函数中获取另一个类的对象作为自己的参数进行传递,但要在私有成员里先声明该类才能初始化。