一、C++结构体的新特征
C语言的结构体不允许有函数,定义结构体变量的方法是:
struct 结构体名 结构体变量名;
struct st_girl supergirl;
在C++中,结构体的成员可以有函数,定义结构体变量可以用:
结构体名 结构体变量名;
struct关键字可以不书写。
如:
st_girl supergirl;
示例
#include<stdio.h> #include<string.h> #include<stdlib.h> struct st_girl { char name[50]; int age ; char sc[30]; char yz[30]; int height; int show(); //声明结构体成员函数show }; int main() { st_girl supergirl; memset(&supergirl,0,sizeof(supergirl)); strcpy(supergirl.name,"MRs.xi"); supergirl.age = 18; strcpy(supergirl.sc,"hot"); strcpy(supergirl.yz,"god"); supergirl.height = 165; supergirl.show(); } int st_girl::show() { printf("name=%s,age=%d,height=%d,sc=%s,yz=%s ",name,age,height,sc,yz); }
最终输出为:
name=MRs.xi,age=18,height=165,sc=hot,yz=god
我们可以看到示例中的 int st_girl::show()
是在主函数后面的,如果我们尝试将其放在前面会如何?
#include<stdio.h> #include<string.h> #include<stdlib.h> struct st_girl { char name[50]; int age ; char sc[30]; char yz[30]; int height; int show(); //声明结构体成员函数show }; int st_girl::show() { printf("name=%s,age=%d,height=%d,sc=%s,yz=%s ",name,age,height,sc,yz); } int main() { st_girl supergirl; memset(&supergirl,0,sizeof(supergirl)); strcpy(supergirl.name,"MRs.xi"); supergirl.age = 18; strcpy(supergirl.sc,"hot"); strcpy(supergirl.yz,"god"); supergirl.height = 165; supergirl.show(); } /* int st_girl::show() { printf("name=%s,age=%d,height=%d,sc=%s,yz=%s ",name,age,height,sc,yz); */
最终编译没有报错,输出未变:
name=MRs.xi,age=18,height=165,sc=hot,yz=god
那么如果放在结构体的前面呢?
最终编译无法通过,并且报错如下(提示未定义show内的变量):
book1.c:5:5: 错误:‘st_girl’未声明 int st_girl::show() ^ book1.c: 在函数‘int show()’中: book1.c:7:50: 错误:‘name’在此作用域中尚未声明 printf("name=%s,age=%d,height=%d,sc=%s,yz=%s ",name,age,height,sc,yz); ^ book1.c:7:55: 错误:‘age’在此作用域中尚未声明 printf("name=%s,age=%d,height=%d,sc=%s,yz=%s ",name,age,height,sc,yz); ^ book1.c:7:59: 错误:‘height’在此作用域中尚未声明 printf("name=%s,age=%d,height=%d,sc=%s,yz=%s ",name,age,height,sc,yz); ^ book1.c:7:66: 错误:‘sc’在此作用域中尚未声明 printf("name=%s,age=%d,height=%d,sc=%s,yz=%s ",name,age,height,sc,yz); ^ book1.c:7:69: 错误:‘yz’在此作用域中尚未声明 printf("name=%s,age=%d,height=%d,sc=%s,yz=%s ",name,age,height,sc,yz);
二、C++ 类和对象
如果修改结构体函数的名称错误,会如何?
将 int st_girl::show() 修改为 int st_girl::show1()
编译提示如下:
book1.c:16:20: 错误:成员函数‘int st_girl::show1()’未在类‘st_girl’中声明 int st_girl::show1() ^
未在类‘st_girl’中声明
C++把结构体看成了类(class),类的成员可以是变量和函数,通过类定义出来的变量也有特定的称呼,叫做对象。
示例:
#include<stdio.h> #include<string.h> #include<stdlib.h> class CGirl { public: char name[50]; int age; int height; char sc[30]; char yz[30]; int show(); }; int CGirl::show() { printf("name=%s,age=%d,height=%d,sc=%s,yz=%s ",name,age,height,sc,yz); } int main() { CGirl girl; strcpy(girl.name,"Mrs.wu"); girl.age = 60; girl.height = 170; strcpy(girl.sc,"bad"); strcpy(girl.yz,"old"); girl.show();//这里调用的时候,要注意使用自己声明的girl 类成员 }
class是C++的关键字,用于定义类,就像结构体中的sturct。
public也是C++中的关键字,各位先忽略它,后面再讲解,先这么抄就行。
类的成员变量和结构体成员变量一样,也有数据类型和名称。
int CGirl::Show()是类的成员函数的定义,在函数前加上类的名称和两个冒号,表示该函数是这个类的成员函数,类的成员函数的返回值、参数等语法与普通函数相同。
在C++中,用类定义一个类的变量叫做创建(或实例化)一个对象,成员变量称为类的属性(property),成员函数称为类的方法(method)。
类的成员变量和成员函数的作用域和生命周期与对象的作用域和生命周期相同。
题目练习(待完成)
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)颜值一般。