一、C语言的结构体
C语言的结构体不允许有函数,定义结构体变量的方法是:
struct 结构体名 结构体变量名;
在C++中,结构体的成员可以有函数,定义结构体变量可以用:
结构体名 结构体变量名;
struct关键字可以不书写。
例子:
#include <stdio.h>
#include <string.h>
struct st_girl
{
char name[50]; // 姓名
int age; // 年龄
int height; // 身高,单位:厘米cm
char sc[30]; // 身材,火辣;普通;飞机场。
char yz[30]; // 颜值,漂亮;一般;歪瓜裂枣。
int show(); // 声明结构体成员函数show,用于显示其它成员变量的值。
};
int main()
{
st_girl stgirl; // struct关键定可以不书写
memset(&stgirl,0,sizeof(stgirl));
strcpy(stgirl.name,"西施");
stgirl.age=22;
stgirl.height=168;
strcpy(stgirl.sc,"火辣");
strcpy(stgirl.yz,"漂亮");
stgirl.show(); // 调用结构体的成员函数
}
int st_girl::show() // 结构体st_girl成员函数的定义
{
printf("name=%s,age=%d,height=%d,sc=%s,yz=%s\n",name,age,height,sc,yz);
}
结果:
二、C++的类和对象
C++把结构体看成了类(class),类的成员可以是变量和函数,通过类定义出来的变量也有特定的称呼,叫做对象。
故可以把上面的代码改为:
#include <stdio.h>
#include <string.h>
class CGirl // 定义超女类
{
public:
char m_name[50]; // 姓名
int m_age; // 年龄
int m_height; // 身高,单位:厘米cm
char m_sc[30]; // 身材,火辣;普通;飞机场。
char m_yz[30]; // 颜值,漂亮;一般;歪瓜裂枣。
int Show(); // 申明显示超女基本信息的成员函数
};
int main()
{
CGirl Girl; // 实例化一个Girl对象
// 访问对象的成员变量,进行赋值
strcpy(Girl.m_name,"武则天");
Girl.m_age=28;
Girl.m_height=168;
strcpy(Girl.m_sc,"火辣");
strcpy(Girl.m_yz,"漂亮");
Girl.Show(); // 调用对象的成员函数
}
int CGirl::Show() // 显示超女基本信息的成员函数体
{
printf("姓名:%s,年龄:%d,身高:%d,身材:%s,颜值:%s。\n",m_name,m_age,m_height,m_sc,m_yz);
}
运行结果:
class是C++的关键字,用于定义类,就像结构体中的sturct。
public也是C++中的关键字,用来修饰class的关键字。
类的成员变量和结构体成员变量一样,也有数据类型和名称。
int CGirl::Show()是类的成员函数的定义,在函数前加上类的名称和两个冒号,表示该函数是CGirl这个类的成员函数,类的成员函数的返回值、参数等语法与普通函数相同。
在C++中,用类定义一个类的变量叫做创建(或实例化)一个对象,成员变量称为类的属性(property),成员函数称为类的方法(method)。
类的成员变量和成员函数的作用域和生命周期与对象的作用域和生命周期相同。
三、对象数组
类可以创建数组对象,就像结构体数组一样。
CGirl Girl[10]; // 定义10个超女类数组
strcpy(Girl[0].m_name,“杨玉环”);
Girl[0].m_age=18;
…
strcpy(Girl[9].m_name,“陈圆圆”);
Girl[9].m_age=21;
四、对象的指针
类是一种自定义的数据类型,对象是内存变量,有内存地址,当然也就有类的指针,就像结构体的指针一样。如下:
CGirl queen;
CGirl *pst=&queen;
通过类指针可以访问对象的成员,书写方法与结构体相同。
(*pointer).memberName
或者:
pointer->memberName
上面的两种写法是等效的,我们通常采用后面的写法,这样更加直观。
五、对象作为函数的参数
与结构体一样,对象可以作为参数传递给函数,最好的方法当然是传递对象的地址。
六、对象的初始化和占用内存的大小
按我们以前的经验,定义的变量使用前要初始化,C语言的基本数据类型可以直接赋值0,字符串和结构体用memset函数初始化,那么类的对象呢?对象不能用memset初始化,具体做法我们以后再介绍。
对象可以用sizeof运算符获取占用内存的大小,但是,在实际开发中,程序员不太关心对象占用内存的大小。
七、小结
在这个阶段,类就像一个有成员函数的结构体,定义的关键字和语法不同,使用方法完全相同。
各位可能会认为类好像没什么用,不用类也可以活得很好,这不一定,因为我先用尽可能简单的方式介绍类的基础知识,如果把实际开发的场景搬到教材中,大家可能接受不了,在实际开发中,某些类的代码非常长,类的声明就有好几页,还不包括成员函数体。