c++高级---C_C++的union的学习笔记总结

C++中的联合(Union):灵活存储多类型数据的利器 联合是一种特殊的数据结构,它允许在相同的内存空间中存储多种不同类型的成员。不同于结构体(Struct),联合的成员共享同一块内存空间。这意味着在给一个联合变量赋值时,只能使用其中的一个成员。int i;float f;char c;在上述示例中,MyUnion是一个联合类型,它包含了intfloat和char三个成员。这三个成员共享同一块内存空间,即改变其中一个成员的值会影响其他成员的值。 阅读详情

转自:http://www.yunsec.net/a/school/ymbc/C/2009/1221/2341.html

联合(union)在C/C++里面见得并不多,但是在一些对内存要求特别严格的地方,联合又是频繁出现,那么究竟什么是联合、怎么去用、有什么需要注意的地方呢?就这些问题,我试着做一些简单的回答,里面肯定还有不当的地方,欢迎指出!


1、什么是联合?
“联合”是一种特殊的类,也是一种构造类型的数据结构。在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,已达到节省空间的目的(还有一个节省空间的类型:位域)。 这是一个非常特殊的地方,也是联合的特征。另外,同struct一样,联合默认访问权限也是公有的,并且,也具有成员函数。


2、联合与结构的区别?
“联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和(空结构除外,同时不考虑边界调整)。而在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。
下面举一个例了来加对深联合的理解。


例4:
#include <stdio.h>
void main()
{
union number
{ /*定义一个联合*/
int i;
struct
{ /*在联合中定义一个结构*/
char first;
char second;
}half;
}num;
num.i=0x4241; /*联合成员赋值*/
printf("%c%c\n", num.half.first, num.half.second);
num.half.first='a'; /*联合中结构成员赋值*/
num.half.second='b';
printf("%x\n", num.i);
getchar();
}
输出结果为:
AB
6261
 

从上例结果可以看出: 当给i赋值后, 其低八位也就是first和second的值; 当给first和second赋字符后, 这两个字符的ASCII码也将作为i 的低八位和高八位。
 

3、如何定义?


例如:
union test
{
test() { }
int office;
char teacher[5];
};


定义了一个名为test的联合类型,它含有两个成员,一个为整型,成员名office;另一个为字符数组,数组名为teacher。联合定义之后,即可进行联合变量说明,被说明为test类型的变量,可以存放整型量office或存放字符数组teacher。


4、如何说明?
联合变量的说明有三种形式:先定义再说明、定义同时说明和直接说明。


以test类型为例,说明如下:
1) union test
{
int office;
char teacher[5];
};
union test a,b; /*说明a,b为test类型*/
2) union test
{
int office;
char teacher[5];
} a,b;
3) union
{
int office;
char teacher[5];
} a,b;


经说明后的a,b变量均为test类型。a,b变量的长度应等于test的成员中最长的长度,即等于teacher数组的长度,共5个字节。a,b变量如赋予整型值时,只使用了4个字节,而赋予字符数组时,可用5个字节。

5、如何使用?
对联合变量的赋值,使用都只能是对变量的成员进行。联合变量的成员表示为:
联合变量名.成员名
例如,a被说明为test类型的变量之后,可使用a.class、a.office
不允许只用联合变量名作赋值或其它操作,也不允许对联合变量作初始化赋值,赋值只能在程序中进行。
还要再强调说明的是,一个联合变量,每次只能赋予一个成员值。换句话说,一个联合变量的值就是联合变员的某一个成员值。

 

以下(包括匿名联合)转自:http://hi.baidu.com/gttyatjqasmpuye/item/688d8a8f5acf4c57e73d1919

C_C++的union的学习笔记总结

  前言

  熟悉C的程序员都知道union(联合体)的用法,利用union可以用相同的存储空间存储不同型别的数据类型,从而节省内存空间。当访问其内成员时可用"."和"->"来直接访问。在C++出现后,它继承了union并保留了其在C中的特性。但是在C++中的union又有了新的扩展,这需要大家了解,要不然你会感到费解和迷惑。下面我讲两点。

  一、在union中存储对象

  在C中union中可以存储任意类型的内置数据类型,那么在C++中union是否可以存储对象呢?还是让我们看一个例子吧,这比任何言语都能说明问题,不是吗?

#pragma warning(disable : 4786)
#include
using namespace std;

