• c++中的类


    类是一个数据与函数的集合体。以游戏为例,如果我们用变量来描述游戏中人物的信息,我们需要描述他的坐标x,y表示他在屏幕中的位置,还有他移动的速度,如果我们要引入第二个玩家,那么就需要同样含义的变量来进行描述,同时名字还要与第一个任务的这些变量不同。引入类会使得工作更加简单。

    #include<iostream>
    
    #define Log(x) std::cout<<x<<std::endl
    
    class Player
    {
    public:
        int x,y;//position
        int speed;
    };
    
    int main()
    {
        Player player;
        player.x=5;
        
        std::cin.get();
    }

    如果不加public的话将x赋值为5的操作将会出错,因为类中的数据默认是私有类型(private),私有类类外是无法进行访问的,所以需要在数据前加上public。同时函数时可以定义在类内的

    #include<iostream>
    
    #define Log(x) std::cout<<x<<std::endl
    
    class Player
    {
    public:
        int x,y;//position
        int speed;
    
        void Move(int xa,int ya)
        {
            x+=xa*speed;
            y+=ya*speed;
        }
    };
    
    int main()
    {
        Player player;
        player.x=5;
        player.Move(-1,1);
        std::cin.get();
    }

    如果在类外写Move函数,则需要使用引用或者指针

    void Move(Player& player,int xa,int ya)
    {
        player.x+=xa*player.speed;
        player.y+=ya*player.speed;
    }

    class和struct的区别

    在没有特殊说明的情况下,类内成员默认是私有的,而struct内的成员默认是公有的,这就是他们之间的区别。如果将类中的public去掉,那么程序就会报错类内成员不可访问,此时将class换成struct就好了,同样的,将struct中的变量前加上private,就会出现同样的错误。c++中之所以还存在结构体是为了维持和c语言的兼容性。因为c语言中没有类的概念,只有结构体,如果c++中删除结构体的概念,那么c++和c就会彻底失去兼容性。当然可以用宏定义来解决这个问题,比如

    #define struct class

    这样所有的struct就被替换成了class,但是私有和公有的问题仍然存在。什么时候使用结构体什么时候使用类呢?当建立一个新的数据结构,类似于向量,只包含x,y两个浮点数(float)时,用struct比较好,而我们要实现一个功能复杂的东西时,使用class显然更好。涉及到继承的时候也要用类而非结构体。

    怎样在c++中写类

    以一个分级输出的类别举例,通过类中的成员,来设置多级输出。

    #include<iostream>
    
    class Log
    {
    public:
        const int LogLevelError=0;
        const int LogLevelWarning=1;
        const int LogLevelInfo=2;
    private:
        int m_LogLevel=LogLevelInfo;//m means this member is private
                                                    //m_logLevel=LogLevelInfo, print everything
    public:
        void setLevel(int level)
        {
            m_LogLevel=level;
        }
        void Error(const char* message)
        {
            if(m_LogLevel>=LogLevelError)
                std::cout<<"[Error]"<<message<<std::endl;
        }
    
        void Warn(const char* message)
        {
            if(m_LogLevel>=LogLevelWarning
                std::cout<<"[WARNING]"<<message<<std::endl;
        }
        void Info(const char* message)
        {
            if(m_LogLevel>=LogLevelInfo
                std::cout<<"[Info]"<<message<<std::endl;
        }
    };
    
    int main()
    {
        Log log;
        log.setLevel(log.LogLevelWarning);//根据设置的LogLevel来实现不同的输出
        log.Error("Hello");
        log.Warn("Hello");
        log.Info("Hello");
        std::cin.get();
    }
  • 相关阅读:
    【C++】深度探索C++对象模型读书笔记--关于对象(Object Lessons)
    【操作系统】调度算法
    【vim】vim常用命令
    【linux】linux的数据流重定向
    以太网帧,IP,TCP,UDP首部结构
    IPv4编址及子网划分
    【计算机网络】计算机网络模型
    【计算机网络】NAT:网络地址转换
    【设计模式】C++中的单例模式
    (转)linux查找技巧: find grep xargs
  • 原文地址:https://www.cnblogs.com/wangtianning1223/p/12654672.html
Copyright © 2020-2023  润新知