前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《C++那些事》项目概要及一文彻底搞懂C和C++中struct

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

作者头像
公众号guangcity
发布2019-09-20 17:36:23
7840
发布2019-09-20 17:36:23
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)

一文搞懂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() {}。

完整案例:

代码语言:javascript
复制
#include<stdio.h>

struct Base {            // public
    int v1; 
//    public:      //error
        int v2; 
    //private:
        int v3; 
    //void print(){       // c中不能在结构体中嵌入函数
    //    printf("%s\n","hello world");
    //};    //error!
};

void Base(){
    printf("%s\n","I am Base func");
}
//struct Base base1;  //ok
//Base base2; //error
int main() {
    struct Base base;
    base.v1=1;
    //base.print();
    printf("%d\n",base.v1);
    Base();
    return 0;
}

最后输出:

代码语言:javascript
复制
1
I am Base func

完整代码见:github

2.C++中struct

与C对比如下:

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

例如:

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

未添加同名函数前:

代码语言:javascript
复制
struct Student {

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

添加同名函数后:

代码语言:javascript
复制
struct Student {

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

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

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

前三种案例

代码语言:javascript
复制
#include<iostream>
#include<stdio.h>

struct Base {         
    int v1;
//    private:   //error!
        int v3;
    public:     //显示声明public
        int v2;
    void print(){       
        printf("%s\n","hello world");
    };    
};

int main() {
    struct Base base1;  //ok
    Base base2; //ok
    Base base;
    base.v1=1;
    base.v3=2;
    base.print();
    printf("%d\n",base.v1);
    printf("%d\n",base.v3);
    return 0;
}

完整代码见:github

继承案例

代码语言:javascript
复制
#include<iostream>
#include<stdio.h>
struct Base {         
    int v1;
//    private:   //error!
        int v3;
    public:   //显示声明public
        int v2;
    virtual void print(){       
        printf("%s\n","Base");
    };    
};
struct Derived:Base {         

    public:
        int v2;
    void print(){       
        printf("%s\n","Derived");
    };    
};
int main() {
    Base *b=new Derived();
    b->print();
    return 0;
}

完整代码见:github

同名函数

代码语言:javascript
复制
#include<iostream>
#include<stdio.h>

struct Base {         
    int v1;
//    private:   //error!
        int v3;
    public:     //显示声明public
        int v2;
    void print(){       
        printf("%s\n","hello world");
    };    
};

typedef struct Base1 {         
    int v1;
//    private:   //error!
        int v3;
    public:     //显示声明public
        int v2;
    void print(){       
        printf("%s\n","hello world");
    };    
}B;
void Base(){
    printf("%s\n","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("%d\n",base.v1);
    printf("%d\n",base.v3);
    Base();
    return 0;
}

完整代码见:github

3.总结

C和C++中的Struct区别

C

C++

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

能将函数放在结构体声明

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

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

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

可以不加struct

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

可以继承

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一文搞懂C和C++中struct
    • 1.C中struct
      • 2.C++中struct
        • 3.总结
          • C和C++中的Struct区别
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档