读书人

const转化的疑点

发布时间: 2014-01-14 23:14:00 作者: rapoo

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

引用:
Quote: 引用:

试试这个程序,看都调用哪个函数:

#include<iostream>
class A
{
public:
void Do() const
{
std::cout<<"const"<<std::endl;


}
void Do()
{
std::cout<<"noconst"<<std::endl;
}
public:
std::string m_str;
};

int main(int argc, char* argv[])
{
A a;
const A aa;
(static_cast<const A>(a)).Do(); // (static_cast<const A>(a))--> const A对象
(static_cast<const A&>(a)).Do(); // (static_cast<const A&>(a))--> const A引用
(const_cast<const A&>(a)).Do(); // (const_cast<const A&>(a))--> const A引用
(const_cast< A& >(aa)).Do(); // (const_cast< A& >(aa))--> 非const A对象

aa.Do(); //const A对象
a.Do(); //非const A对象
return 0;
}



我上面重新叙述了一遍,我知道这些的运算结果,只是对其中几个表示疑问,不知道怎么解释这种差异...

调用函数的版本,由调用时传入的隐藏参数 ,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++编译一下就明白了。

读书人网 >C++

热点推荐