class TestUnionClass
{
public:
    TestUnionClass(long l):data_(l)
    {
    };
    int data_;
};

typedef union _tagUtype_
{
    TestUnionClass obj;
}UT;

int main (void)
{
    return 0;
}
  这样不行,union中不可以存储TestUnionClass类的对象,但在C中union可以存储struct呀,为什么不能存储类的对象呢?很简单,请问,在C中union可以存储带有构造函数的struct吗?对了,在C中的struct是没有构造函数的。所以如果C++中union可以存储有构造函数的类的对象就不太符合逻辑,那不是说C++和C完全兼容吗?不错,正因为这一点,C++中union不可以存储有构造函数的类的对象,但是可以存储不带构造函数的类的对象,这样就和C保持一致了,不想信你试试。对TestUnionClass类的声明进行如下修改:
class TestUnionClass
{
public:
    int data_;
};
  再进行编译,一切OK!。但是这样却失去了C++的构造初始化特性,这样做是没有任何意义的,我只是在说其在C++中的语义,并不是推荐大家使用(绝对不推荐)。但是我们可以在union中存储对象的指针,从而引用不同的对象类型。不用我再多说了吧,大家还是试试吧!

  二、类中union的初始化

  由于union的共享内存特点,我们可以使我们的类存储不同的型别而不浪费内存空间,在类中我们可以声明一个union存储不同型别的指针,示例如下:

#pragma warning(disable : 4786)
#include

using namespace std;

class TestUnionClass
{
    enum StoreType{Long,Const_CharP};
    union
    {
        const char* ch_;
        long l_;
    } data_;
   
    StoreType stype_;
    TestUnionClass(TestUnionClass&);
    TestUnionClass& operator=(const TestUnionClass&);

public:
    TestUnionClass(const char* ch);
    TestUnionClass(long l);
    operator const char*() const {return data_.ch_;}
    operator long() const {return data_.l_;}
};

TestUnionClass::TestUnionClass(const char* ch):data_.ch_(ch),stype_(Const_CharP)
{
}

TestUnionClass::TestUnionClass(long l):data_.l_(l),stype_(Long)
{
}

int main (void)
{
    TestUnionClass pszobj("yuankai");
    TestUnionClass lobj(1234);
    cout<(pszobj)<<lobj<<endl;
    return 0;
}
  真是不幸,编译都通不过,好象没有什么问题呀,为什么呢?data_.ch_(ch)和data_.l_(l)有问题吗?如果你问一个C程序员他会告诉你,绝对没问题。你不会去怀疑编译器有问题吧!不好意思!我一开始就是这么想的,真是惭愧。费解,迷惑。让我们来看看构造TestUnionClass对象时发生了什么,这样你就会明白了。当创建TestUnionClass对象时,自然要调用其相应的构造函数,在构造函数中当然要调用其成员的构造函数,所以其要去调用union成员的构造函数,但是其为匿名的,没有构造函数可调用,所以出错。很明显在C++中union和class一样它可以有构造函数,不能如此直接引用其成员。struct同样有这限制。只要我们给其定义一个构造函数什么问题都解决了。示例如下:

class TestUnionClass
{
    enum StoreType{Long,Const_CharP};
    union DataUnion //不能匿名
    {
        DataUnion(const char*); //声明const char*构造函数
        DataUnion(long); //声明long构造函数
        const char* ch_;
        long l_;
    } data_;

    StoreType stype_;
    TestUnionClass(TestUnionClass&);
    TestUnionClass& operator=(const TestUnionClass&);

public:
    TestUnionClass(const char* ch);
    TestUnionClass(long l);
   
    operator const char*() const {return data_.ch_;}
    operator long() const {return data_.l_;}
};

TestUnionClass::TestUnionClass(const char* ch):data_(ch),stype_(Const_CharP)
{//注意data_(ch),这里直接引用data_
}

TestUnionClass::TestUnionClass(long l):data_(l),stype_(Long)
{//注意data_(l),这里直接引用data_
}

TestUnionClass::DataUnion::DataUnion(const char* ch):ch_(ch)
{
}

