zoukankan      html  css  js  c++  java
  • C++中的union

    1:,像任何类一样,union可以指定保护标记使成员成为公用的、私有的或受保护的。默认情况下,union 表现得像 struct:除非另外指定,否则 union 的成员都为 public 成员。

     

    2:union 也可以定义成员函数,包括构造函数和析构函数。但是,union 不能作为基类使用,所以成员函数不能为虚数。

     

    3:union 不能具有静态数据成员或引用成员,而且,union 不能具有定义了构造函数、析构函数或赋值操作符的类类型的成员:

    union test
    {
        int a;
        float b;
        std::string ss;
    };

             定义这样的union会产生编译错误:

    test.cpp:9:14: error: member ‘std::__cxx11::string test::ss’ with constructor not allowed in union
      std::string ss;
                  ^
    test.cpp:9:14: error: member ‘std::__cxx11::string test::ss’ with destructor not allowed in union
    test.cpp:9:14: error: member ‘std::__cxx11::string test::ss’ with copy assignment operator not allowed in union
    test.cpp:9:14: note: unrestricted unions only available with -std=c++11 or -std=gnu++11

     

    4:union 最经常用作嵌套类型,然后定义一个单独的对象跟踪 union 中存储了什么值。这个附加对象称为 union 的判别式。判别式是外围类的一个成员:

    class Token {
    public:
        // indicates which kind of value is in val
        enum TokenKind {INT, CHAR, DBL};
        TokenKind tok;
        
        union { // unnamed union
            char cval;
            int ival;
            double dval;
        } val; // member val is a union of the 3 listed types
    };
    
    Token token;
    switch (token.tok) {
    case Token::INT:
        token.val.ival = 42; break;
    case Token::CHAR:
        token.val.cval = 'a'; break;
    case Token::DBL:
        token.val.dval = 3.14; break;
    }

     

    5:不用于定义对象的未命名 union 称为匿名联合。匿名 union 的成员的名字出现在外围作用域中。例如,使用匿名 union 重写的 Token 类如下:

    class Token {
    public:
        // indicates which kind of token value is in val
        enum TokenKind {INT, CHAR, DBL};
        TokenKind tok;
        union { // anonymous union
            char cval;
            int ival;
            double dval;
        };
    };
    
    Token token;
    switch (token.tok) {
    case Token::INT:
        token.ival = 42; break;
    case Token::CHAR:
        token.cval = 'a'; break;
    case Token::DBL:
        token.dval = 3.14; break;
    }

    因为匿名 union 不提供访问其成员的途径,所以将成员作为定义匿名union 的作用域的一部分直接访问。所以,匿名 union 不能有私有成员或受保护成员,也不能定义成员函数。

  • 相关阅读:
    亨元模式
    模板方法模式
    组合模式
    命令模式
    Android AIDL使用介绍(2)自定义数据类型的传递*
    Android主线程(ActivityThread)源代码分析
    一个简单的死锁代码*
    ABA问题的本质及其解决办法*
    Java 多线程Atomic 与CAS 原理剖析*
    Java并发编程:volatile关键字解析*
  • 原文地址:https://www.cnblogs.com/gqtcgq/p/7270380.html
Copyright © 2011-2022 走看看