当前位置: 首页 > news >正文

泰安润泽建设工程有限公司网站工作服定制电话

泰安润泽建设工程有限公司网站,工作服定制电话,网站服务类型是什么意思,wordpress 创意【C随笔01】联合体union —— 一种节省空间的类 一、联合体#xff08;union)二、定义三、用法1、定义union、访问union成员2、匿名union3、使用类管理union成员4、管理并销毁string 一、联合体#xff08;union) 联合体是一种特殊的类。一个union可以有多个数据成员#x… 【C随笔01】联合体union —— 一种节省空间的类 一、联合体union)二、定义三、用法1、定义union、访问union成员2、匿名union3、使用类管理union成员4、管理并销毁string 一、联合体union) 联合体是一种特殊的类。一个union可以有多个数据成员但是在任意时刻只有一个数据成员可以有值。在c新标准中含有构造函数或析构函数的类型也可以作为union的成员类型。union的成员都是公有的。与struct相同。 当然union也可以为其成员指定public、protected、private union可以定义包括构造函数和析构函数在内从成员函数。 但是由于union既不能继承自其他类也不能作为基类使用所以在union中不能含有虚函数。 联合体也被叫做共用体 二、定义 定义 union定义的语法如下 c union UnionName {unionMember1 member1;unionMember2 member2;// ... };其中UnionName为该union类型的名称unionMember1、unionMember2等为union的成员可以是任何 C 数据类型包括自定义类型也可以是数组或指针。union的成员占用同一块内存空间它们的大小取决于成员中占用内存最大的类型。 三、用法 1、定义union、访问union成员 可以使用 .和- 运算符来访问union中的成员变量。但需要注意的是不同的成员变量共享同一段内存因此只能同时访问一个成员变量 // demo1 #includeiostream using namespace std;union nameID {int m_id;double m_guid;char m_name[20]; };int main() {nameID myID;cout sizeof(myID) sizeof(myID) endl endl;cout myID.m_id 的地址是 (void*)myID.m_id endl;cout myID.m_guid 的地址是 (void*)myID.m_guid endl;cout myID.m_name 的地址是 (void*)myID.m_name endl endl;myID.m_guid 3;cout myID.m_id myID.m_id endl;cout myID.m_guid myID.m_guid endl;cout myID.m_name myID.m_name endl endl;return 0; }输出 sizeof(myID) 24 myID.m_id 的地址是 000000075FB2F8C8 myID.m_guid 的地址是 000000075FB2F8C8 myID.m_name 的地址是 000000075FB2F8C8 myID.m_id 0 myID.m_guid 3 myID.m_name 2、匿名union 在C11标准中还支持匿名union的声明。这种情况下union没有名称其中的每个成员都可以直接访问不需要指定union名称 // demo2 #includeiostream //#includestring using namespace std; struct nameID {int i;union{int m_id;double m_guid;char m_name;}; };int main() {nameID myID;myID.m_name a;myID.m_guid 3.0;myID.i 8;cout myID.m_id myID.m_id endl;cout myID.m_guid myID.m_guid endl;cout myID.m_name myID.m_name endl endl;cout myID.i myID.i endl endl;return 0; }myID.m_id 0 myID.m_guid 3 myID.m_name myID.i 8 3、使用类管理union成员 对于union来说要想构造或销毁类类型的成员必须执行非常复杂的操作因此我们通常把含有类类型成员的union放在另一个类当中。这个类可以管理并控制与union的类类型成员有关的状态转换。我们的类将定义一个枚举类型的成员来追踪union成员的状态。 demo3 #includeiostream //#includestring using namespace std; class nameID { public:enum nameIDType{ONLY_ID,ONLY_GUID,ONLY_NAME,};nameIDType unionType;union type{int m_id;double m_guid;char m_name;}m_nameID;nameID() :unionType(ONLY_ID), m_nameID(){} };int main() {nameID myID;myID.m_nameID.m_id 8;//myID.unionType nameID::ONLY_ID;cout myID.m_id myID.m_nameID.m_id endl;cout myID.unionType ONLY_ID endl endl;myID.m_nameID.m_name a;//myID.unionType nameID::ONLY_NAME;cout myID.m_name myID.m_nameID.m_name endl;cout myID.unionType ONLY_NAME endl endl;myID.m_nameID.m_guid 3.0;// myID.unionType nameID::ONLY_GUID;cout myID.m_guid myID.m_nameID.m_guid endl;cout myID.unionType ONLY_GUID endl endl;return 0; }myID.m_id 8 myID.unionType ONLY_ID myID.m_name a myID.unionType ONLY_NAME myID.m_guid 3 myID.unionType ONLY_GUID 下面两种写法等价 type 是 union 类型的名称。在这个 union 类型中包含了 int 类型的 m_id、double类型的 m_guid 和 char 数组类型的 m_name。同时m_nameID 是定义在 nameID 类中的一个对象它的类型是 type即上述union 类型。因此m_nameID 可以存储三种不同类型的数据整数、浮点数或者字符串。具体是哪种类型由 nameID 类中的 enum 类型 nameIDType 定义的枚举值决定。 union type {int m_id;double m_guid;char m_name; }m_nameID;union type {int m_id;double m_guid;char m_name; }; type m_nameID;如果不设置unionType只设置m_nameID的值可以吗 在理论上是可以不设置 unionType 而直接设置 m_nameID 的值的。因为 union 类型的成员变量的所有数据成员共享同一个内存空间因此可以通过访问不同的数据成员来改变存储在 union 中的值。但是如果您不设置 unionType 则可能会在读取 m_nameID 成员的值时出现困难因为您无法确定当前 m_nameID 成员中存储的数据类型是什么。所以建议在使用 union 类型时尽可能的设置枚举类型或者其他方式来标识 union 类型中存储的具体数据类型这样能够更加清晰、明确地表达程序的意图并且能够避免由于类型错误引起的问题。 4、管理并销毁string new (m_name) std::string 是 C 中的一个用于在已分配内存上构造对象的语法也称为“定位 new”Placement New。 在默认情况下当我们使用 new 关键字创建一个对象时C 会为该对象分配新的内存然后返回其指针。但有时我们需要在已经分配的内存上构造对象比如在使用共享内存、内存映射文件或者自定义的内存分配器分配内存时。这时我们可以使用定位 new 进行对象的构造。 在这个代码示例中new (m_name) std::string 创建了一个 std::string 对象并将其存储到 m_name 所指向的内存地址。这里用到了 C 中的引用语法 表示获取 m_name 变量的地址。由于 m_name 是 union 的一个成员变量因此它在不同的 unionType 下所表示的含义不同可能作为 std::string、int 或者其他类型的存储位置。通过使用定位 new我们能够在 m_name 所表示的内存位置上创建 std::string 对象而不必重新分配新的内存。 需要注意的是使用定位 new 进行对象构造后在对象生命周期结束之前我们应该手动调用其析构函数进行销毁否则就会导致内存泄漏问题。在这个代码示例中我们在 union 的析构函数中根据 unionType 的值来判断是否需要手动调用 std::string 的析构函数从而正确地销毁内存。 demo4 #includeiostream #includestring using namespace std;class nameID { public:enum nameIDType {ONLY_ID,ONLY_GUID,ONLY_NAME,};nameIDType unionType;union type {int m_id;double m_guid;string m_name;type() noexcept{ new(m_name)string; }~type() {}} m_nameID;// 默认构造函数nameID() : unionType(ONLY_ID), m_nameID() {}// 含参构造函数nameID(int id) : unionType(ONLY_ID) {m_nameID.m_id id;}nameID(double guid) : unionType(ONLY_GUID) {m_nameID.m_guid guid;}nameID(const string name) : unionType(ONLY_NAME) {m_nameID.m_name name;}// 拷贝构造函数nameID(const nameID other) : unionType(other.unionType) {switch (unionType) {case ONLY_ID:m_nameID.m_id other.m_nameID.m_id;break;case ONLY_GUID:m_nameID.m_guid other.m_nameID.m_guid;break;case ONLY_NAME:m_nameID.m_name other.m_nameID.m_name;break;}}// 赋值运算符重载函数nameID operator(const nameID other) {if (this ! other) {unionType other.unionType;switch (unionType) {case ONLY_ID:m_nameID.m_id other.m_nameID.m_id;break;case ONLY_GUID:m_nameID.m_guid other.m_nameID.m_guid;break;case ONLY_NAME:m_nameID.m_name other.m_nameID.m_name;break;}}return *this;}// 析构函数~nameID() {if (ONLY_NAME unionType){m_nameID.m_name.~string();}}// 类型转换函数operator int() const {int res;switch (unionType) {case ONLY_ID:res m_nameID.m_id;break;case ONLY_GUID:res static_castint(m_nameID.m_guid);break;case ONLY_NAME:res 0;break;}return res;}operator double() const {double res;switch (unionType) {case ONLY_ID:res m_nameID.m_id;break;case ONLY_GUID:res m_nameID.m_guid;break;case ONLY_NAME:res 0.0;break;}return res;}operator string() const {string res;switch (unionType) {case ONLY_ID:res to_string(m_nameID.m_id);break;case ONLY_GUID:res to_string(m_nameID.m_guid);break;case ONLY_NAME:res m_nameID.m_name;break;}return res;} };int main() {nameID id1(123);nameID id2(3.14);nameID id3(Alice);cout static_castint(id1) endl; // 输出123cout static_castdouble(id2) endl; // 输出3.14cout static_caststring(id3) endl; // 输出AlicenameID id4 id3;cout static_caststring(id4) endl; // 输出Aliceid4 id2;cout static_castdouble(id4) endl; // 输出3.14return 0; }也可以看看下面的写法 class nameID { public:enum nameIDType {ONLY_ID,ONLY_GUID,ONLY_NAME,};nameIDType unionType;union type {int m_id;double m_guid;string* m_name;type(int id) : m_id(id) {}type(double guid) : m_guid(guid) {}type(const string name) : m_name(new string(name)) {} // 在 type 的构造函数中创建新的 string 对象~type() { delete m_name; } // 在 type 的析构函数中释放资源} m_nameID;// 默认构造函数nameID() : unionType(ONLY_ID), m_nameID(0) {}// 含参构造函数nameID(int id) : unionType(ONLY_ID), m_nameID(id) {}nameID(double guid) : unionType(ONLY_GUID), m_nameID(guid) {}nameID(const string name) : unionType(ONLY_NAME), m_nameID(name) {}// 拷贝构造函数nameID(const nameID other) : unionType(other.unionType), m_nameID(other.m_nameID) {if (unionType ONLY_NAME m_nameID.m_name ! nullptr) {m_nameID.m_name new string(*other.m_nameID.m_name); // 在拷贝构造函数中创建新的 string 对象}} }
http://www.yutouwan.com/news/423802/