TestUnionClass::DataUnion::DataUnion(long l):l_(l)
{
}

  现在再编译,如果还不行,你怀疑编译器有问题是有理由的。

  C由于没有类的概念,所有类型其实都可以看作是基本类型的组合,因此在union中包含struct也就是一件很自然的事情了,到了C++之后,既然普遍认为C++中的struct与class基本等价,那么union中是否可以有类成员呢?先来看看如下的代码:

  struct TestStruct
  {
      TestStruct() {}
  };

  typedef union
  {
      TestStruct obj;
  } UT;

  int main (void)
  {
      return 0;
  }

  编译该程序,我们将被告知:
  error C2620: union ‘__unnamed‘ : member ‘obj‘ has user-defined constructor or non-trivial default constructor
  而如果去掉那个什么也没干的构造函数,则一切OK。

  为什么编译器不允许我们的union成员有构造函数呢?我无法找到关于这个问题的比较权威的解释,对这个问题,我的解释是:

  如果C++标准允许我们的union有构造函数,那么,在进行空间分配的时候要不要执行这个构造函数呢?如果答案是yes,那么如果TestStruct的构造函数中包含了一些内存分配操作,或者其它对整个application状态的修改,那么,如果我今后要用到obj的话,事情可能还比较合理,但是如果我根本就不使用obj这个成员呢?由于obj的引入造成的对系统状态的修改显然是不合理的;反之,如果答案是no,那么一旦我们今后选中了obj来进行操作,则所有信息都没有初始化(如果是普通的struct,没什么问题,但是,如果有虚函数呢?)。更进一步,假设现在我们的union不是只有一个TestStruct obj,还有一个TestStruct2 obj2,二者均有构造函数,并且都在构造函数中执行了一些内存分配的工作(甚至干了很多其它事情),那么,如果先构造obj,后构造obj2,则执行的结果几乎可以肯定会造成内存的泄漏。

  鉴于以上诸多麻烦(可能还有更多麻烦),在构造union时,编译器只负责分配空间,而不负责去执行附加的初始化工作,为了简化工作,只要我们提供了构造函数,就会收到上面的error。

  同理,除了不能加构造函数,析构函数/拷贝构造函数/赋值运算符也是不可以加。

  此外,如果我们的类中包含了任何virtual函数,编译时,我们将收到如下的错误信息:
  error C2621: union ‘__unnamed‘ : member ‘obj‘ has copy constructor

  所以,打消在union中包含有构造函数/析构函数/拷贝构造函数/赋值运算符/虚函数的类成员变量的念头,老老实实用你的C风格struct吧!
  不过,定义普通的成员函数是OK的,因为这不会使得class与C风格的struct有任何本质区别,你完全可以将这样的class理解为一个C风格的struct + n个全局函数。

  现在,再看看在类中包含内部union时会有什么不同。看看下面的程序,并请注意阅读程序提示:

  class TestStruct
  {
      union DataUnion
      {
          DataUnion(const char*);
          DataUnion(long);
          const char* ch_;
          long l_;
      } data_;

  public:
      TestStruct(const char* ch);
      TestStruct(long l);
  };

  TestStruct::TestStruct(const char* ch) : data_(ch) // if you want to use initialzing list to initiate a nested-union member, the union must not be anonymous and must have a constructor。
  {
  }

  TestStruct::TestStruct(long l) : data_(l)
  {
  }

  TestStruct::DataUnion::DataUnion(const char* ch) : ch_(ch)
  {
  }

  TestStruct::DataUnion::DataUnion(long l) : l_(l)
  {
  }

  int main (void)
  {
  return 0;
  }

  正如上面程序所示,C++中的union也可以包含构造函数,但是,这虽然被语言所支持,但实在是一种不佳的编程习惯,因此,我不打算对上面的程序进行过多的说明。我更推荐如下的编程风格:

  class TestStruct
  {
      union DataUnion
      {
          const char* ch_;
          long l_;
      } data_;
  
  public:
      TestStruct(const char* ch);
      TestStruct(long l);
  };

  TestStruct::TestStruct(const char* ch)
  {
      data_.ch_ = ch;
  }

  TestStruct::TestStruct(long l)
  {
      data_.l_ = l;
  }

  int main (void)
  {
      return 0;
  }

  它完全是C风格的。

    三、union可以避免c++的类型检查

在阅读到fastdelegate.h中,看到这么一段代码

template <class OutputClass, class InputClass>
union horrible_union
{
    OutputClass out;
    InputClass in;
};

template<class OutputClass, class InputClass>
inline OutputClass horrible_cast(const InputClass input)
{
    horrible_uion<OutputClass, InputClass> u;
    typedef int ERROR_CantUserHorrible_cast[sizeof(InputClass) == zizeof(u) && sizeof(InputClass) == sizeof(OutputClass) ? 1 : -1];
    u.in = input;
    return u.out;
};

