面向对象C++类中声明成员属性时,指针和引用的区别和用法?以及如何初始化?

classB;classA{public:B*mpB;A&mrA;intc;};classB{public:B(){};Ama;A&ra;A*pa;};比如上面这段程序,... class B;

class A
{
public:
B *mpB;
A &mrA;
int c;
};

class B
{
public:
B(){};
A ma;
A& ra;
A* pa;
};
比如上面这段程序,B中的属性ma,ra,pa要如何在构造函数中初始化?用法有什么区别?
A中的mrA,要如何初始化?引用不初始化的话会报错。
B* p = new B();
这时(*p).ma与p->ma有什么区别?
我发现->可以连用好几个但是.不行,即可以p->pa->mpB->pa->c,但是要在构造函数中实例指针的对象。这两种用法有什么区别?

这里好乱,一塌糊涂,感谢大牛解答!!!!
展开
 我来答
duck_week
2013-07-23 · TA获得超过148个赞
知道小有建树答主
回答量:106
采纳率:0%
帮助的人:149万
展开全部
class B
{
public:
    B(A& a):ra(a){
        //A ma这个可以不用初始化了,可以直接用
        //A& ra; 这个需要在初始化列表中初始化 ra(a)
        pa = NULL;//一般直接初始化为NULL,你也可以通过构造方法给传进来个参数
    }
    A ma;            
    A& ra;
    A* pa;

 

A中的mrA,要如何初始化?

和B中的A& ra的初始化方法一样,都是使用初始化列表初始化,然后就不报错了

 

这时(*p).ma与p->ma有什么区别?

这个在最终的用途上是没有区别的,都是调用对象的ma成员变量,只是写法不一样

(*p) 这个表示的是一个对象,所以 后面是  (*p).ma

p 是个指向对象的指针 所以是p->ma

 

我发现->可以连用好几个但是.不行,即可以p->pa->mpB->pa->c,但是要在构造函数中实例指针的对

 

这个没看明白呀!(指针在使用前,一定要初始化,让它指向一个真实的对象,不让程序就崩溃了)

 

引用:

是给一个对象起一个别名,在声明的时候就得定义,明确它所指向的对象,而且以后就不可以更改了,所有对引用的操作,都会影响原来的对象。使用时直接使用  a.function();即可

指针:

指向在对象所在的地址,声明时可以不定义,而后,还可以更改其所指向的地址,改为指向其他对象,可以变化,这个引用不行

更多追问追答
追问
。。。写错了写道评论里去了。。。。。

感谢看了这么多问题!我的意思是,p->pa->c就可以访问到c,但是(*p).pa.c就不行。但是后来试验了一下发现原来(*((*p).pa)).c就可以。。。 还有就是class A中的A &mrA; 应该怎么初始化?闹不好在初始化的时候就死循环了。。。 就是说 我有一个类A,定义其中的某个成员变量为 另一个A类的对象 的引用,应该怎么办?
追答

p->pa->c 这个可以

(*p).pa->c 也可以,(*((*p).pa)).c 因为 (*p).pa 这个变量是个对象指针,而不是一个对象变量

(*((*p).pa)) 把 (*p).pa 从一个对象指针变成了一个对象

 

用初始化列表初始化类A中的成员 如下。

引用不会创建一个对象,而是引用一个已经存在的对象,所以不会引起初始化死循环,但用起来怎么着也是挺别扭的,可以这样使,但是这么用我感觉挺糟糕的,感觉和死循环差不多了

class A{
public:  
 A(A& a):mrA(a){
 }                
 A &mrA;              
};
int main(int argc, char* argv[])
{
 A* a = NULL;
 A *b = new A(*a);
 return 0;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式