java基础改学C++(七)结构体、共用体、枚举、类

直接说与 java 的不同点: 

一、结构体

结构体也相当于把几种数据类型组合起来。结构体是值类型,赋值时会直接复制。

 

定义方式:

1、

struct example {

    int num;

};

注意定义完必须有分号,在使用前定义。

2、

struct stu{

    int name;

}stu1,stu2[20]; //声明同时定义变量 stu1、数组 stu2 

3、没有类型名,只需要下面直接定义的俩变量

struct {

    char* name;

} temp1,temp2;

通过 temp1.name 可以取到 name。

4、声明变量时

struct stu var1; 

 

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;//daytue

    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函数里,只有一个传的是引用(指针),才能修改原对象的域。

 

}

 

类的基础东西就先说到这 下节说类的其他东西 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值