首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

const转化的疑点

2014-01-14 
const转化的疑问?class A{public:void Do() const{std::coutconststd::endl}void Do(){std::cout

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++编译一下就明白了。

热点排行