C++之复合资料型态KU网址第二部V蒐NAY3989

发布于:2024-07-15 ⋅ 阅读:(134) ⋅ 点赞:(0)

结构

结构可存放不同资料型态的数值,例如

#include <iostream>
  
struct Demo {
    int member1;
    char *member2;
    float member3;
};

int main() {
    Demo d;
    d.member1 = 19823;
    d.member2 = "203";
    d.member3 = 3.011;
    
    std::cout << "member1: " << d.member1 << std::endl;
    std::cout << "member2: " << d.member2 << std::endl;
    std::cout << "member3: " << d.member3 << std::endl;
    
    return 0; 
}

第3 行定义一个结构,使用关键字 struct,其后为结构的识别字名称,后面的大括弧宣告结构的成员(member) 。此例的Demo有3 个成员,分别属于int、char *与float

struct Demo {
    int member1;
    char *member2;
    float member3;
};

设定或存取结构的成员可利用小数点运算子 .,此例编译执行结果如下

$ g++ u0705_1.cpp
$./a.out 复制代码
会员1:19823
成员2:203
会员3:3.011
$

若结构的成员为指标,就得利用->运算子存取。

结构其实是预设为public的类别(class) ,因此可加入成员函数(member function) ,例如我们替Demo增加一个member4()

#include <iostream>
  
struct Demo {
    int member1;
    float member2;
    char *member3;
    
    void member4();
};

void Demo::member4() {
    std::cout << "Do something!" << std::endl;
}

int main() {
    Demo d;
    d.member4(); 
    
    return 0;
}

呼叫成员函数同样用小数点运算子,编译执行结果如下


$ g++ u0705_2.cpp
$./a.out 复制代码
做一点事!
$

联合

联合可存放不同资料型态的数值,但是只能有一个成员(member) 被赋值,例如

#include <iostream>
  
union Demo {
    int member1;
    float member2;
    char *member3;
};

int main() {
    Demo d;
    d.member1 = 1;
    d.member2 = 2.0;
    d.member3 = "3";
    
    std::cout << "member1: " << d.member1 << std::endl;
    std::cout << "member2: " << d.member2 << std::endl;
    std::cout << "member3: " << d.member3 << std::endl;
    
    return 0; 
}

第3 行定义一个联合,使用关键字 union,其后为联合的识别字(identifier) 名称,后面的大括弧宣告联合的成员。此例的Demo有3 个成员,分别属于int、float与char 指标

#include <iostream>
  
union Demo {
    int member1;
    float member2;
    char *member3;
};

设定或存取联合的成员可利用小数点运算子 .,此例编译执行结果如下

$ g++ u0706.cpp
$./a.out 复制代码
会员1:124833572
成员2:1.81165e-34
成员3:3
$

我们可以看到只有member3的值是正常的,其他member1与member2由于变成未定义的值,因此印出来的是记忆体位址的残值。

联合其实是一种节省空间的类别(class) ,也可以嵌入类别中当巢状联合(nested union) 或匿名联合(anonymous union) 。


网站公告

今日签到

点亮在社区的每一天
去签到