Java和C++通过new创建的对象_rancho628的博客-CSDN博客
-
//java
-
Dog dog; //定义Dog类型引用dog,没有实际空间
-
Dog dog = new dog(); //定义Dog类型引用dog,并绑定到新创建的对象
JVM在进行内存管理时,首先会在栈中给dog分配一个空间,当new Dog();后会在堆中开辟对象的实际空间,然后将dog指向堆中的空间,这样我们就可以访问对象的成员变量了。
-
//c++
-
Dog dog; //定义dog,并在栈中申请空间
-
Dog* p = new Dog(); //定义Dog指针p,并在堆中申请空间,过后需手动释放内存
这两种方式在C++中都能完成对象的创建,但是在内存中的处理却完全不同。
对于第一种方式而言,dog是被存储在栈中的,占用的大小是Dog类中成员变量占用内存的和,此处不包括成员方法,因为成员方法是存放在公共存储区以便所有该类的对象都可以访问的。
对于第二种方式则不同,该方式使用了指针,在定义*p时在栈中开辟一个4字节的空间,new Dog()时在堆中开辟一块空间,然后将该空间的首地址赋值给*p,这样,通过*p就可以找到对象在堆中的任何成员方法了。
区别总结
两种语言里都含有 new 操作符,但它们的含义大不相同,这与它俩的变量管理方式有关。
- 在 Java 中,只有当你使用 new 操作符时,才会真正在内存中申请一块空间,创建一个新对象,并将该对象绑定到你所定义的变量名上。其它情况下,要么是将已有对象绑定到某个变量名上,要么就是定义的变量名是个空引用,没有绑定任何对象。也就是说,定义变量名只是创建了一个新的标识符,跟创建对象没有关系,创建对象必须通过 new 来完成,只有创建对象时才会申请内存空间。
- 但在 C++ 中,当你定义了一个变量 dog 时,即使你没有给它赋值,也意味着你不但创建了一个新的标识符,同时还在栈中申请了对应的内存空间。因此,C++ 中定义的变量名不仅仅是个标识符,还自动关联着栈中的一块内存空间。而 C++ 中的 new 操作符表示的是在堆中申请内存,因为栈中的内存在运行时期大小是固定且有限的,因此需要动态内存分配的时候就需要用 new 来实现。这类似于 C 里面的 malloc 函数,只不过 new 操作符还封装了其它的操作。
总结而言,Java 中的变量名仅仅是一个用于引用内存中实际对象的标识符,如果你没给它关联对象,它就为空引用。而 C++ 中的变量名(非指针类型),虽然也是标识符,但却始终关联着实际的内存空间,当我们看到一个变量(非指针类型)时,就知道它代表着一块实际的内存空间。
一、C++
#include "iostream"
#include <string>
using namespace std;
class mycoach
{
private:
string name;
short age = 0;
public:
void coachgreeting(string _name, int _age)
{
name = _name;
age = _age;
cout << "大家好,我是" << name << "今年芳龄" << age << endl;
}
protected:
};
void main()
{
char r[10] = {0};
cout << "好好学编程,包养陈培昌" << endl;
cout << "请翻帅哥的牌子:";
cout << "厉智 陈培昌 程劲";
cin>>r;
cout << "这位爷翻了" << r << "的牌子" << endl;
mycoach ritz;
ritz.coachgreeting("厉智", 31);
system("pause");
}
mycoach ritz;类可以直接实例化
二、java:
java:Dog myDog只是声明,和c++不同,切记。
new的时候,才会走java的构造函数。