C++类private成员变量读取的一个疑问

steven30832 2011-03-28 11:13:13
如下的类定义:

class Stock
{
private:
char company[30];
int shares;
double share_val;
double total_val;
void set_tot(){total_val = shares * share_val;}
public:
Stock();
Stock(const char * co , int n = 0 , double pr = 0.0);
~Stock(){}
void buy(int num , double price);
void sell(int num , double price);
void update(double price);
void show() const;
const Stock & topval(const Stock & s) const;
};


topval 函数定义如下:

const Stock & Stock::topval(const Stock & s) const
{
std::cout<<s.total_val<<std::endl;
if(s.total_val > total_val)
{
return s;
}
else return *this;
}


我想问的就是,为什么这里可以直接用s.total_val来访问私有成员呢?
开始以为是因为参数为const的原因,结果发现不是。
现在理解为这是一个类的成员函数,当成了内部访问,但是针对该函数而言S是一个外部的对象,为什么也能进行访问呢?
我自己写了一个非类成员函数

void show(const Stock & s)
{
cout<<s.total_val<<endl;
}


编译报错,提示total_val是私有成员。。

作为类成员函数,参数中的类对象可以直接访问私有成员变量,这个机制是怎么回事呢?
...全文
134 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
宁谧青风 2011-03-28
  • 打赏
  • 举报
回复
在类中可以访问,类的私有成员; 类外就不能了

int main()
{
Stock st;
cout<<st.total_val<<endl;//cannot access private member declared in class 'Stock'
return 0;
}

Freedom 2011-03-28
  • 打赏
  • 举报
回复
在类里是可以访问private成员的 就像你自己的东西你自己都可以用一样,
如果是继承的话 就不能访问基类的private成员了 只能访问public成员
就像你自己隐私的东西你不能拿给别人用吧
wei801516 2011-03-28
  • 打赏
  • 举报
回复
private定义本类私有成员 就是让本类自己可以访问 而其他类不可以访问!~如果设置为友元的类就可以访问咯!~
delphiwcdj 2011-03-28
  • 打赏
  • 举报
回复
在类的成员函数里可以访问private成员
無_1024 2011-03-28
  • 打赏
  • 举报
回复
本类的对象当然当然可以访问本类的私有成员啊
pengzhixi 2011-03-28
  • 打赏
  • 举报
回复
A member of a class can be
— private; that is, its name can be used only by members and friends of the class in which it is
declared.
— protected; that is, its name can be used only by members and friends of the class in which it is
declared, and by members and friends of classes derived from this class (see 11.5).
— public; that is, its name can be used anywhere without access restriction.

加上一句,访问控制是针对类而不是针对对象的。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