C++11强类型枚举,友元函数重载输出运算符ostream

C++11强类型枚举,友元函数重载输出运算符ostream

使用C++ 11 强类型枚举enum class 定义Boy对象的职业枚举 JobType

C++标准的枚举类型被认为是不安全的,其枚举类型被视为整数。不同的枚举类型之间  枚举值可以进行比较。


定义友元重载<<运算符

friend std::ostream& operator<<(std::ostream& os,const Boy& boy);


Boy.h

#pragma once
#include <string>
#include <iostream>

//C++ 强类型枚举
enum class JobType{
    IT,
    DBS
};

class Boy
{
public:
    Boy(std:string name="未知", int age=0, JobType job = JobType::IT);
    ~Boy(void);
    friend std::ostream& operator<<(std::ostream& os,const Boy& boy);
public:
    std::string name;
    int age;
    JobType job;
}

std::ostream& operator<<(std::ostream& os,const Boy& boy);

以上便是Boy类的.h文件了,我们目标是通过有原函数输出  Boy类对象的 名字 年龄 职业的相关信息。

Boy.ccp

#include "Boy.h"

//Boy::Boy(std:string name="未知", int age=0, JobType job = JobType::IT)//这种写法相信大家都应该知道会编译失败:重定义
Boy::Boy(std:string name, int age, JobType job)
{
    this->name = name;
    this->age = age;
    this->job = job;
}
std::ostream& operator<<(std::ostream& os,const Boy& boy)
{
    os<<"name: "<<boy.name<<" age: "<<boy.age<<" job: ";
    switch(boy.job)
    {
    case JobType::IT:
        os<<"计算机IT";
        break;
    case JobType::DBS:
        os<<"数据库管理员";
        break;
    default:
        os<<"未知";
        break;
    }
    return os;
}
Boy::~Boy(void)
{}

到这里代码就结束了,再写个main测试一下

main.cpp

#include <iostream>
#include "Boy.h"

int main(void)
{
    const Boy boy("张三",27,JobType::DBS);
    std::cout<<boy<<std::endl;
    system("pause");
    return 0;
}

所有代码结束:

name: 张三 age: 27 job: 数据库管理员