作者:Ac_Von

博客地址:http://www.cnblogs.com/vongang/

文章地址:http://www.cnblogs.com/vongang/archive/2011/07/30/2122076.html

结构体能自由组装数据,是一种很常见的数据打包方法。

当我们定义一个结构体后,没有初始化就使用,就会使用到垃圾数据,而且这种错误很难发现。

在编程时对于定义的任何变量,我们最好都先初始化。

除了使用memset和ZeroMemory之外,有没有更简单的方法初始化呢?

因为有时候每定义一个结构体,就使用一次memset,这样很繁琐,同时有时候也需要给结构体中的一些变量赋一些非0的默认值。

我这里总结三种方法,如果大家有什么好的方法,不妨加上去:

1、结构体的构造函数中初始化。

2、继承模板类初始化

3、定义时初始化

一、在结构体构造函数中初始化

在C++中,结构体与类在使用上已没有本质上的区别了,所以可以使用类似构造函数的形式来初始化,如下代码所示:

struct Stu
 {
  int  nNum;
  bool bSex;
  char szName[20];
  char szEmail[100];

//构造函数初始化

  Stu()
  {
nNum = 0;
   bSex = false;
   memset(szName,0,sizeof(szName));
   memset(szEmail,0,sizeof(szEmail));

}

 };

你可能已经发现了,如果结构体中有大量成员,一个个赋值,相当麻烦。那么你可以这样写:

struct Stu
 {
  int  nNum;
  bool bSex;
  char szName[20];
  char szEmail[100];

//构造函数初始化
  Stu()
  {
    memset(this,0,sizeof(Stu)); 
    //或者是下面的格式 
    //memset(&nNum,0,sizeof(Stu));

}
 };

如果在结构体中分配了指针,并且指针指向一个堆内存,那么就在析构函数中释放,以上便是在构造函数中初始化。

二、继承模板类初始化

首先定义一个模板基类:
template <typename T> 
class ZeroStruct 

public: 
    ZeroStruct() 
    { 
        memset(this,0,sizeof(T)); 
    } 
};

之后定义的结构体都继承于此模板类。

struct Stu:ZeroStruct<Stu> 
    { 
        int        nNum; 
        bool    bSex; 
        char    szName[20]; 
        char    szEmail[100]; 
    };

这样也能实现初始化。

三、定义时初始化

struct Stu 
    { 
        int        nNum; 
        bool    bSex; 
        char    szName[20]; 
        char    szEmail[100]; 
    };

//定义时初始化 
Stu stu1 = {0};

在有的结构体中,第一个成员表示结构体的大小,那么就可以这样初始化:

struct Stu
 {
int nSize; //结构体大小
  int  nNum;
  bool bSex;
  char szName[20];
  char szEmail[100];
 };

Stu stu1 = {sizeof(Stu),0};

后面的0,可以省略掉,直接写成:Stu stu1 = {sizeof(Stu)};后面自动会用0填充。

总结分析:

以上三种,是据我所知的初始化结构体方法。

前面两种,实际上已经把结构体给类化了,和类的使用差不多。第三种,是纯粹的结构体的写法。

如果用途仅仅限定为结构体,我建议不要加上构造函数,也不要继承于那个模板类,因为这个时候结构体实际上已经是类了。在定义结构体时,将无法使用第三种方式去初始化,当然,此时也不需要初始化了。

看看微软定义的结构体,基本上都没有构造函数和析构函数。因为结构体的意义很明确,它仅仅是对数据的一个包装,如果加上了方法,其意义就变了。

