C++中关于用成员函数实现运算符重载的问题
比如说我现在有一个类。申明了两个对象A和B。A的成员函数能够访问B的私有数据吗?如果不能的话,那么当我重载运算符“+”后(在类中以成员函数形式实现),为什么可以A+B?这...
比如说我现在有一个类。申明了两个对象A和B。A的成员函数能够访问B的私有数据吗?如果不能的话,那么当我重载运算符“+”后(在类中以成员函数形式实现),为什么可以A+B?这个不是被读为A.operator+(B)吗?此时怎么又可以访问B的私有数据了?希望能详细回答
展开
展开全部
对于同一个类的两个成员是不能互相访问私有数据的.
但也涉及到一个说法问题
假设这个类为
class Classtest{
private:
int value;
public:
//两个构造函数 :
Classtest(){value=0;}
Classtest(int j){value=j;}
//设置,和取值函数 :
void setvalue(int val){value=val;}
int getvalue(){return value;}
//重载加法操作符 :
Classtest operator +(Classtest&b){
return Classtest(this->value+b.value);
}
};
A+B
可以获得结果是因为执行了A.operator+(B);
该函数是A的成员函数所以可以直接访问A的私有数据
由于在类内 所以B也可以访问自己的私有数据.
但不是A在访问B的私有数据.
注意这句话
int operator +(Classtest&b){return this->value+b.value;}
对于B是通过b.value获得值,对于this是通过直接访问变量value来获得的.
如果在类外调用B.value;就会出错
因为类外B无法访问自己的私有数据,只能调用B的公有成员函数(该函数是类内的代码,所以他可以访问类的私有数据)
------------------------------
#include <stdio.h>
#include <stdlib.h>
class Classtest{
private:
int value;
public:
//两个构造函数 :
Classtest(){value=0;}
Classtest(int j){value=j;}
//设置,和取值函数 :
void setvalue(int val){value=val;}
int getvalue(){return value;}
//重载加法操作符 :
Classtest operator +(Classtest&b){
return Classtest(this->value+b.value)//这个地方也可以使用b.getvalue();;
}
};
int main(void)
{
class Classtest j,b;
j.setvalue(2);
b.setvalue(4);
printf("%d\n",(j+b).getvalue());
;system("pause");
}
但也涉及到一个说法问题
假设这个类为
class Classtest{
private:
int value;
public:
//两个构造函数 :
Classtest(){value=0;}
Classtest(int j){value=j;}
//设置,和取值函数 :
void setvalue(int val){value=val;}
int getvalue(){return value;}
//重载加法操作符 :
Classtest operator +(Classtest&b){
return Classtest(this->value+b.value);
}
};
A+B
可以获得结果是因为执行了A.operator+(B);
该函数是A的成员函数所以可以直接访问A的私有数据
由于在类内 所以B也可以访问自己的私有数据.
但不是A在访问B的私有数据.
注意这句话
int operator +(Classtest&b){return this->value+b.value;}
对于B是通过b.value获得值,对于this是通过直接访问变量value来获得的.
如果在类外调用B.value;就会出错
因为类外B无法访问自己的私有数据,只能调用B的公有成员函数(该函数是类内的代码,所以他可以访问类的私有数据)
------------------------------
#include <stdio.h>
#include <stdlib.h>
class Classtest{
private:
int value;
public:
//两个构造函数 :
Classtest(){value=0;}
Classtest(int j){value=j;}
//设置,和取值函数 :
void setvalue(int val){value=val;}
int getvalue(){return value;}
//重载加法操作符 :
Classtest operator +(Classtest&b){
return Classtest(this->value+b.value)//这个地方也可以使用b.getvalue();;
}
};
int main(void)
{
class Classtest j,b;
j.setvalue(2);
b.setvalue(4);
printf("%d\n",(j+b).getvalue());
;system("pause");
}
展开全部
1.对于第一个问题,A的成员函数是不能访问B的私有数据的(直接访问不可以)2.针对第二个问题:这个属于函数调用问题。 B对象是作为参数传递的,在重载运算符“+”的时候,你可能对参数对象的私有数据成员进行了访问。这样你就可以以A+B的形式访问B的私有数据了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
私有数据只能在内里面访问,外部是不能访问的。但是可能过接口访问(比如提供一个函数Getxx(),Setxx()那是可以的。
那么为什么A+B可以呢,那是因为重载运算符也是一个对外提供的接口(当然要是public成员).从A.operator+(B)中可以看出在实际运算中,执行的是A的operator+(B)这个函数而已,不过在调用的时候写成A+B.所以A+B是可以的。
学习一定要多多意考,多多观察。
希望你早是明白这个问题.
那么为什么A+B可以呢,那是因为重载运算符也是一个对外提供的接口(当然要是public成员).从A.operator+(B)中可以看出在实际运算中,执行的是A的operator+(B)这个函数而已,不过在调用的时候写成A+B.所以A+B是可以的。
学习一定要多多意考,多多观察。
希望你早是明白这个问题.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2009-08-13
展开全部
我是zdl_361
修改达到上限了,但是还有些小错误
所以不登陆发一次
对于同一个类的两个成员是不能互相访问私有数据的.
但也涉及到一个说法问题
假设这个类为
class Classtest{
private:
int value;
public:
//两个构造函数 :
Classtest(){value=0;}
Classtest(int j){value=j;}
//设置,和取值函数 :
void setvalue(int val){value=val;}
int getvalue(){return value;}
//重载加法操作符 :
Classtest operator +(Classtest&b){
return Classtest(this->value+b.value);
}
};
A+B
可以获得结果是因为执行了A.operator+(B);
该函数是A的成员函数所以可以直接访问A的私有数据
由于在类内执行的代码可以访问该类实例的私有成员
int operator +(Classtest&b){return this->value+b.value;}
如果在类外调用B.value;就会出错
该代码试图访问B的私有数据
但是类外的代码的访问权限不够.
(该函数是类内的代码,所以他可以访问类的私有数据)
访问B.value是否成功取决于代码的访问权限
访问权限由取决于访问在类外还是类内执行
------------------------------
#include <stdio.h>
#include <stdlib.h>
class Classtest{
private:
int value;
public:
//两个构造函数 :
Classtest(){value=0;}
Classtest(int j){value=j;}
//设置,和取值函数 :
void setvalue(int val){value=val;}
int getvalue(){return value;}
//重载加法操作符 :
Classtest operator +(Classtest&b){
return Classtest(this->value+b.value)//这个地方也可以使用b.getvalue();;
}
};
int main(void)
{
class Classtest j,b;
j.setvalue(2);
b.setvalue(4);
printf("%d\n",(j+b).getvalue());
;system("pause");
}
修改达到上限了,但是还有些小错误
所以不登陆发一次
对于同一个类的两个成员是不能互相访问私有数据的.
但也涉及到一个说法问题
假设这个类为
class Classtest{
private:
int value;
public:
//两个构造函数 :
Classtest(){value=0;}
Classtest(int j){value=j;}
//设置,和取值函数 :
void setvalue(int val){value=val;}
int getvalue(){return value;}
//重载加法操作符 :
Classtest operator +(Classtest&b){
return Classtest(this->value+b.value);
}
};
A+B
可以获得结果是因为执行了A.operator+(B);
该函数是A的成员函数所以可以直接访问A的私有数据
由于在类内执行的代码可以访问该类实例的私有成员
int operator +(Classtest&b){return this->value+b.value;}
如果在类外调用B.value;就会出错
该代码试图访问B的私有数据
但是类外的代码的访问权限不够.
(该函数是类内的代码,所以他可以访问类的私有数据)
访问B.value是否成功取决于代码的访问权限
访问权限由取决于访问在类外还是类内执行
------------------------------
#include <stdio.h>
#include <stdlib.h>
class Classtest{
private:
int value;
public:
//两个构造函数 :
Classtest(){value=0;}
Classtest(int j){value=j;}
//设置,和取值函数 :
void setvalue(int val){value=val;}
int getvalue(){return value;}
//重载加法操作符 :
Classtest operator +(Classtest&b){
return Classtest(this->value+b.value)//这个地方也可以使用b.getvalue();;
}
};
int main(void)
{
class Classtest j,b;
j.setvalue(2);
b.setvalue(4);
printf("%d\n",(j+b).getvalue());
;system("pause");
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
(1)我看懂了你的意思,你的意思是说对一个对象进行操作的过程中实质上对其私有成员也进行了操作,是吧!的确是这样的,本人佩服你的发现能力.
(2)书上一般写的不能访问是指不能直接访问,加上这样间接的访问是相当于在内部进行的.两个对象相加,肯定对各数据成员都进行了操作,包括私有的.
纯属个人观点,如有错误,请各位多多指出!
(2)书上一般写的不能访问是指不能直接访问,加上这样间接的访问是相当于在内部进行的.两个对象相加,肯定对各数据成员都进行了操作,包括私有的.
纯属个人观点,如有错误,请各位多多指出!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询