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中的那些单纯的特性,不要把它当做定义类的关键字使用,虽然它可以。

原文地址:https://www.cnblogs.com/niuxichuan/p/5444013.html