• C C++ 中结构体与类


    先来说说C和C++中结构体的不同
    a) C语言中的结构体不能为空,否则会报错
    1>d:myprojectvisual studio 2013projectsmyc++main.c(71): error C2016: C 要求一个结构或联合至少有一个成员
    b) C语言中的结构体只涉及到数据结构,而不涉及到算法,也就是说在C中数据结构和算法是分离的。换句话说就是C语言中的结构体只能定义成员变量,但是不能定义成员函数。然而在C++中既可以定义成员变量又可以定义成员函数, C++中的结构体和类体现了数据结构和算法的结合。
    不过虽然C语言的结构体中不能定义成员函数,但是却可以定义函数指针,不过函数指针本质上不是函数而是指针,所以总的来说C语言中的结构体只是一个复杂数据类型 ,只能定义成员变量,不能定义成员函数,不能用于面向对象编程。来看一个函数指针的例子:
    [cpp] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. int My_Add(int a, int b)  
    2. {  
    3.     return a + b;  
    4. }  
    5. int My_Sub(int a, int b)  
    6. {  
    7.     return a - b;  
    8. }  
    9. struct  CTest  
    10. {  
    11.     int(*Add)(int, int); //函数指针  
    12.     int(*Sub)(int, int);  
    13. };  
    14.   
    15. int main()  
    16. {  
    17.     struct CTest test;  
    18.     int ret = 0;  
    19.     test.Add = My_Add;  
    20.     test.Sub = My_Sub;  
    21.     ret = test.Add(3, 5);  
    22.     printf("%d", ret);  
    23. }  

    c) 比如说这个结构体吧:

    [cpp] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. struct  CTest  
    2. {  
    3.     char ch;  
    4.     int num;  
    5. };  
    6. int main()  
    7. {  
    8.     CTest test;  
    9.     test.num = 1;  
    10.     printf("%d", test.num);  
    11. }  
    这样在C语言中是编译不过去的,原因提示未定义标识符CTest。总的来说就是在C语言中结构体变量定义的时候,若为struct 结构体名 变量名定义的时候,struct不能省略。但是在C++之中则可以省略struct。
     
    再来分析C++中的结构体与类的区别:
    先来说说C++中两者的相同之处: 结构体中也可以包含函数;也可以定义public、private、protected数据成员;定义了结构体之后,可以用结构体名来创建对象。也就是说在C++当中,结构体中可以有成员变量,可以有成员函数,可以从别的类继承,也可以被别的类继承,可以有虚函数。总的一句话:class和struct的语法基本相同,从声明到使用,都很相似,但是struct的约束要比class多,理论上,struct能做到的class都能做到,但class能做到的stuct却不一定做的到。
     
    再来说说两者的区别:对于成员访问权限以及继承方式,class中默认的是private,而struct中则是public。class还可以用于表示模板类型,struct则不行。
    注意struct是可以继承与被继承的,这一点有的人可能忽略了,来看一下struct中的继承与被继承:
    [cpp] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. struct A  
    2. {  
    3. public:  
    4.     A(){};  
    5.     virtual void Dynamic()  
    6.     {  
    7.         cout << "A" << endl;  
    8.     }  
    9. protected:  
    10.     void fun();  
    11. private:  
    12.     int m_Data;  
    13. };  
    14.   
    15. struct B:public A  
    16. {  
    17. public:  
    18.     virtual void Dynamic()  
    19.     {  
    20.         cout << "B" << endl;  
    21.     }  
    22. };  
    23. int main()  
    24. {  
    25.     A * pa = new B;  
    26.     pa->Dynamic();  
    27. }  
    编译完全没有问题。
     
    总结一下就是:
    概念:class和struct的语法基本相同,从声明到使用,都很相似,但是struct的约束要比class多,理论上,struct能做到的class都能做到,但class能做到的stuct却不一定做的到。
     
  • 相关阅读:
    HIVE高级(14):优化(14) Hive On Spark配置
    HIVE高级(13):优化(13) Hive Job 优化
    HIVE高级(12):优化(12) 数据倾斜
    HIVE高级(11):优化(11) HQL 语法优化(2) 多表优化
    HIVE高级(10):优化(10) HQL 语法优化(1) 单表优化
    HIVE高级(9):优化(9) Hive 建表优化(1) 分区表/分桶表/合适的文件格式/合适的压缩格式
    HIVE高级(8):优化(8) Explain 查看执行计划(二)
    Hive基础(19):Hive 函数(2) 自定义函数/自定义 UDF 函数/自定义 UDTF 函数
    Hive基础(18):Hive语法(5) DDL(2) 分区表和分桶表
    MATLAB RGB2HSV、HSV2RGB
  • 原文地址:https://www.cnblogs.com/yzl050819/p/6025592.html
Copyright © 2020-2023  润新知