现实生活中,关于类和对象最好的例子是自然界的动物类,本文将以此为场景逐步引入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变量。
基于上面的认识,我猜想动物类在内存空间的布局如下: