问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

为什么C++中静态成员函数无法调用重载插入流运算符号?

发布网友 发布时间:2022-05-22 01:15

我来回答

2个回答

热心网友 时间:2023-11-24 00:24

这是因为,用const修饰成员函数的函数体,在这个函数内就不能修改类的成员变量(也就是说传入的this指针变成常量指针)。为了保证在函数内类的成员不被改变,函数只能调用用const修饰的成员函数(因为非const成员函数有可能修改类成员),否则出现编译期错误。而你自定义的operator<<虽然不是成员函数,但是是友元(相当于成员函数,因为有机会修改类私有成员),因为不能保证常量性,故而不能被const修饰的成员函数调用(编译器调用决议决定了的,也就是this的属性决定了的),而Sex实际可以被转化为常量整型,编译器进行调用决议时会把sex转换成整型输出来。
你可以这样写你的show函数:
void show()const
{
cout << "const Sex:"<<const_cast<A*>(this)->sex<<endl;//去除this的常量性。这样就可以调用你自己定义的operator<<函数了。

}

再给你简单说说编译器的调用决议:
this指针指当前对象,一般分为以下几种(c++11为准):
1,non-const & this(c++98中不需要&):非const 成员函数中,this属于这一类,这类this只能调用非const函数
2,const & this(c++11以前标准中不需要&):在const修饰的成员函数中,this属于这一类,这类this只能调用const &(c++11以前标准中不需要&)修饰的函数
3, &&this(non-const 右值引用this):在用&&修饰的成员函数中,this属于这一类,&&this只能调用&&修饰的函数。(c++11新引入特性,右值引用所需要的)。

注:c++11是最新的标准版本,支持编译器很少,还没流行开。前面两种属于左值this,后面一种属于右值this。在成员函数中调用成员函数,调用决议根据this的种类进行。

故而我们可以越过编译器,将const this强转为non-const this,从而使决议不再调用const,而调用non-const函数。

热心网友 时间:2023-11-24 00:25

这是因为,用const修饰成员函数的函数体,在这个函数内就不能修改类的成员变量(也就是说传入的this指针变成常量指针)。为了保证在函数内类的成员不被改变,函数只能调用用const修饰的成员函数(因为非const成员函数有可能修改类成员),否则出现编译期错误。而你自定义的operator<<虽然不是成员函数,但是是友元(相当于成员函数,因为有机会修改类私有成员),因为不能保证常量性,故而不能被const修饰的成员函数调用(编译器调用决议决定了的,也就是this的属性决定了的),而Sex实际可以被转化为常量整型,编译器进行调用决议时会把sex转换成整型输出来。
你可以这样写你的show函数:
void
show()const
{
cout
<<
"const
Sex:"<<const_cast<A*>(this)->sex<<endl;//去除this的常量性。这样就可以调用你自己定义的operator<<函数了。
}
再给你简单说说编译器的调用决议:
this指针指当前对象,一般分为以下几种(c++11为准):
1,non-const
&
this(c++98中不需要&):非const
成员函数中,this属于这一类,这类this只能调用非const函数
2,const
&
this(c++11以前标准中不需要&):在const修饰的成员函数中,this属于这一类,这类this只能调用const
&(c++11以前标准中不需要&)修饰的函数
3,
&&this(non-const
右值引用this):在用&&修饰的成员函数中,this属于这一类,&&this只能调用&&修饰的函数。(c++11新引入特性,右值引用所需要的)。
注:c++11是最新的标准版本,支持编译器很少,还没流行开。前面两种属于左值this,后面一种属于右值this。在成员函数中调用成员函数,调用决议根据this的种类进行。
故而我们可以越过编译器,将const
this强转为non-const
this,从而使决议不再调用const,而调用non-const函数。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么网址更新火影忍者集数最快 如果你跟男朋友分手了,他的回答是顺其自然这是什么意思,我该怎么办... 一个女人像男人提分手男人说顺其自然是什么意思 上线两年《X-HERO》如何做到登顶多个国家榜首的? 龙武游戏怎么样费钱吗 Q1游戏公司产品 中国现有什么银行 x.最近六个月的通话记录? 爱奇艺会员哪里买便宜 爱奇艺会员免费领取 iphone4 怎样删除原来的旧凯立德地图 java所有的方法都可以重载吗 一个JAVA的问题? java静态方法为什么不能重写 脚趾骨折多久可以恢复,已经有两个月了 脚趾骨折了多久可以恢复 请问脚趾骨折多久才愈合? 脚趾骨折要多久才可以恢复啊? 大脚趾骨折需要多久 脚止骨折要多久恢复 脚趾骨折多久才能好? 脚趾骨折多久能消肿 猫,狗,猪,鸡之间会发生什么故事呢 一只猫一条狗一头猪和一只鸡的故事? 谁有邮政分信的实习周记 谢谢 为什么这么多猫和猪的故事啊 猫和猪是好朋友那个故事。作文怎么写 小猪掉到坑里了这篇故事 求一故事,大意是一只动物掉进了陷阱里,喊救命时别的动物听见了装作没听到走开了,只有猪听到了后拼命去救。 根据猫和猪的故事怎样写作文 小猪和猫 能为这个故事准备个更好的结局吗? 没驾驶证没系安全带怎么处理 我被杀过狗的刀,割伤了一点皮会不会得狂犬病? 我很喜欢狗,可是我今天居然把他杀死了,我心痛,我后悔,我难过,我后悔的要死,我后悔到我宁愿用自己的 后爸有点*、天天晚上磨刀昨晚家里养了5年的狗一直叫不停竟然拿刀桶下狗肚子、还活杀了它将它分尸、一 EQ4H发动机的4H装配线 这个人物出现在西游记第几集? t·cn&#47;rgvelzn是啥网址?今早连续两人发信息,告诉我有上传图片。 西游记一共有多少集.多少难 ?具体的. 求《济公后传》以及《济公后传续》2本电子书,有的话请发amwrgv9@sina.com 西游记,盘丝洞那集,是谁给孙悟空指路去找琵兰婆婆的? 技嘉E845 主板指示灯在哪啊? 全国接待千人会议的酒店有哪些? 昆明适合千人会议的会议酒店有哪些? 尼加拉瓜为何与中国断交? 尼加拉瓜的历史沿革 丹尼尔·奥尔特加的介绍 伊朗为什么反美?? 共产党成立多少年? 西奥多罗斯福的政治改革举措 好的追加 罗斯福正式当选总统是1932年还是1933年?