【 c++ 二元运算符重载,以<<(抽取符)为例,说清为什么它支持hex,endl等操作函数】

/* author: hjjdebug
   date  : 2023年 09月 24日 星期日 16:29:55 CST
   description: c++ 的 cout 对象, 及hex,endl,showbase等控制函数很难说清其工作原理
   网上的文章也都在讲它怎么用,但没有讲为什么这么用,及为什么它能这么用!,
   这里干脆用c 代码的形式实现一次, 就知道它们的工作原理了.
   是的,这得益于c++ 对操作符的重载!
     c++ 二元运算符重载,以<<(抽取符)为例,说清为什么它支持hex,endl等操作函数

   */
#include

class my_ostream
{
public:
    my_ostream &operator<<(int d);
    my_ostream &operator<<( my_ostream& fun(my_ostream &));
    friend     my_ostream &hex(my_ostream &os);
    friend     my_ostream &dec(my_ostream &os);
    
private:
    int m_type=0;
};
// 重载 << 操作符
// 返回值 是this 对象
// 根据this 对象的属性,给出不同的类型输出
my_ostream &my_ostream::operator<<(int d)
{

    if(m_type==0)
    {
        printf("%d\n",d);
        
    }
    else if(m_type==1)
    {
        printf("0x%x\n",d);
    }
    return *this;
}


//也可以定义一个函数类型简化书写,typedef my_ostream& HEX(my_ostream &);
//要想支持hex函数,需定义一个hex那样的函数类型为它的参数, 继续重载<< 操作符
//执行这个函数,把this对象传给这个函数做参数,从而改变this 对象的属性

my_ostream &my_ostream::operator<<(my_ostream& fun( my_ostream &))
{
    fun(*this); //执行这个函数,把this对象传给这个函数做参数
    return *this;
}

//定义hex 函数, 可以修改os 的一些属性
my_ostream &hex( my_ostream &os)
{
    os.m_type=1;
    return os;
}
my_ostream &dec( my_ostream &os)
{
    os.m_type=0;
    return os;
}

int main()
{
    my_ostream my_cout;
    my_cout<<100;
    my_cout<     return 0;
}

/* 执行结果
   ./test
   100
   0x64
   100
*/

你可能感兴趣的:(#,c++,编程,c++,ostream,hex,dec,endl)