这里(强制把input转换成output类型),在函数中使用了一个union来避免C++的类型检查

    四、匿名union在C和C++中使用方法

    main()
    {
          union
           {                   /*定义一个联合*/
               int i;
               struct
                {             /*在联合中定义一个结构*/
                    char first;
                    char second;
               }half;
          };


          i=0x4241;         /*联合成员赋值*/

          half.first='a';   /*联合中结构成员赋值*/

          half.second='b';

           printf("%x\n", i);
         getchar();
     }

上面的例子中,如果是c程序,则无法通过,提示的error: i undeclared identifier;half undeclared identifier。

但如果把此例子保存成c++文件,则可一编译通过,正常运行。

   匿名联合仅仅通知编译器它的成员变量共同享一个地址,而变量本身是直接引用的,不使用通常的点号运算符语法.例如:
     #include <iostream>
     void main()
     {
         union
         {
             int test;
             char c;
         };         
         test=5;
         c='a';
         std::cout<<i<<" "<<c;
     }
    正如所见到的,联合成分象声明的普通局部变量那样被引用,事实上对于程序而言,这也正是使用这些变量的方式.另外,尽管被定义在一个联合声明中,他们与同一个程序快那的任何其他局部变量具有相同的作用域级别.这意味这匿名联合内的成员的名称不能与同一个作用域内的其他一直标志符冲突.
    对匿名联合还存在如下限制:
    因为匿名联合不使用点运算符,所以包含在匿名联合内的元素必须是数据,不允许有成员函数,也不能包含私有或受保护的成员。还有,全局匿名联合必须是静态(static)的,否则就必须放在匿名名字空间中。

    五、c/c++中的union结构的占用空间问题

很多书说union所占用的内存空间大小为其成员中 占用空间最大的成员 所占用的空间大小。这是错误的! 怎么能这么忽悠人呢?为什么我们的技术人员都不把事情说清楚呢?

看一个例子:

struct block
{
    struct block * next;
    char * avail;
    char * limit;
};

union align
{
    struct block b;
    double d;
};
sizeof(align)==?
如果按照书上说的,最大的成员为 struct block b; 它的大小为12个字节(在windows,vc编译器环境下). 但是事实是这样吗? 错!
sizeof(align) == 16.
为什么呢?看下面的分析就知道了。
在上面的例子中, b所占用的字节数是12, d 所占用的为8 , 如果只给align 分配12个字节的空间,那么当存储 double 型的d时,只能存储一个半,这是不行的,(半个算怎么回事?)
所以,必须扩展,再扩展4个字节,这样,即可以储存的下 b,又可以存储 整数倍的 d;
所以,16 就为最后所需要的空间。


    六、几点需要讨论的地方:

    1、联合里面那些东西不能存放?
       我们知道,联合里面的东西共享内存,所以静态、引用都不能用,因为他们不可能共享内存。
    2、类可以放入联合吗?
       我们先看一个例子:
       class Test
       {
       public:
           Test():data(0) { }
       private:
           int data;
       };

      typedef union _test
      {
          Test test;   file://??????/
      }UI;  
      编译通不过,为什么呢?
      因为联合里不允许存放带有构造函数、析够函数、复制拷贝操作符等的类,因为他们共享内存,编译器无法保证这些对象不被破坏,也无法保证离开时调用析够函数。
     3、又是匿名惹的祸??
        我们先看下一段代码:
class test
{
public:
    test(const char* p);
    test(int in);
    const operator char*() const
    {
        return data.ch;
    }
    operator long() const
    {
        return data.l;
    }
private:
    enum type
    {
        Int, String
    };
    union
    {
        const char* ch;
        int i;
    } datatype;
    type stype;
    test(test&);
    test& operator=(const test&);
};

test::test(const char *p):stype(String),datatype.ch(p)
{}

