p = new (q) P表示什么意思?其中大P是一个类,小p和小q都是对象。

作者&投稿:爱飞 (若有异议请与网页底部的电邮联系)
大神,这里为什么是构造了两个B类对象啊?第一个不是A*P; P=new B;构造的不该是类A么?~

A*P; P=new B;//你要注意,虽然P是一个基类的指针。但是new B调用的是派生类B的构造方法,所以构造的是B类对象,构造B类对象前会先构造基类对象A。所以会输出AB,构造完后会返回B类对象的地址,然后将它赋给一个基类指针P。 B*q;q=new B;//这里和上面唯一的区别就是,将B类对象的地址赋给了派生类指针q 而需要注意的是:可以将一个派生类对象的地址赋给基类指针和派生类指针 而一个基类对象的地址只能赋给基类指针,不能赋给派生类的指针。 因为派生类不但拥有基类的方法属性,还有基类没有得属性方法 将一个地址赋给一个指针前,通常会将该地址处的对象类型转换为指针所指的类型。 而将一个基类地址赋给一个派生类指针是不允许的,如果可以的话,那么这个指针就可以调用派生类的方法和属性,但指针指向的是一个基类对象,而基类可能并没有这些方法和属性,因为这些方法和属性是 派生类新增的。 但将以个派生类对象的地址赋给一个基类指针是可以的,因为,基类指针能调用的方法和属性,派生类都有,所以并不会有什么问题。 希望你看完后对类的继承能有所理解~~~~

楼上的说得不太准确,准确地讲,p不是一个对象,其实p是一个引用.初学JAVA的时候可以把p理解成一个对象,但是到了后面编程,你会出现很多错误.
我们把你的这个代码拆开来讲,
Person p;执行这句代码时会在内存中开辟一段存储空间,用以存储一个引用(指针),由于你没有给这个引用(指针)赋值,所以,p现在是空指针,p==null成立!
new Person();的意思新建一个Person对象,然后放在对象栈中,对象栈是一个专门存放对象的一段存储空间,不能直接访问的,需要通过引用(指针)来间接访问,
最后解释=号的作用,他是说把后面的对象的引用(指针)赋给前面的,于是p就指向了一个对象.你现在就可以通过p来操作对象栈的对象了.

也许你会讲既然p始终指向的是该对象,那么直接认为他就是一个对象为什么说不对呢.来看看下面的代码(假设Person类有个public 变量int age代表一个人的年龄);
Person p=new Person();
p.age=10; //设置p的年龄为10岁
Person p2=p;
p2.age=20; //设置p2的年龄为20岁
System.out.println(p.age); //在屏幕上输出p的年龄
你认为会输出多少呢 ? 10? 那你就错了,屏幕上会输出20
因为p,p2是一个引用,p2=p的意思是把p的引用给p2,此时p和p2是同一个对象,在对象栈中指向同一个对象.p2改变了对象栈中的对象,因此p.age也会变.这个在C++中叫做浅拷贝,就是只把引用给p2,并没有生成新的对象.
也许你会说,只要我不用p2=p;这样的语句就不会错误了吧,但是在后面编程中你会把一个对象从一个类传到另一个类中,这样就避免不了这种浅拷贝.所以正确理解p的意义非常重要!

这是关于c++中类对象中对象的动态建立和释放中的一个问题。(1)首先要清楚对于类P定义对象p,q(注意大小写),用new运算符开辟新内存,new运算符创建内存的格式是:new +类名;(2)new运算符动态的分配内存后,返回值是是一个指向类对象的指针值,即内存空间的其实地址,所以开辟内存后,还要定义一个指向类对象的指针,格式是:类名+ * 指针变量名(注意指针定义中有星号*哦);(3)定义了对象的指针后就要在指针中存放new开辟的内存空间的首地址,格式是:指针变量名=new +类名(4)具体这道题就是:类名P,类对象名p , q,这个必须要定义对象指针的,只有指针能存放地址,我的常规编程习惯是:定义类对象指针,则pt=new P,或者左边是数据类型,可以在new后面跟基类型,你问的这个……好吧,我没用过

new(q)P 新建一个P类对象,其大小为sizeof(q)。