文章目录
一、C++结构体的新特征
C语言的结构体不允许有函数,定义结构体变量的方法是:
struct 结构体名 结构体变量名;
在C++中,结构体的成员可以有函数,定义结构体变量可以用:
结构体名 结构体变量名;
struct关键字可以不书写。
示例(book202.c)
/*
* 程序名:book202.cpp,此程序用于演示C++结构体的新特征。
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#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);
}
运行效果
在定义成员函数的时候,要写出是谁的成员函数,比如
st_girl::show(),show()是st_girl的要写出来。
二、C++ 类和对象
我们先来做一个测试,修改一下book202.cpp的内容。
int st_girl::show() // 结构体st_girl成员函数的定义
改为
int st_girl::show1() // 结构体st_girl成员函数的定义
修改后再编译。
上图中,方框内的文字“未在类st_girl中声明”?我明明写的是一个结构体,怎么成了类?
C++把结构体看成了类(class),类的成员可以是变量和函数,通过类定义出来的变量也有特定的称呼,叫做对象。
示例(book205.cpp)
/*
* 程序名:book205.cpp,此程序演示用类的基本概念。
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#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);
}
运行效果
解释一下book205.cpp。
class是C++的关键字,用于定义类,就像结构体中的sturct。
public也是C++中的关键字,各位先忽略它,后面再讲解,先这么抄就行。
类的成员变量和结构体成员变量一样,也有数据类型和名称。
int CGirl::Show()是类的成员函数的定义,在函数前加上类的名称和两个冒号,表示该函数是这个类的成员函数,类的成员函数的返回值、参数等语法与普通函数相同。
在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
上面的两种写法是等效的,我们通常采用后面的写法,这样更加直观。
五、对象作为函数的参数
与结构体一样,对象可以作为参数传递给函数,最好的方法当然是传递对象的地址。
对象作为参数传递给函数,调用函数是不能直接访问对象的属性的,例如:
int show(queen *prettyGril)
{
printf("对象作为参数\n");
printf("%s身材%s\n",prettyGirl->name,prettyGirl->sc);
//prettyGril->show();
return 0;
}
要通过类中的成员函数去访问修改对象的属性
int show(queen *prettyGril)
{
printf("对象作为参数\n");
prettyGril->show();
return 0;
}
show()是对象中的成员函数
class queen
{
public:
char name[31];
int age;
double height;
char sc[31];
int show();
};
所以记得要通过类中的成员函数去修改访问对象的属性。
在对类中的成员函数进行定义声明时,要指出是哪个类的。
在调用成员对属性进行操作时,不用再带上对象名
因为在调用时,已经说明是这个对象的了
Girl.Show(); // 调用对象的成员函数
int CGirl::Show() // 显示超女基本信息的成员函数体
{
printf("姓名:%s,年龄:%d,身高:%d,身材:%s,颜值:%s。\n",m_name,m_age,m_height,m_sc,m_yz);
}
这里不用再写对象了,不用写成这样
Girl.m_name
这样会报错的。
六、对象的初始化和占用内存的大小
按我们以前的经验,定义的变量使用前要初始化,C语言的基本数据类型可以直接赋值0,字符串和结构体用memset函数初始化,那么类的对象呢?对象不能用memset初始化,具体做法我们以后再介绍。
对象可以用sizeof运算符获取占用内存的大小,但是,在实际开发中,程序员不太关心对象占用内存的大小。
七、小结
在这个阶段,类就像一个有成员函数的结构体,定义的关键字和语法不同,使用方法完全相同。
各位可能会认为类好像没什么用,不用类也可以活得很好,这不一定,因为我先用尽可能简单的方式介绍类的基础知识,如果把实际开发的场景搬到教材中,大家可能接受不了,在实际开发中,某些类的代码非常长,类的声明就有好几页,还不包括成员函数体。
希望各位保持好的心态,循序渐进的学习。
八、面向对象编程(Object Oriented Programming,OOP)
类是一个通用的概念,C++、Java、C#、PHP等很多编程语言中都支持类,都可以通过类创建对象。因为 C++、Java、C#、PHP等语言都支持类和对象,所以使用这些语言编写程序也被称为面向对象编程,这些语言也被称为面向对象的编程语言。C语言因为不支持类和对象的概念,被称为面向过程的编程语言,有点欺负人。
在C语言中,我们会把重复使用或具有某项功能的代码封装成一个函数,而在C++中,多了一层封装,就是类(class),不要小看类(class)这一层封装,它有很多特性,极大地提高了程序员的开发效率。
面向对象编程在程序执行的效率上没有任何优势,它的主要目的是方便程序员组织和管理代码,快速梳理编程思路。
九、课后作业
1)编写程序,测试对象数组、对象指针、对象作为函数的参数的用法。
2)参照book205.cpp程序,增加一个成员函数Level,Level函数根据超女资料,判断超女的级别,级别的判断标准如下:
妃子:(1)年龄18-25岁;(2)身高165-178cm;(3)身材火辣;(4)颜值漂亮。
宫女:(1)年龄18-30岁;(2)身高160-165cm;(3)身材火辣或者普通;(4)颜值一般。
杂役:(1)年龄35-40岁;(2)身高155-165cm;(3)身材普通或者飞机场;(4)颜值一般。
十、版权声明
C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。
来源:C语言技术网(www.freecplus.net)
作者:码农有道
如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发我的文章,谢谢!!!
如果文章有错别字,或者内容有错误,或其他的建议和意见,请您留言指正,非常感谢!!!