zoukankan      html  css  js  c++  java
  • Java和C++中的static

    1.Java类中的static变量和static方法会在类装载的过程中就得到内存分配,然后就会进行初始化工作。最多可能会被初始化3次,静态代码块的执行在main方法之前。

    static变量不可以在构造函数中进行初始化。

    而普通的成员变量会在new一个对象的时候才得到初始化,最多的话可能会被初始化4次。

    2.C++中类内定义的static变量仅仅是声明而已,只有在类外重新写一次(显示初始化是可选的)才是定义。

    类内的static变量和局部static变量一样,(都是存储在全局静态变量区)即使没有显示初始化,编译器也会给一个默认初始值。前提是类的static变量必须在类外定义过。

    static除了有限的情况以外(查阅C++ Primer),都不可以进行类内初始化。

    C++类的static方法在类内定义过之后就会分配存储空间,定义在全局静态区。

    3.关于C++的声明与定义

    声明是不分配存储空间的,只是起一个说明的作用。定义是会分配存储空间的,而是否给予初始值是可选的。

    在类中的话,我认为,成员变量都可以看做是声明,即使存在类内初始化的现象,我也觉得是一种声明,因为只有在为对象分配存储空间以后数据成员才会有存储空间。

    所以对于static变量,毫无疑问是声明,对于其他普通变量,无论是否存在类内初始化,我都认为是声明。

    而类的成员函数我认为都可以看做是定义,无论是静态的还是普通的成员函数,虽然他们的存储位置不同(全局静态区和程序代码区)。

    因为所有的对象共享成员函数的存储。

    4.Java中的构造函数不是一般的成员函数,因为main方法是static方法,构造函数作为非static方法却可以被调用(new一个对象时这种情形比比皆是),

     足以说明构造函数的特殊性。

    5.关于C++中的new和delete

    new一个对象或者数组时,返回的指针是存储在栈区的,数组成员或者数据成员是存储在堆区的。

    delete([])掉指针就可以delete掉堆中的内存。

    new一个类的对象数组的时候,只能调用类的默认构造函数。

    new一个数组的时候,是无法赋初值的。

    在构造函数中用了new来申请内存的时候,一定记得在析构函数中要手工释放。

    6.关于C++中的struct和class

    C++中的struct和class的区别是不大的,当然,C++也向下兼容C风格的单纯的struct。

    关于C++中的struct和class的区别,参考:http://blog.csdn.net/nocky/article/details/6195556

    建议在C++中使用struct时还是只保持C中的那些单纯的特性,不要把它当做定义类的关键字使用,虽然它可以。

  • 相关阅读:
    【11.5】生成器进阶--send、close和throw方法
    【11.4】协程是什么?
    【python】IO多路复用(select、poll、epoll)介绍及select、epoll的实现
    【11.3】select+回调+事件循环获取html
    【11.2】C10K问题和io多路复用(select、poll和epoll)
    【11.1】并发、并行、同步、异步、阻塞、非阻塞
    【10.10】进程间通信--Queue、Pipe、Manager
    set autotrace on 报cannot set autotrace 错误解决方法
    通配符获取文件
    日期函数
  • 原文地址:https://www.cnblogs.com/niuxichuan/p/5444013.html
Copyright © 2011-2022 走看看