• C结构体、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语言中的结构体只是一个复杂数据类型 ,只能定义成员变量,不能定义成员函数,不能用于面向对象编程。来看一个函数指针的例子:
    int My_Add(int a, int b)
    {
        return a + b;
    }
    int My_Sub(int a, int b)
    {
        return a - b;
    }
    struct  CTest
    {
        int(*Add)(int, int); //函数指针
        int(*Sub)(int, int);
    };
    
    int main()
    {
        struct CTest test;
        int ret = 0;
        test.Add = My_Add;
        test.Sub = My_Sub;
        ret = test.Add(3, 5);
        printf("%d", ret);
    }
    

      

    c) 比如说这个结构体吧:
    struct  CTest
    {
        char ch;
        int num;
    };
    int main()
    {
        CTest test;
        test.num = 1;
        printf("%d", test.num);
    }
     
    这样在C语言中是编译不过去的,原因提示未定义标识符CTest。总的来说就是在C语言中结构体变量定义的时候,若为struct 结构体名 变量名定义的时候,struct不能省略。但是在C++之中则可以省略struct。
     
    再来分析C++中的结构体与类的区别:
    先来说说C++中两者的相同之处: 结构体中也可以包含函数;也可以定义public、private、protected数据成员;定义了结构体之后,可以用结构体名来创建对象。也就是说在C++当中,结构体中可以有成员变量,可以有成员函数,可以从别的类继承,也可以被别的类继承,可以有虚函数。总的一句话:class和struct的语法基本相同,从声明到使用,都很相似,但是struct的约束要比class多,理论上,struct能做到的class都能做到,但class能做到的stuct却不一定做的到。
     
    再来说说两者的区别:对于成员访问权限以及继承方式,class中默认的是private,而struct中则是publicclass还可以用于表示模板类型,struct则不行
    注意struct是可以继承与被继承的,这一点有的人可能忽略了,来看一下struct中的继承与被继承:
    struct A
    {
    public:
        A(){};
        virtual void Dynamic()
        {
            cout << "A" << endl;
        }
    protected:
        void fun();
    private:
        int m_Data;
    };
    
    struct B:public A
    {
    public:
        virtual void Dynamic()
        {
            cout << "B" << endl;
        }
    };
    int main()
    {
        A * pa = new B;
        pa->Dynamic();
    }
    

      

    编译完全没有问题。
     
    总结一下就是:
    概念:class和struct的语法基本相同,从声明到使用,都很相似,但是struct的约束要比class多,理论上,struct能做到的class都能做到,但class能做到的stuct却不一定做的到。
    类型:struct是值类型,class是引用类型,因此它们具有所有值类型和引用类型之间的差异。
    效率:由于堆栈的执行效率要比堆的执行效率高,但是堆栈资源却很有限,不适合处理逻辑复杂的大对象,因此struct常用来处理作为基类型对待的小对象,而class来处理某个商业逻辑。
    关系:struct不仅能继承也能被继承 ,而且可以实现接口,不过Class可以完全扩展。内部结构有区别,struct只能添加带参的构造函数,不能使用abstract和protected等修饰符,不能初始化实例字段。

    拓展部分:再来看一看Java之中类和结构体的区别,来看一个例子:
    代码:
    static void Main(string[] args)
            {
                int strNumberA = 100;
                int strNumberB = strNumberA;//编译器会先复制strNumberA的值,后赋给strNumberB,会在内存的两个地方储存值100
    
                MyVector vA = new MyVector();
                MyVector vB = vA;//引用变量的赋值 赋值操作完成后,两个变量都指向同一内存地址 
                vA.Value = 100;
                Console.WriteLine(vA.Value + "  等于  " + vB.Value);//由于vA和vB指向同一内存地址,所以vB.Value的值也为100  
                vB.Value = 200;
                Console.WriteLine(vA.Value + "  等于  " + vB.Value);//同理vA.Value =vB.Value 
                 
                MyStruct structA = new MyStruct();
                MyStruct structB = structA; //结构是值类型 赋值操作完成后,两个结构中的结构信息一致。注意是“结构中的信息”一致。 
                structA.Value = 100;
                structB.Value = 200;
                Console.WriteLine(structA.Value + "  不等于  " + structB.Value);//同理vA.Value !=vB.Value 
                Console.Read();
            }
            private class MyVector
            {
                public int Value { get; set; }
            }
            private struct MyStruct
            {
                public int Value;
            }  
     
    

      

    例子可以看出,值类型变量的赋值操作,仅仅是2个实际数据之间的复制。而引用类型变量的赋值操作,复制的是引用,即内存地址,由于赋值后二者都指向同一内存地址,所以改变其中一个,另一个也会跟着改变。
    结构体引出的问题:上面说到值类型的内存不由垃圾回收控制,作用域结束时,值类型会自行释放,减少了托管堆的压力,因此具有性能上的优势。例如,通常 struct比class更高效;而引用类型的内存回收,有垃圾回收机制控制。这就引出了关于.NET内存中的堆和栈的讨论 。

    最后做一个小小的总结:
    关于 Class性能好还是Struct性能好(换言堆性能好?还是栈性能好?) 那么什么时机该用呢 ,比较struct和 class的不同,我使用一下网上的一个牛人总结的比较好的一段话:
    (1) 在表示诸如点、矩形等主要用来存储数据的轻量级对象时,首选struct。
    (2) 在表示数据量大、逻辑复杂的大对象时,首选class。
    (3) 在表现抽象和多级别的对象层次时,class是最佳选择 
  • 相关阅读:
    (404) 未找到 获取StatusCode状态码
    通过UserAgent判断设备为Android、Ios、Pc访问
    Sql视图创建语句及修改视图
    301重定向
    md5加密篇(一)
    黑客编程教程(六)Windows的关机和重起
    黑客编程教程(五)多线程编程介绍
    黑客编程教程(四)关于服务器和客户端编程
    黑客编程教程(三)Windows 网络协议
    黑客编程教程(二)Win API编程简介
  • 原文地址:https://www.cnblogs.com/cthon/p/9170596.html
Copyright © 2020-2023  润新知