java基础改学C++(七)结构体、共用体、枚举、类
直接说与java的不同点:
一、结构体(现在先把他当作类对待)
0、结构体类型只是一种数据类型,不占内存空间,只有定义其变量时才开辟内存空间。
struct Student { int name ;}; //可以定义
1、注意 类型定义完必须有;分号 ,在使用前定义。
#include <iostream>
#include <cmath>
using namespacestd;
//定义方式:
//1、
struct example {
int num;
};
//2、
struct stu{
int name;
}stu1,stu2[20];//声明同时定义变量
//3、没有类型名,只需要下面直接定义的俩变量
struct {
char* name;
}temp1,temp2;
//4、定义一个东西代替,简化代码
#define STRUCT struct student // 编译前简单替换
STRUCT {
char c[20];
char *p;
};
STRUCT s1,s2[2];
int main(){
// 5、在main里也能定义(想象成内部类就OK)
struct ba {
int id;
char *p;
}abc[3]{{5,"s"},{23}},cba[]{2,"s"};
//相当于直接 ba abcd[3]{5,"s",23};
//!!结构体类型的变量在内存中依照其成员的顺序顺序顺序顺序顺序排列,所占内存空间的大小是其全体成员所占空间的总和
// 编译时,仅对变量分配空间,不对类型分配空间,所以:
int length =sizeof(stu);
//length = 4
stu s ;
s.name =10;
ba b{10,"wocao" };
ba cc{20};
cc = b;
// 同类型的结构体变量之间可以直接赋值。这种赋值等同于各个成员的依次赋值,这个性质产生了结构体与类的区别:类是引用传递,结构体是值传递!!!值传递!!
// 结构体变量的指针
ba * p = &b;
(*p).id =100;
//p->num和(*p).num等价:
p->id =1000;
/*
将一个结构体变量中的数据传递给另一个函数,有下列3种方法:
(1)用结构体变量名作参数,将实参值传给形参,一般较少用这种方法(时间和空间开销大)。
(2)用指向结构体变量的指针作实参,将结构体变
量的地址传给形参。
(3)引用变量。放到类里面说,都一样的
*/
二、共用体
C++语言中,允许不同的数据类型使用同一存储区域,即同一存储区域由不同类型的变量共同表示。这种数据类型就是共用体。
定义:
几个特点:
其实共用体存在的原因是 以前电脑内存小,每一点内存都得充分利用,有人就想出来这个方法。。。来让一块内存存更多东西。现在真的是不需要了。。所以共用体的知识可以略过 个人觉得真没用了
看看下面的图demo,能不能看懂共用体的精髓:公用一块区域 观察a的值、内存变化
三、枚举没什么好说的 java也有 但java里只能定义在类里,这个没要求。
坑爹的是 C++还是得在使用前定义。。学java的好不习惯啊==
enum weekday {sun, mon, tue, wed, thu, fri, sat};
变量:
weekday day = (weekday)2;//day是tue
weekday week =weekday::sun;
if (day>week) {
cout<<day<<endl;//输出的是序号
day = week;
}
四、typedef 定义类型名 而已
typedef 已定义的类型 新的类型 :
//typedef:编译时处理,定义一个类型替代原有的类型。
typedef double REAL;
REAL bd =12.1;
typedefstruct student{
int name;
} STRUC ; //还记得上面的 #define STRUCT struct stu吗,这个其实和那个一样的==
STRUC a,*pp;
a.name =10;
pp = &a;
typedefchar * CHAR_P;
CHAR_P char1,char2 ="dasdaw";
// 重点看看下面这个定义:
typedefchar STRING[80];
STRING s1,s2,s3;
// 定义过程:
也可以想成: typedef int I 定义 int 是I;则定义长度100的int数组是: typedef int[100] IN
但是C++数组不允许这样(java数组可以这样。。。)所以改成 typedef int IN[100] ----
最后说明:
}
五、 类 。
protected限定的成员称为保护成员,只允许在类内及该类的派生类中使用保护的数据或函数
不加标志符就是默认 private,而结构体类型成员的默认权限是public
在定义类时,只是定义了一种数据类型,即说明程序中可能会出现该类型的数据,并不为类分配存储空间。只有在定义了属于类的变量后,系统才会为类的变量(对象)分配空间
class A
{ float x, y;
public:
voidSetxy(floata,float b)
{ x=a; y=b; }
类中直接定义的函数体,如果很简单,在编译时自动作为内联函数来实现
void Print(void)
{ cout<<x<<‘\t’<<y<<endl; }
}a1,a2;
可以把方法定义在外面,类里面只声明方法(让类的成员一目了然):
class A{
float x, y;
public:
voidSetxy(floata,float b);
void Print(void);
};
void A::Setxy(floata,float b)
{ x=a; y=b; }
void A::Print(void)
{ cout<<x<<‘\t’<<y<<endl; }
类外定义的函数体,加inline,有可能在编译时作为内联函数来实现//详细见我内联函数那一节
提醒一下 ->这个符号最常用,但是学java的习惯用 . 得适应 == 但是!!!这里的 . 不是和java一样的,先看demo:
class stu{
public :
int name;
void print(){
cout<<name;
}
};
void fuck(stu s){
s.name =100;
}
void fuck1(stu& s1){
s1.name =100;
}
int main(){
stu s;
s.name =10;
fuck(s);
cout<<s.name<<endl;
(由于还没说到 new运算符,现在先用 & 符号)
stu &s1 = s; //引用类型变量,类比于指针变量学习--
fuck1(s1);
cout<<s1.name<<ends;
输出 10 100 原因是 C++的引用类型变量 是 stu & s ;也就是说 上面两个fuck函数里,只有一个传的是引用(指针),才能修改原对象的域。
}