C结构体、C++结构体、C++类的区别

先来讲说C和C++中结构体的不一样
a) C语言中的结构体不能为空,不然会报错
1>d:\myproject\visual studio 2013\projects\myc++\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是最佳选择 
相关文章
相关标签/搜索