为什么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函数。