test::test(int in):stype(Int),datatype.l(i)
{}
     看出什么问题了吗?呵呵,编译通不过。为什么呢?难道datatype.ch(p)和datatype.l(i)有问题吗?
     哈哈,问题在哪呢?让我们来看看构造test对象时发生了什么,当创建test对象时,自然要调用其相应的构造函数,在构造函数中当然要调用其成员的构造函数,所以其要去调用datatype成员的构造函数,但是他没有构造函数可调用,所以出错。
     注意了,这里可并不是匿名联合!因为它后面紧跟了个data!

    4、如何有效的防止访问出错?
       使用联合可以节省内存空间,但是也有一定的风险:通过一个不适当的数据成员获取当前对象的值!例如上面的ch、i交错访问。
       为了防止这样的错误,我们必须定义一个额外的对象,来跟踪当前被存储在联合中的值得类型,我们称这个额外的对象为:union的判别式。
       一个比较好的经验是,在处理作为类成员的union对象时,为所有union数据类型提供一组访问函数。

 

C++联合体union用法实例详解 本文实例讲述了C++联合体union用法。分享给大家供大家参考。具体如下: 我们应该按照C中的convention去使用union,这是我这篇文章要给出的观点。虽然C++使得我们可以扩展一些新的东西进去,但是,我建议你不要那样去做,看完这篇文章之后,我想你大概也是这么想的。   C由于没有类的概念,所有类型其实都可以看作是基本类型的组合,因此在union中包含struct也就是一件很自然的事情了,到了C++之后,既然普遍认为C++中的struct与class基本等价,那么union中是否可以有类成员呢?先来看看如下的代码: struct TestUnion {    TestUnion() 立即下载

相关推荐

系统-等保三级-CentOS Linux 7合规基线检查 shell脚本

系统-等保三级-CentOS Linux 7合规基线检查 shell脚本

swindy博客 2407

C_C++的union的学习笔记总结

<br />前言<br />  熟悉C的程序员都知道union(联合体)的用法,利用union可以用相同的存储空间存储不同型别的数据类型,从而节省内存空间。当访问其内成员时可用"."和"->"来直接访问。在C++出现后,它继承了union并保留了其在C中的特性。但是在C++中的union又有了新的扩展,这需要大家了解,要不然你会感到费解和迷惑。下面我讲两点。<br />  一、在union中存储对象<br />  在C中union中可以存储任意类型的内置数据类型,那么在C++中union是否可以存储对象呢?

go_Michael的专栏 1518

SoC验证新思路:除了UVM仿真,你还可以试试Cadence JasperGold的形式化验证

本文深入探讨了Cadence JasperGold形式化验证在SoC设计中的创新应用,对比传统UVM仿真验证,详细解析了其数学穷尽性验证优势。通过实战案例展示了JasperGold在总线协议、时钟域交叉等关键场景的验证方法,并提供了混合验证流程设计与效能优化方案,帮助工程师提升验证效率30%以上。

weixin_30566063的博客 120

C++学习笔记----union

union和和C语言中的union差不多相同,只是在c++中被设计成为了类。要点如下: union不能含有引用类型的成员 可以指定public、private、protected、默认为public union Token{ int a; double b; char c; }; union初始化和使用 Token t={'a'};//初始化c成员 Token t1={5.0};//初始化b成员 t.c='d'; 含有类类型成员的union以及union判别式 当union中含有类类型的成员时

qq_44664843的博客 1754

win2012 r2 + IIS8.5 伪静态设置脚本映射

win2012 r2 + IIS8.5 伪静态设置脚本映射,网站用的.net fromwork 2.0 ,应用程序池设置了32位支持

xueking87的专栏 3239

手把手教你用西门子博图V18配置阿特拉斯PF6000拧紧枪PN通讯(附完整GSD文件与ToolsTalk配置文件)

本文详细介绍了如何使用西门子博图V18配置阿特拉斯PF6000拧紧枪的PN通讯,包括硬件连接、网络参数规划、ToolsTalk软件配置及博图工程设置。通过完整的GSD文件和配置文件,帮助工程师快速实现高精度拧紧设备与PLC的高效通讯,适用于汽车装配和电子制造等工业自动化场景。

weixin_42662293的博客 601

c++ --> union介绍

union介绍   共用体,也叫联合体,在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的。union变量所占用的内存长度等于最长的成员的内存长度。 union与struct比较 先看一个关于struct的例子: struct student { ch...

weixin_30387663的博客 1356

免疫治疗新思路:用COMPASS算法挖掘单细胞数据中的代谢靶点(含差异分析技巧)

本文介绍了如何利用COMPASS算法从单细胞转录组数据中系统推断免疫细胞的代谢活性,为肿瘤免疫治疗提供新的靶点发现思路。文章详细阐述了COMPASS结合流平衡分析的核心原理,并提供了从差异分析到可成药性评估的完整转化路径,旨在帮助研究者精准定位代谢弱点,开发新型免疫代谢疗法。

weixin_29275257的博客 366

C++中Union学习笔记

C++中Union学习笔记 概念 C++ union结构式一种节省空间的特殊的类,一个union可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值,当某个成员被赋值后,其他成员变为未定义状态。 特点 Union中得默认访问权限是public。 可以含有构造函数和析构函数 能够包含访问权限、成员变量、成员函数(可以包含构造函数和析构函数)。 不能包含虚函数和静态数据变量。 它也不能被用作其他类的基类,它本身也不能有从某个基类派生而来。 联合里不允许存放带有构造函数、析够函数、复制拷贝操作符等的类,因

sinat_22078359的博客 421

Ruoyi-Cloud集成Seata2.0实现分布式事务

在网络上,关于Spring Cloud和Ruoyi-Cloud整合Seata的教程有很多,针对不同版本的 Seata 也有不少相关教程。事实上,无论是 Spring Cloud 还是 Ruoyi-Cloud,其整合 Seata 的原理基本相同。这篇博文将详细介绍如何在本地开发环境下,在中实现Seata 2.0的整合,希望能为大家在分布式项目中实现 Seata 的整合提供实用的帮助,提供一个清晰的操作思路。

SR003的博客 2245

最短线性递推式求解与有理函数重建

这一算法来自于我们对“线性递推式拟合”的视角转换,其后得到的算法是自然的。 引理 1. 如果两个有理分式 p1/q1,p2/q2p_1/q_1, p_2/q_2p1​/q1​,p2​/q2​ 均有 deg⁡p<n,deg⁡q≤n\deg p<n, \deg q\leq ndegp<n,degq≤n 且展开式 p1/q1≡p2/q2(modx2n)p_1/q_1 \equiv p_2/q_2 \pmod {x^{2n}}p1​/q1​≡p2​/q2​(modx2n),那么 p1/q1=p2/

Entropy Increaser 的博客 2590

C++ struct 与 union

C++是一种强类型语言。C++程序中的任何变量(或函数)必须遵循“先说明后使用”的原则。定义数据类型有两个方面的作用:一是决定该类型的数据在内存中如何存储,而是决定可对该类型的数据进行哪些合法的运算。...

Doublelv 的博客专栏。 5778

fast-lio运行步骤(使用velodyne数据)

使用fast-lio运行velodyne数据

ericdowney 4769

C、C++中union用法总结

开始的话 已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台。忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市。大家都在纠结这个问题,也希望大家和我讨论讨论。别的先不说了,都工作这么长时间了,还回过头来总结union,确实有点过分,要是和大家说我一直从事于C++开发,还不懂union,大家可能还真的不信。我们每天都在总

ny1986的专栏 4384

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

[Union]C++中Union学习笔记

  C++ union结构式一种特殊的类。它能够包含访问权限、成员变量、成员函数(可以包含构造函数和析构函数)。它不能包含虚函数和静态数据变量。它也不能被用作其他类的基类,它本身也不能有从某个基类派生而来。Union中得默认访问权限是public。联合里不允许存放带有构造函数、析够函数、复制拷贝操作符等的类,因为他们共享内存,编译器无法保证这些对象不被破坏,也无法保证离开时调用析够函数。 ...

weixin_34124577的博客 101

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C 或 C++ 语言union 共用体

C 或 C++ 语言union 共用体

深耕嵌入式领用多年, 致力于分享嵌入式领域技术! 630

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C与C++中的struct与union详解:从基础到高级用法

C语言中的struct:没有权限控制,不能包含成员函数,声明变量时需要使用struct关键字。C++中的struct:可以包含权限设置、成员函数,支持继承,可以省略struct关键字。C与C++中的union:用于存储不同类型的数据,但任意时刻只能存储其中一种类型。C++中的union允许构造函数和成员函数,但不能包含虚函数或静态数据成员。这些代码示例和解释帮助更好地理解struct和union在C和C++中的不同用法。

m0_72877724的博客 512

c++ union 详解

然而,由于所有成员共享相同的内存空间,使用 union 时需要特别注意,以避免未定义行为。union 是 C++ 中的一种数据结构,允许将不同的数据类型存储在相同的内存位置。这意味着一个 union 变量可以存储其中一个成员的值,但不能同时存储多个成员的值。活跃成员:在任何时间点,union 只能存储一个成员的值。内存共享:union 的所有成员共享同一块内存空间,因此任何一个成员的赋值都会影响其他成员的值。内存大小:union 的大小是其最大成员的大小,因为它需要足够的空间来存储最大的成员。

m0_49133355的博客 1006

C/C++联合体(union)完全指南:从内存共享到高级用法

C/C++联合体(union)完全指南:从内存共享到高级用法

楚Y6的博客 952

C++中union的应用剖析

前言熟悉C的程序员都知道union(联合体)的用法,利用union可以用相同的存储空间存储不同型别的数据类型,从而节省内存空间。当访问其内成员时可用"."和"->"来直接访问。在C++出现后,它继承了union并保留了其在C中的特性。但是在C++中的union又有了新的扩展,这需要大家了解,要不然你会感到费解和迷惑。下面我讲两点。一、在union中存储对象在C中union中可以存储任意

简约而不简单 887

C++之extern “C”、struct、class、union、explicit、friend、using、decltype、引用、成员初始化列表

1、extern "C" 被 extern 限定的函数或变量是 extern 类型的 被 extern "C" 修饰的变量和函数是按照 C 语言方式编译和链接的 extern "C" 的作用是让 C++ 编译器将 extern "C" 声明的代码当作 C 语言代码处理,可以避免 C++ 因符号修饰导致代码不能和C语言库中的符号进行链接的问题,因为C语言没有函数重载。 2、struct ...

书山有路勤为径 1574

c++ systemtime类型比较大小_c语言之共用体union、枚举、大小端模式

上一个专题我们详细的分享了c语言里面的结构体用法,读者在看这些用法的时候,可以一边看一边试验,掌握了这些基本用法就完全够用了,当然在以后的工作中,如果有遇到了更高级的用法,我们可以再来总结学习归纳。好了,开始我们今天的主题分享。一、共用体union:1、什么是共用体union? 这个共用体,估计大家平时在代码也比较少见,我去看了一下stm32的例程里面没怎么看到这个用法(下面的示例...

weixin_39631932的博客 507

C语言union联合体:原理、应用与最佳实践

联合体(union)是C语言中一种特殊的数据结构,它允许多个成员共享同一块内存空间。这种内存共享机制使得union在类型转换、内存优化和硬件访问等场景中具有独特优势。从原理上看,union的大小由其最大成员决定,所有成员共享存储空间,修改任一成员都会影响其他成员。在嵌入式开发、协议解析和系统编程中,union常用于实现数据的不同解释方式、节省内存空间以及直接操作硬件寄存器。通过结合位域和结构体,union还能创建灵活的数据结构,如变体类型和状态寄存器。值得注意的是,使用union时需注意内存对齐和成员访问安

anchang7456的博客 335

c++int如何给枚举赋值_c语言之共用体union、枚举、大小端模式

上一个专题我们详细的分享了c语言里面的结构体用法,读者在看这些用法的时候,可以一边看一边试验,掌握了这些基本用法就完全够用了,当然在以后的工作中,如果有遇到了更高级的用法,我们可以再来总结学习归纳。好了,开始我们今天的主题分享。一、共用体union:1、什么是共用体union? 这个共用体,估计大家平时在代码也比较少见,我去看了一下stm32的例程里面没怎么看到这个用法(下面的示例...

weixin_30166691的博客 1446

《高质量程序设计指南——C/C++》第8章 C/C++高级数据类型

第8章 C/C++高级数据类型 8.1 结构(struct) 1.关键字 struct 和 class 的困惑      这是面试时经常被问到的一个问题。当然很多时候问这个问题的人并没有把问题问得准确。例如,有人这样问“结构体”和“类”有什么区别? C语言中的结构体和C++中的类有什么区别? C++中的关键字“struct”和 “class”有什么区别? 其实他们想问的问题可能是一样的,即C

e5Max的专栏 904

Daily-C-Study(3):C语言union关键字

Daily-C-Study(3):C语言union关键字 成于坚持,败于止步 union 关键字的用法与struct 的用法非常类似,但也有很大的不同。 union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。例子如下: union StateMachi...

Ryze的博客 266
上一篇: c++高级---图解:C++中类的内存分布(总结)
下一篇: c++高级---不修改源类访问源类中的私有成员
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值