《C++那些事》项目概要及一文彻底搞懂C和C++中struct

  • 2019 年 10 月 6 日
  • 筆記

一文搞懂C和C++中struct

最近一直在更新一个仓库:《C++那些事》,将自己学习的难点与重点罗列进去,并配上相关代码,实践与理论结合。

仓库地址:

https://github.com/Light-City/CPlusPlusThings

点击原文也可跳转,如果觉得不错,麻烦点个star!

目前C++那些事更新文章如下:

1.C中struct

  • 在C中struct只单纯的用作数据的复合类型,也就是说,在结构体声明中只能将数据成员放在里面,而不能将函数放在里面。
  • 在C结构体声明中不能使用C++访问修饰符,如:public、protected、private 而在C++中可以使用。
  • 在C中定义结构体变量,如果使用了下面定义必须加struct。
  • C的结构体不能继承(没有这一概念)。
  • 若结构体的名字与函数名相同,可以正常运行且正常的调用!例如:可以定义与 struct Base 不冲突的 void Base() {}。

完整案例:

#include<stdio.h>    struct Base {            // public      int v1;  //    public:      //error          int v2;      //private:          int v3;      //void print(){       // c中不能在结构体中嵌入函数      //    printf("%sn","hello world");      //};    //error!  };    void Base(){      printf("%sn","I am Base func");  }  //struct Base base1;  //ok  //Base base2; //error  int main() {      struct Base base;      base.v1=1;      //base.print();      printf("%dn",base.v1);      Base();      return 0;  }  

最后输出:

1  I am Base func  

完整代码见:github

2.C++中struct

与C对比如下:

  • C++结构体中不仅可以定义数据,还可以定义函数。
  • C++结构体中可以使用访问修饰符,如:public、protected、private 。
  • C++结构体使用可以直接使用不带struct。
  • C++继承
  • 若结构体的名字与函数名相同,可以正常运行且正常的调用!但是定义结构体变量时候只用用带struct的!

例如:

情形1:不适用typedef定义结构体别名

未添加同名函数前:

struct Student {    };  Student(){}  Struct Student s; //ok  Srudent s;  //ok  

添加同名函数后:

struct Student {    };  Student(){}  Struct Student s; //ok  Srudent s;  //error  

情形二:使用typedef定义结构体别名

typedef struct Base1 {      int v1;  //    private:   //error!          int v3;      public:     //显示声明public          int v2;      void print(){          printf("%sn","hello world");      };  }B;  //void B() {}  //error! 符号 "B" 已经被定义为一个 "struct Base1" 的别名  

前三种案例

#include<iostream>  #include<stdio.h>    struct Base {      int v1;  //    private:   //error!          int v3;      public:     //显示声明public          int v2;      void print(){          printf("%sn","hello world");      };  };    int main() {      struct Base base1;  //ok      Base base2; //ok      Base base;      base.v1=1;      base.v3=2;      base.print();      printf("%dn",base.v1);      printf("%dn",base.v3);      return 0;  }  

完整代码见:github

继承案例

#include<iostream>  #include<stdio.h>  struct Base {      int v1;  //    private:   //error!          int v3;      public:   //显示声明public          int v2;      virtual void print(){          printf("%sn","Base");      };  };  struct Derived:Base {        public:          int v2;      void print(){          printf("%sn","Derived");      };  };  int main() {      Base *b=new Derived();      b->print();      return 0;  }  

完整代码见:github

同名函数

#include<iostream>  #include<stdio.h>    struct Base {      int v1;  //    private:   //error!          int v3;      public:     //显示声明public          int v2;      void print(){          printf("%sn","hello world");      };  };    typedef struct Base1 {      int v1;  //    private:   //error!          int v3;      public:     //显示声明public          int v2;      void print(){          printf("%sn","hello world");      };  }B;  void Base(){      printf("%sn","I am Base func");  }  //void B() {}  //error! 符号 "B" 已经被定义为一个 "struct Base1" 的别名  int main() {      struct Base base;  //ok      //Base base1;  // error!      base.v1=1;      base.v3=2;      base.print();      printf("%dn",base.v1);      printf("%dn",base.v3);      Base();      return 0;  }  

完整代码见:github

3.总结

C和C++中的Struct区别

C

C++

不能将函数放在结构体声明

能将函数放在结构体声明

在C结构体声明中不能使用C++访问修饰符。

public、protected、private 在C++中可以使用。

在C中定义结构体变量,如果使用了下面定义必须加struct。

可以不加struct

结构体不能继承(没有这一概念)。

可以继承

若结构体的名字与函数名相同,可以正常运行且正常的调用!

若结构体的名字与函数名相同,使用结构体,只能使用带struct定义!