C++ 进阶 C/C++ Struct

前言:

学习从来都不是单调的,从书本学来的永远都是游离于水面的浮游,只有从实践中去摸索和感受,才能加深理解,才能记忆更加的深刻,这也是为什么我在进入MFC学习阶段还会回过头来做C++基础的笔记。因为在学习MFC的过程中,能够加强我对C++的理解,一个Struct并不是字面上的结构体那么简单,通过看到不理解,然后自己亲自去花时间实践,并得出自己的结论,这就是一个学习的过程。

全文基于该大神解析

https://www.cnblogs.com/qyaizs/articles/2039101.html

代码部分
#main.cpp
extern "C" {
#include "structs.h"
}
using namespace std;

struct StuMaqi {
    string name;
} mQ = {"mQ"};

//直接申明的结构体变量
struct {
    char * name;
} NULLS_;

//调用   
   typedef myStru_ myStru__;
    myStru__ myStru;
    myStru.iNum = 98;
    myStru.lLength = 99;
    mQ.name = "mQ_";
    cout << "mQ_.name==" << mQ.name << endl;
    char nulls_[] = "NULLS_";
    NULLS_.name =nulls_;
    cout << NULLS_.name << "**************" << NULLS_.name << endl;

    StuSer user;
    char username[] = "C++user";
    user.name = username;
    cout << "******user.name *********" << user.name << endl;
    tagMyStruct varName;
    varName.iNum = 100;
    varName.lLength = 101;
    MyStruct aStruct;
    aStruct.iNum = 102;
    aStruct.lLength = 103;
    tagMyStruct tagStruc;
    tagStruc.iNum = 104;
    tagStruc.lLength = 105;
    cout << "******myStru__*********" << endl;
    cout << myStru.iNum << "**************" << myStru.lLength << endl;
    cout << "******tagMyStruct*********" << endl;
    cout << varName.iNum << "**************" << varName.lLength << endl;
    cout << "******aStruct*********" << endl;
    cout << aStruct.iNum << "**************" << aStruct.lLength << endl;
    cout << "******tagStruc*********" << endl;
    cout << tagStruc.iNum << "**************" << tagStruc.lLength << endl;

    shwoStruc();
structs.h

typedef struct tagMyStruct {
    int iNum;
    long lLength;
} MyStruct;

// multiple definition of `uSer'
//struct StuSer {
//    const char *name;
//}  uSer = {"mQ"};

struct StuSer {
    char *name;
} StuE;

//直接申明的结构体变量
struct {
    char * nULLSname;
} NULLS;

typedef struct {
    int iNum;
    long lLength;
} MyStruct2, myStru_;

void shwoStruc();

structs.c



#include <stdio.h>
#include <stdlib.h>
#include "structs.h"

void shwoStruc() {
//error: unknown type name 'tagMyStruct'
//    tagMyStruct asdas;
    struct tagMyStruct newTagStrcu;
    newTagStrcu.iNum = 1000001;
    newTagStrcu.lLength = 1000002;
    MyStruct aStruct__;
    aStruct__.iNum = 1000009;
    aStruct__.lLength = 1000010;
    typedef MyStruct aStruct_;
    aStruct_ aStruct;
    aStruct.iNum = 1000003;
    aStruct.lLength = 1000004;
    typedef myStru_ myStru__;
    myStru__ myStru;
    myStru.lLength = 1000005;
    myStru.lLength = 1000006;
    typedef MyStruct2 myStru___;
    myStru___ myStrus;
    myStrus.lLength = 1000007;
    myStrus.lLength = 1000008;
    struct StuSer user;
    user.name = "user";
    NULLS.nULLSname = "NULLS";
    printf("****** aStruct__*********\n");
    printf("****** iNum = %d lLength = %d*********\n", aStruct__.iNum, aStruct__.lLength);
    printf("****** newTagStrcu*********\n");
    printf("****** iNum = %d lLength = %d*********\n", newTagStrcu.iNum, newTagStrcu.lLength);
    printf("****** aStruct*********\n");
    printf("****** iNum = %d lLength = %d*********\n", aStruct.iNum, aStruct.lLength);
    printf("****** myStru*********\n");
    printf("****** iNum = %d lLength = %d*********\n", myStru.iNum, myStru.lLength);
    printf("****** myStrus*********\n");
    printf("****** iNum = %d lLength = %d*********\n", myStrus.iNum, myStrus.lLength);
    printf("****** user*********\n");
    printf("****** name = %s \n", user.name);
    printf("******  NULLS.nULLSname = %s \n",  NULLS.nULLSname);
}
输出:

mQ_.name==mQ_
NULLS_**************NULLS_
******user.name *********C++user
******myStru__*********
98**************99
******tagMyStruct*********
100**************101
******aStruct*********
102**************103
******tagStruc*********
104**************105
****** aStruct__*********
****** iNum = 1000009 lLength = 1000010*********
****** newTagStrcu*********
****** iNum = 1000001 lLength = 1000002*********
****** aStruct*********
****** iNum = 1000003 lLength = 1000004*********
****** myStru*********
****** iNum = 1878006336 lLength = 1000006*********
****** myStrus*********
****** iNum = 2686536 lLength = 1000008*********
****** user*********
****** name = user
******  NULLS.nULLSname = NULLS
总结:

1.在C和C++中都适用

typedef struct structTagName{
}valueName;

struct structName{
} 

typedef struct{
} structName, structName;

只在C++适用 :这里的mQ就是变量名,也可以初始化

struct structName{
    string name;
} mQ = {"mQ"};
//当在C中则报错: multiple definition of `mQ'
但是可以只申明StuE这个变量
struct StuSer {
    char *name;
} StuE;

C/C++类似 但用法不同:注意一个有typeof 一个没有,只是写法类似。

//在C中 表示的都是结构体
typedef struct structTagName{

} structName, structName;

//在C++ ','后面表示的都是变量名
struct structName{

} structName, valueName;

//用法上:
//C:
//structTagName必须加上struct关键字
       struct tagMyStruct newTagStrcu;
//structName 
       MyStruct aStruct;
//或者加上 typedef
    typedef MyStruct aStruct_;
    aStruct_ aStruct;   
//C++中:
//直接使用 struct可加可不加
 tagMyStruct varName;
//对于structTagName和structName区别不明显 如下:
 tagMyStruct tagStruc;
 MyStruct aStruct;

C与C++用法总结

在C中,这个申明后申请结构变量的方法有两种:

(1struct tagMyStruct 变量名
 (1-1)  typedef myStru_ myStru__;
        myStru__ myStru;
(2)MyStruct 变量名
在c++中可以有

(1struct tagMyStruct 变量名

(2)MyStruct 变量名

(3)tagMyStruct 变量名

最后还有个结构体变量,顾名思义 就是个变量。

struct {
    char * nULLSname;
} NULLS;
个人经验总结:
struct structName{}valueName
valueName就是变量名

typedef struct {} structName, structName;
structName都是类型名 需要初始化

typedef struct tagStructName {} valueName;
valueName 就是变量名 
tagStructName 需要使用struct初始化如:
struct tagStructName valueName;

//直接申明的结构体变量
struct { } valueName; 

然而 对于C++以上情况,除了完美继承之外,统统可以视为一种情况即:
tagStructName  valueName 都可直接作为类型名,初始化变量。

除此之外C++默认支持初始化 如:
struct structName{
    string name;
} mQ = {"mQ"};

ps:以上就是个人对于C/C++ Struct的全部理解,感觉个人总结的比较粗糙,想进一步加强理解就直接将代码拷贝过去,试着删除struct 或者添加个typeof ,然后自己运行一遍,什么都明白了。

猜你喜欢

转载自blog.csdn.net/qq_20330595/article/details/82586515
今日推荐