[求助]半吊子Cer转C++中,类问题求助。

u010357173 2014-02-03 11:01:51
class Time{
private:
int hours;
int minutes;
public:
Time(int h = 0,int m = 0);
void AddMin(int m);
void AddHr(int h);
void Reset(int h = 0,int m = 0);
Time Sum(const Time & t)const;
void Show()const;
};
……
Time Time::Sun(const Time & t)const
{
Time sum;
sum.minutes = minutes + t.minutes;
sum.hours = hours + t.hours+ sum.minutes/60;
sum.minutes%=60;
return sum;
}

以上是我有疑问的类定义,代码出自《C++ Primer Plus第五版》。
如代码所示,类成员hours和minutes都被定义为private,public成员函数却通过引用传递t对象,并在函数中对其minutes和hours成员进行直接访问。这样可以吗?
...全文
205 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2014-02-12
  • 打赏
  • 举报
回复
引用 9 楼 buyong 的回复:
[quote=引用 8 楼 u013524455 的回复:] [quote=引用 5 楼 ALNG 的回复:] [quote=引用 2 楼 u010357173 的回复:] 就是说,类的对象a调用的成员函数,可以访问同一类对象b的private成员吗?
完全可以!不然如何复制/移动构造? 如何assignment? 比如C++的一个典型的用法

class C{
public:
    C(const C& c):name(c.name){}// 这里本对象的name只读访问了c的name
    C(C&& c):name(std::move(c)){}// 这里甚至把c的name直接挪过来,操作之后this的name成了
                                 // 原来的c.name, 而c.name则变成了空串
                                 // 这个是C++为了追赶C的效率在C++11中新引入的能力
                                 // 旧一点的编译器还不支持。如果你的编译器抱怨这个代码有问题
                                 // 那是因为它还生活在前C++11时期。
private:
    std::string name;
}; 
这种访问同意类的其他对象的私有成员的能力不光是C++允许的,而且是唯一合乎逻辑的。这个不能类比于人类这个类的对象,比如你的私有财产,那另一个对象,比如我,就不可以随便访问。这是两码事。[/quote] 不过很多编译器都报错了[/quote] impossible? what error?[/quote]
引用 9 楼 buyong 的回复:
[quote=引用 8 楼 u013524455 的回复:] [quote=引用 5 楼 ALNG 的回复:] [quote=引用 2 楼 u010357173 的回复:] 就是说,类的对象a调用的成员函数,可以访问同一类对象b的private成员吗?
完全可以!不然如何复制/移动构造? 如何assignment? 比如C++的一个典型的用法

class C{
public:
    C(const C& c):name(c.name){}// 这里本对象的name只读访问了c的name
    C(C&& c):name(std::move(c)){}// 这里甚至把c的name直接挪过来,操作之后this的name成了
                                 // 原来的c.name, 而c.name则变成了空串
                                 // 这个是C++为了追赶C的效率在C++11中新引入的能力
                                 // 旧一点的编译器还不支持。如果你的编译器抱怨这个代码有问题
                                 // 那是因为它还生活在前C++11时期。
private:
    std::string name;
}; 
这种访问同意类的其他对象的私有成员的能力不光是C++允许的,而且是唯一合乎逻辑的。这个不能类比于人类这个类的对象,比如你的私有财产,那另一个对象,比如我,就不可以随便访问。这是两码事。[/quote] 不过很多编译器都报错了[/quote] impossible? what error?[/quote] 提示在xxx成员函数中xxx是私有对象,你可以自己去试试
buyong 2014-02-12
  • 打赏
  • 举报
回复
引用 8 楼 u013524455 的回复:
[quote=引用 5 楼 ALNG 的回复:] [quote=引用 2 楼 u010357173 的回复:] 就是说,类的对象a调用的成员函数,可以访问同一类对象b的private成员吗?
完全可以!不然如何复制/移动构造? 如何assignment? 比如C++的一个典型的用法

class C{
public:
    C(const C& c):name(c.name){}// 这里本对象的name只读访问了c的name
    C(C&& c):name(std::move(c)){}// 这里甚至把c的name直接挪过来,操作之后this的name成了
                                 // 原来的c.name, 而c.name则变成了空串
                                 // 这个是C++为了追赶C的效率在C++11中新引入的能力
                                 // 旧一点的编译器还不支持。如果你的编译器抱怨这个代码有问题
                                 // 那是因为它还生活在前C++11时期。
private:
    std::string name;
}; 
这种访问同意类的其他对象的私有成员的能力不光是C++允许的,而且是唯一合乎逻辑的。这个不能类比于人类这个类的对象,比如你的私有财产,那另一个对象,比如我,就不可以随便访问。这是两码事。[/quote] 不过很多编译器都报错了[/quote] impossible? what error?
「已注销」 2014-02-04
  • 打赏
  • 举报
回复
引用 5 楼 ALNG 的回复:
[quote=引用 2 楼 u010357173 的回复:] 就是说,类的对象a调用的成员函数,可以访问同一类对象b的private成员吗?
完全可以!不然如何复制/移动构造? 如何assignment? 比如C++的一个典型的用法

class C{
public:
    C(const C& c):name(c.name){}// 这里本对象的name只读访问了c的name
    C(C&& c):name(std::move(c)){}// 这里甚至把c的name直接挪过来,操作之后this的name成了
                                 // 原来的c.name, 而c.name则变成了空串
                                 // 这个是C++为了追赶C的效率在C++11中新引入的能力
                                 // 旧一点的编译器还不支持。如果你的编译器抱怨这个代码有问题
                                 // 那是因为它还生活在前C++11时期。
private:
    std::string name;
}; 
这种访问同意类的其他对象的私有成员的能力不光是C++允许的,而且是唯一合乎逻辑的。这个不能类比于人类这个类的对象,比如你的私有财产,那另一个对象,比如我,就不可以随便访问。这是两码事。[/quote] 不过很多编译器都报错了
u010357173 2014-02-03
  • 打赏
  • 举报
回复
就是说,类的对象a调用的成员函数,可以访问同一类对象b的private成员吗?
ooolinux 2014-02-03
  • 打赏
  • 举报
回复
学习了
孩皮妞野 2014-02-03
  • 打赏
  • 举报
回复
可以。单从访问权限而言,一个类的private成员变量和成员函数可以被其本身的成员函数和友元访问。public可为世界访问,protected可以为其派生类、友元访问。
孩皮妞野 2014-02-03
  • 打赏
  • 举报
回复
引用 2 楼 u010357173 的回复:
就是说,类的对象a调用的成员函数,可以访问同一类对象b的private成员吗?
完全可以!不然如何复制/移动构造? 如何assignment? 比如C++的一个典型的用法

class C{
public:
    C(const C& c):name(c.name){}// 这里本对象的name只读访问了c的name
    C(C&& c):name(std::move(c)){}// 这里甚至把c的name直接挪过来,操作之后this的name成了
                                 // 原来的c.name, 而c.name则变成了空串
                                 // 这个是C++为了追赶C的效率在C++11中新引入的能力
                                 // 旧一点的编译器还不支持。如果你的编译器抱怨这个代码有问题
                                 // 那是因为它还生活在前C++11时期。
private:
    std::string name;
}; 
这种访问同意类的其他对象的私有成员的能力不光是C++允许的,而且是唯一合乎逻辑的。这个不能类比于人类这个类的对象,比如你的私有财产,那另一个对象,比如我,就不可以随便访问。这是两码事。
「已注销」 2014-02-03
  • 打赏
  • 举报
回复
这应该是错误吧
ztenv 版主 2014-02-03
  • 打赏
  • 举报
回复
引用 2 楼 u010357173 的回复:
就是说,类的对象a调用的成员函数,可以访问同一类对象b的private成员吗?
可以,当然这和编译器相关,有的检查有的不检查;

65,186

社区成员

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

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