类是一个数据与函数的集合体。以游戏为例,如果我们用变量来描述游戏中人物的信息,我们需要描述他的坐标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(); }