读书人

lt;大散分gt;怎么理解这程序的拷贝构造函数

发布时间: 2012-03-09 16:54:57 作者: rapoo

<大散分>如何理解这程序的拷贝构造函数?
http://community.csdn.net/Expert/topic/5443/5443183.xml?temp=.1733667
上接,希望能有更多兄弟给些看法。
----------------
类名::类名(类名 &对象名);
point::point(point &p)
那么上面这个p也是一个对象了?
----------------------
#include <iostream>
class point
{
public:
point(int xx=0, int yy=0){x=xx;y=yy;}
point(point &p);
int Getx(){return x;}
int Gety(){return y;}
private:
int x,y;
};
//成员函数实现
point::point(point &p)
{
x=p.x; //这两个赋值怎么理解?
y=p.y;
cout < < "copy ";
}
void main()
{
point a(4,5);
point b(a);
}


相关文档:郑莉,董渊C++第三版,106页4-2例,有删改。
------------------------------------
x=p.x;
y=p.y;
这两个在
a(4,5)
b(a);p.x等价于a对象的私有数据成员?
那么x=p.x这左边的x又是b的私有数据成员了?


[解决办法]
我认为,是的~
[解决办法]
所有point类型的变量,也就是对象了, 都可以访问这里的私有成员
不用管是哪个对象的,只要是同类型的就行
[解决办法]

point::point(point &p)
{
x=p.x; //这两个赋值怎么理解?
y=p.y;
cout < < "copy ";
}

其实就是

point::point(point &p)
{
this-> x=p.x;
this-> y=p.y;
cout < < "copy ";
}

把p的x,y 拷贝给这个新对象的x,y

不过对于成员,我们一般这样初始化
point::point(point &p)
:x(p.x), y(p.y)
{
cout < < "copy ";
}

[解决办法]
赋值怎么理解?
一个茶杯水变两份,给另个杯子
[解决办法]
point::point(point &p)
{
x=p.x; 为什么p可以访问私有成员变量x呢?
y=p.y;
cout < < "copy ";
}
[解决办法]
因为p是point的对象呀 lz
[解决办法]
这本书好象不太好,还是不要看了,换一本吧。

#include <iostream>
class point
{
public:
explicit point(int xx=0, int yy=0) // < < --- 最好这样
: x(xx), y(yy) { }
point(point const & p); // 好象这样也合适点
int Getx(){return x;}
int Gety(){return y;}
private:
int x,y;
};
//成员函数实现
point::point(point &p)
: x(p.x), // 一般这样用
y(p.y)
{
// x=p.x; //这两个赋值怎么理解?
// y=p.y;
cout < < "copy ";
}
void main()
{
point a(4,5);
point b(a);
}
[解决办法]
b(a);p.x等价于a对象的私有数据成员?
那么x=p.x这左边的x又是b的私有数据成员了?
——————————————————————————————————————————
b(a); 等价于 b.拷贝构造函数(a);
这样可以理解了吧?
[解决办法]
jf
------解决方案--------------------


呵呵,楼主又来了。

好像上面一个帖子里面已经解释的很清楚了吧。
C++的作用域限定是基于类的,就是说在类A的函数中可以访问A的任何一个对象的私有成员。
[解决办法]
支持楼上...
[解决办法]
professional c++ 里有句话:
访问限定符作用在类层次上,而不是对象层次,因此一个类的方法可以访问该类任何对象的protected或private方法及成员。

Polarislee(北极星)(无房无车,飘在北京) 解释的很清楚。

[解决办法]
LZ比较一下就明白了
class node
{
public:
node(int mm=0,int nn=0){m=mm;n=nn;}
private:
int m,n;
};

class point
{
public:
point(int xx=0, int yy=0){x=xx;y=yy;}
point(point &p);
point(node &p){x=p.m; y=p.n;} //出错,不能访问node::x,node::y
private:
int x,y;
};
[解决办法]
只能帮顶了
[解决办法]
不用比较啦,类里面定义的数据类型:public,private,protect都是相对于类与类之间来讲的.
楼主这里所用的都是同一个类,因此没有数据保护上的问题.
在同一个类里的所有成员对该类对像的操作都是开放的(也就是没有任何的使用限制).
point::point(point &p)里面所执行的每一个动作都在类point里面,所以与数据类型没联系,都是可以操作的.
[解决办法]
先接分。
[解决办法]
xuexi
[解决办法]
"p.x与x不都是同一个类里的同一个私有成员么?自已给自己赋值? "
p.x是对象p的x成员,
而x就是this的成员,就是当前你正在构造的这个对象的成员变量.
[解决办法]
point &p 要把这个&好好理解下
[解决办法]
相同的类对象访问类自己的方法的时候是没有权限限制的

point::point(point &p)
{
x=p.x; //这两个赋值怎么理解?
y=p.y;
cout < < "copy ";
}
p是参数,&表示是一个引用,可以理解为传如一个对象,不过这个对象是传址调用的,可以被修改。
x=p.x;就是 this-> x = p.x;
this指针是相对的,每次调用的时候,都表示调用对象自己。
[解决办法]
LZ说得对啊
[解决办法]
point::point(point &p)
{
x=p.x; //这两个赋值怎么理解?
y=p.y;

其实就是给新对象b赋值后调用了b的拷贝构造函数
x y是对象b的数据成员
p.x p.y是 a的数据成员
而拷贝构造函数是成员函数所以能调用私有成员

[解决办法]
LZ你说的赋值不就是
把原来的point的成员x的值5,拷贝到新point的成员x的内存地址去嘛,两个point拥有的x在不同的内存地址~~这个没有什么好疑问的吧


[解决办法]
正规则的拷贝复制函数形式是这样的
point(const point& p)

如果没有提供的话,编译器会默认提供给你一个按字节拷贝的复制函数
拷贝复制函数分为两种:浅拷贝及深拷贝
浅拷贝函数:即通常的字节(值)拷贝,基本上与编译器默认提供的相同
深拷贝函数:会对整个类中提供的指针型数据提供相应的指针指向数据的拷贝,而不仅仅是指针地址的拷贝

读书人网 >C++

热点推荐