成员私有公有的问题!
template <class T>
class Iter //类似与STL迭代器
{
T* ptr;
T* end;
T* begin;
unsigned length;
public:
Iter() //构造函数
{
ptr=end=begin=NULL;
length=0;
}
Iter(T* p,T* first,T* last) //复制构造函数
{
ptr=p;
end=last;
begin=first;
length=last-first; //last-first为指针之间的距离
}
unsigned size() {return length;}
T& operator*() //重载*运算符
{
if((ptr>=end)||(ptr<begin))
throw OutOfRangeExc(); //指针越界抛出异常
return *ptr;
}
T* operator->() //重载->运算符
{
if((ptr>=end)||(ptr<begin))
throw OutOfRangeExc(); //指针越界抛出异常
return ptr;
}
//以下是重载自增自减运算符,以及2种形式------------
Iter operator++()
{
ptr++;
return *this;
}
Iter operator--()
{
ptr--;
return *this;
}
Iter operator++(int notused)
{
T *tmp=ptr;
ptr++;
return Iter<T>(tmp,begin,end);
}
Iter operator--(int notused)
{
T *tmp=ptr;
ptr--;
return Iter<T>(tmp,begin,end);
}
//----------------------------------------
T& operator[](int i) //重载下标运算符
{
if((i<0)||(i>=(end-begin)))
throw OutOfRangeExc();
return ptr[i];
}
//以下是重载关系运算符--------------------------------------------------
bool operator==(Iter op2)
{
return ptr==op2.ptr;
}
bool operator!=(Iter op2)
{
return ptr!=op2.ptr;
}
bool operator<(Iter op2)
{
return ptr<op2.ptr;
}
bool operator<=(Iter op2)
{
return ptr<=op2.ptr;
}
bool operator>(Iter op2)
{
return ptr>op2.ptr;
}
bool operator>=(Iter op2)
{
return ptr>op2.ptr;
}
//---------------------------------------------------------------------
Iter operator-(int n)
{
ptr-=n;
return *this;
}
Iter operator+(int n)
{
ptr+=n;
return *this;
}
int operator-(Iter<T> &itr2)
{
return ptr-itr2.ptr;
}
};
程序中多次出现了如itr2.ptr等的情况,显然是调用了私有成员,但是为什么可以通过编译?
难道接受传过来的是相同类的对象时是可以直接调用私有成员的吗?
问题点数:20、回复次数:5Top
1 楼ugg(逸学堂(exuetang.net))回复于 2006-03-08 18:17:46 得分 20
重载=,==,< 等操作符号时,是允许这样的..
难道接受传过来的是相同类的对象时是可以直接调用私有成员的吗?
`~`~`~`~`~
这句话是正确的,如果不允许这样,那就需要给类中的每个成员变量定义接口了..
基于以上考虑,,所以在相同类型中允许访问私有变量..Top
2 楼benlei999(醉明月)回复于 2006-03-08 18:42:26 得分 0
在自己的接口实现中当然可以访问自己的成员啊(不管公有私有,访问限制只是针对其他类)Top
3 楼xiaocai0001(高楼目尽欲黄昏/梧桐叶上萧萧雨)回复于 2006-03-08 18:46:11 得分 0
私有,公有权限只是对类的实例来说的, 对于类的成员函数时没有此限制.Top
4 楼Bobosail(Time++;)回复于 2006-03-08 18:53:11 得分 0
谢谢1楼的
后面的说的也对,但是后面的再看看
bool operator>=(Iter op2)
{
return ptr>op2.ptr;
}
这个传过来的应该是实例吧。只有1楼的说的通吧Top
5 楼hdt(倦怠)回复于 2006-03-08 19:27:12 得分 0
oo 语言都是这样
class a{
int _nId;
public: test( a atemp )
{
atemp._nId = 100; //
}
};
Top




