现实生活中,关于类和对象最好的例子是自然界的动物类,本文将以此为场景逐步引入C++的概念,达到学习的目的。因为C++这门语言本身有很多繁杂的内容,而网上的资源也是参差不齐,有的人见山谈山遇水聊水,有多人故弄玄虚,好比孔乙己说茴香豆的回字有多少种写法,这更加让读者越来越晕。
一、类和对象的基本概念:
场景引入: 基于动物都有年龄、性别,多数的动物都会吃东西的现实,可以设计一个动物类如下:
#include<iostream>
using namespace std;
class Animal
{
public:
int age;//年龄
bool sex;//0:男,1:女
public:
Animal(int age,bool sex)
{
this->age=age;
this->sex=sex;
}
void eating()//吃东西
{
cout<<"aninmal is eating"<<endl;
}
};
void test_fun1()
{
Animal animal1(10,0);
Animal animal2(10,1);
animal1.eating();
animal2.eating();
}
成员分析:使用微软的开发者调试工具,在命令行输入:cl /EHsc -d1reportSingleClassLayoutAnimal main.cpp,查询单个类的布局如下:
基于上面的认识,我猜想动物类在内存空间的布局如下:
静态成员:
现实生活中,总有一些属性属于所有对象共有,因此需要使用static关键字加以声明,因此动物类的定义修改如下:
#include<iostream>
using namespace std;
class Animal
{
public:
int age;//年龄
bool sex;//0:男,1:女
static int group_num;//公用静态成员
public:
Animal(int age,bool sex)
{
this->age=age;
this->sex=sex;
group_num++;
}
void eating()//吃东西
{
cout<<"aninmal is eating"<<endl;
}
static void output_group();//静态成员函数
};
/*静态成员只能在类的外部进行初始化*/
int Animal::group_num =0;//公用的的静态成员在类外初始化
void Animal::output_group()
{
cout<<"group num is:"<<Animal::group_num<<endl;
}
void test_fun1()
{
Animal animal1(10,0);
Animal animal2(10,1);
animal1.eating();
animal2.eating();
Animal::output_group();
}
使用微软的开发者调试工具,在命令行输入:cl /EHsc -d1reportSingleClassLayoutAnimal main.cpp,查询单个类的布局如下,对象的空间占用还是8个字节,但是动物1和动物2有一个共同的group_num变量。
基于上面的认识,我猜想动物类在内存空间的布局如下: