zoukankan      html  css  js  c++  java
  • 结构和类

    结构体和类具有相同的结构,但是他们还是有很多的区别的:

     1、结构中无限定修饰符的时候,默认为共有成员,但是在类中是私有成员;

     2、结构是值类型,但是类是属于引用类型;

     3、结构不容许继承,但是类可以继承;

     4、结构构造中编译器总是提供一个无参数的构造函数,不容许替换,所以在结构体中直容许提供有参数构造函数,提供字段的初始化值也不能绕过默认构造函数;

     5、结构主要用于小的数据结构(优点:内联或保存在栈中,分配内存快,释放快; 缺点:内容被复制,性能损失。所以把结构作为参数递给方法时,应把他作为ref参数传递,避免性能损失),类使用引用,,则只复制引用;

     6、默认构造函数把数值字段都初始化为0,把引用类型字段初始化为null;

    举例:

    虽然结构体是值类型但是语法上可以将其作为类处理:

    struct MyStruct
    {
        int length;
        int widgth;
    }
    
    MyStruct mystruct = new MyStruct();
    
    mystruct.length = 1;
    mystruct.widgth = 2;

      但是此时虽然说使用了new关键字进行内存的分配,但是其实际上还是值类型,调用相应的构造函数去进行内存的分配,分配的空间是在栈上。在使用所有元素之前都必须初始化,在结构上调用new运算符,或者给所有的字段分别赋值,结构就完全初始化了。当然,如果结构体定义为类的成员字段,在初始化包含的对象时,该结构会自动初始化为0;

    同时其实例化也可以写为:

    MyStruct mystruct;
    mystruct.length
    = 1; mystruct.widgth = 2;

    对于结构,变量声明实际上是为整个结构在栈上分配空间,所以就可以为它赋值了。

    类就写写法:

    class MyClass
    {
        int length;
        int widgth;
    }
    
    MyClass myclass = new MyClass();
    
    myclass.length = 1;
    myclass.widgth = 2;


    此时类分配的内存空间是在堆上,为这个对象分配一块内存去使用,不是在栈上。

    但是类不能写为下列类型:

    MyClass myclass;
    
    myclass.length = 1;
    myclass.widgth = 2;

    此种情况下会出编译出错,因为myclass包含一个未初始化的引用,不指向任何地方的一个地址,所以不能给其字段设置值。

    在初始化过程中下列类型是错误的:

    struct MyStruct
    {
        public int length = 1;
        public int widgth = 2;
    }

    但是如果是一个类,此种写法是正确的。

    在C++中只有静态整型常量才可以在类中初始化。

    爱一个人好难,得到一个人好难!
  • 相关阅读:
    How Many Answers Are Wrong(带权并查集)
    Dice
    Plants vs. Zombies(二分好题+思维)
    Marriage Match IV(最短路+网络流)
    Treasure Hunt
    The Doors(几何+最短路,好题)
    90. Subsets II
    89. Gray Code
    88. Merge Sorted Array
    87. Scramble String
  • 原文地址:https://www.cnblogs.com/ForeverX/p/3416023.html
Copyright © 2011-2022 走看看