const转化的疑问?
class A
{
public:
void Do() const
{
std::cout<<"const"<<std::endl;
}
void Do()
{
std::cout<<"noconst"<<std::endl;
}
public:
std::string m_str;
};
A a;
(static_cast<const A>(a)).Do();
输出的是noconst,也就算调用的是非const版本的Do;
(static_cast<const A>(a)).Do()该为(static_cast<const A&>(a)).Do()
或者A中去掉成员变量std::string m_str或者成员变量改为int m_n,
这种情况下输出的是const,调用的是const版本,求解?
[解决办法]
编译器的问题
[解决办法]
编译器在捣鬼,不去探究了,mark一下,看看高人的解释。
[解决办法]
MSDN:
const_cast Operator
C++ Specific
const_cast < type-id > ( expression )
The const_cast operator can be used to remove the const, volatile, and __unaligned attribute(s) from a class.
END C++ Specific
一:
class A
{
public:
void Do() const
{
std::cout<<"const"<<std::endl;
}
void Do()
{
std::cout<<"noconst"<<std::endl;
}
public:
//const
//std::string m_str;
int n = 0;
};
int main(int argc, char* argv[])
{
A a;
const A aa;
(static_cast<const A>(a)).Do(); //1) const A* this const
(static_cast<const A&>(a)).Do(); //2) const A* this const
(const_cast<const A&>(a)).Do(); //3) const A* this const
(const_cast< A& >(aa)).Do(); //4) A* this const
aa.Do(); //5 const A* this const
a.Do(); //6 A* this const
}
1)const
2)const
3)const //const_cast 用于转换const,volatile这个是,非const,转const
4)noconst //这个是const,转非const
5)const
6)noconst
二:
class A
{
public:
void Do() const
{
std::cout<<"const"<<std::endl;
}
void Do()
{
std::cout<<"noconst"<<std::endl;
}
public:
//const
//std::string m_str;
int n = 0;
};
int main(int argc, char* argv[])
{
A a;
const A aa;
(static_cast<const A>(a)).Do();
(static_cast<const A&>(a)).Do();
(const_cast<const A&>(a)).Do();
(const_cast< A& >(aa)).Do();
aa.Do();
a.Do();
}
结果:一和二没有变化,效果一致
const
const
const
noconst
const
noconst
调用函数的版本,由调用时传入的隐藏参数 ,this指针的类型决定
const 对象,指针,引用调用时,传入的隐藏参数类型为 const A* this const;
非const 对象,指针,引用调用时,传入的隐藏参数类型为 A* this const;
不知道,你都有哪些疑问?
[解决办法]
class A
{
public:
void Do() const
{
std::cout<<"const"<<std::endl;
}
void Do()
{
std::cout<<"noconst"<<std::endl;
}
public:
std::string m_str;
};
A a;
(static_cast<const A>(a)).Do();
输出的是noconst,也就算调用的是非const版本的Do;
(static_cast<const A>(a)).Do()该为(static_cast<const A&>(a)).Do()
或者A中去掉成员变量std::string m_str或者成员变量改为int m_n,
这种情况下输出的是const,调用的是const版本,求解?
不用搞了,是你的编译器出现了非标准行为,是错误的行为。你用g++编译一下就明白了。