相关文章:

  • 软件培训网站管理公司网站一般做什么
  • 长白山开发建设集团网站小程序代理招商公司
  • 广州建网站哪家最好手机网银怎么开通
  • 如何绑定网站域名宁波建筑公司排名
  • 婚纱摄影网站制作设计房子的软件免费
  • 安徽龙山建设有限公司网站网站首页设计创意
  • 学校网站首页设计怎样创造网站
  • 去年做那些网站能致富单位做网站怎么做
  • 信誉好的邢台做网站石家庄市住房和城乡建设局官方网站
  • 平台网站建设合同上海最好网站建设公司
  • 怎么更改网站名称我的网站为什么
  • 广州市提取住房补贴建设银行网站福州小程序开发公司
  • 如何做社团网站邯郸网站制
  • 潍坊 企业网站建设西安分类信息网站
  • 网站制作报价开网址是什么
  • 网站建设合同怎么交印花税做商城网站在哪里注册营业执照
  • 个人dw网页设计seo综合查询接口
  • 综合门户类网站有哪些张店易宝网站建设
  • 广州做网站哪个公司做得好汕尾网站建设公司
  • 做网站成功的企业如何让网站长尾关键词有排名
  • 手机网站建设代码昆明seo
  • 东莞高端模板建站e福州怎么代缴医保
  • 中山小榄网站线上营销平台
  • 网站建设技术有哪些网络整合营销4i原则
  • 怎么把网站横幅做很大大气网站首页模板
  • qingdao城乡住房建设厅网站wdcp创建wordpress
  • 网站首页不收录中文字幕mv在线观看
  • 承德工程建设信息网站网站建设主要营销内客
  • 网站改名工信部需要怎么做软文范例200字
  • 西安网站建设费用北京网站建设策划解决方案