【2016-08-18】转载:总结C++中几种结构体初始化的方法的更多相关文章

  1. Linux C中结构体初始化

          在阅读GNU/Linux内核代码时,我们会遇到一种特殊的结构初始化方式.该方式是某些C教材(如谭二版.K&R二版)中没有介绍过的.这种方式称为指定初始化(designated in ...

  2. [转]js中几种实用的跨域方法原理详解

    转自:js中几种实用的跨域方法原理详解 - 无双 - 博客园 // // 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同 ...

  3. MFC中的NMHDR结构体和NMUPDOWN结构体

    建立spin控件,创建UDN_DELTAPOS一个消息函数后: void CSpinDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult) { NM ...

  4. C语言中 不定义结构体变量求成员大小

    所谓的求成员大小, 是求成员在该结构体中 用 sizeof(结构体名.结构体成员名) 求来的. 很多时候我们需要知道一个结构体成员中的某个成员的大小, 但是我们又不需要定义该结构体类型的变量(定义的话 ...

  5. C语言中结构体的访问方法解读

    在C语言中,对结构体的访问一般有两种常规方式:"."访问和"->"访问.那么两者有什么区别呢?对C语言有一定了解的同学应该知道,我们新建一个结构体的时候, ...

  6. 剔除list中相同的结构体数据

    剔除list中相同的结构体数据,有三个思路:1.两层循环,逐个比较 2.使用set容器来剔除 3.使用unique方法去重 // deduplication.cpp : 定义控制台应用程序的入口点. ...

  7. 如何系统学习C 语言(中)之 结构体篇

    1,结构体 在前面我们知道变量和数组都可以用来存储数据,变量用来存储单个数据,数组可以用来存储一组同类型的数据,但你有没有发现--它们都只适合单一属性的数据.那现实生活中,很多对象都是具有多属性的.例 ...

  8. Linux2.6 内核中结构体初始化(转载)

    转自:http://hnniyan123.blog.chinaunix.net/uid-29917301-id-4989879.html 在Linux2.6版本的内核中,我们经常可以看到下面的结构体的 ...

  9. 【转载】C#中double.TryParse方法和double.Parse方法的异同之处

    在C#编程过程中,double.TryParse方法和double.Parse方法都可以将字符串string转换为double类型,但两者还是有区别,最重要的区别在于double.TryParse方法 ...

随机推荐

  1. 第三方网站不能调用微信公众平台里的图片了 显示"此图片来自微信公众号平台未经允许不可引用"

    下午ytkah在自己小博客搜索时看到有几篇文章图片显示不了,再访问一些网站时发现有些图片无法显示出来,显示"此图片来自微信公众号平台未经允许不可引用",如下图所示,这个应该是最近微 ...

  2. 【PHP面向对象(OOP)编程入门教程】1.什么是面向对象?

    面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成 ...

  3. linux 模块加载

    错误: rmmod 时提示 rmmod: chdir(xxx): No such file or directory 解决方法: http://blog.csdn.net/luckywang1103/ ...

  4. 优雅地使用Windows

    优雅地使用Windows 理财推荐:收益还行,安全性比余额宝高,只能自己的卡转进转出所以被盗也不怕,重要的是快速取现实时到账呢 1 现金宝 :点击进入现金宝 或者百度现金宝 2 百度理财 8.baid ...

  5. 开源多线程性能测试工具-sysbench

    导读 sysbench是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试.数据库目前支持MySQL/Oracle/PostgreSQL.本文主要演示Mysql测试 ...

  6. [lintcode] Binary Tree Maximum Path Sum II

    Given a binary tree, find the maximum path sum from root. The path may end at any node in the tree a ...

  7. SMT 的基本流程?SMT的工艺流程?SMT的设备操作?

    一.SMT工艺流程------单面组装工艺来料检测 --> 丝印焊膏(点贴片胶)--> 贴片 --> 烘干(固化) --> 回流焊接 --> 清洗 --> 检测 - ...

  8. OLA音频变速算法的仿真与剖析

    前段时间,在尝试音乐节拍数的提取时,终于有了突破性的进展,效果基本上比市面上的许多商业软件还要好,在作节拍数检测时,高频信息作用不大, 通过重采样减小运算量.重采样让我想起了在学校里面做的变速变调算法 ...

  9. php 通过API接口连接12306余票查询

    <?php header("content-type:text/html;charset='utf-8'"); //设置编码 echo "<meta cont ...

  10. 如何区分SNAT和DNAT

    从定义来讲它们一个是源地址转换,一个是目标地址转换.都是地址转换的功能,将私有地址转换为公网地址.要区分这两个功能可以简单的由连接发起者是谁来区分:       内部地址要访问公网上的服务时(如web ...