C++类
C++的类长什么样?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include <iostream>
class Player { int x, y; int speed; };
int main() { Player player; player.x = 0; player.y = 0; player.speed = 0; return 0; }
|
以上Class就构成了C++最简单的一个类,但是如果编译就会发现报错,这是因为C++类成员变量不经过任何声明默认就是私有的。
1 2
| D:\MyCppProject\untitled\main.cpp:12:12: error: 'int Player::x' is private within this context 12 | player.x = 0;
|
当定义成如下形式,就可以正常访问
1 2 3 4 5 6 7
| class Player { public: int x, y; int speed;
};
|
加入方法的形式
1 2 3 4 5 6 7 8 9 10 11 12
| class Player { public: int x, y; int speed;
void Move(int xa, int ya) { x += xa * speed; y += ya * speed; }
};
|
C++类与结构体的比较
C++类成员方法和成员变量默认都是private的,但是在struct中它们是public的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <iostream>
class Player { int x, y; int speed;
void move(int xa, int ya) { x += xa * speed; y += ya * speed; }
};
int main() { Player player; player.x = 0; player.y = 0; player.speed = 0; player.move(1,1); return 0; }
|
当我们去掉public的声明形式,编译不会通过,因为x,y以及move函数都是不可见无法访问的,但是当你将类换成结构体就可以访问了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include <iostream>
struct Player {
int x, y; int speed;
void move(int xa, int ya) { x += xa * speed; y += ya * speed; }
};
int main() { Player player; player.x = 0; player.y = 0; player.speed = 0; player.move(1,1); return 0; }
|
你甚至可以在struct里进行private声明
1 2 3 4 5 6 7 8 9 10 11 12
| struct Player { private: int x, y; int speed;
void move(int xa, int ya) { x += xa * speed; y += ya * speed; }
};
|
这样就又回到了最初Class里定义成priavte的状态,即外部无法访问。
从技术上来说Class和Struc的区别就这些了,除了可见性之外,Class支持的特性Struct也都支持(比如继承),但当我们实际使用时,更推荐当仅仅需要将不同变量进行组合时使用Struct,需要涉及到方法时使用Class。
麻雀虽小五脏俱全的类
这是一个小demo,之后的学习将以这个demo为基础引入各种概念进行改进
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #include <iostream>
class Log { public: const int LogLevelError = 0; const int LogLevelWarning = 1; const int LogLevelInfo = 2; private: int m_LogLevel = LogLevelInfo; public: void SetLevel(int level) { m_LogLevel = level; }
void Error(const char *message) { if (LogLevelError <= m_LogLevel) { std::cout << "[Error]: " << message << std::endl; } }
void Warn(const char *message) { if (LogLevelWarning <= m_LogLevel) { std::cout << "[WARNING]: " << message << std::endl; } }
void Info(const char *message) { if (LogLevelInfo <= m_LogLevel) { std::cout << "[Info]: " << message << std::endl; } } };
int main() { Log log; log.SetLevel(log.LogLevelWarning); log.Warn("hello"); log.Error("hello"); log.Info("hello"); return 0; }
|