constは値が変更できない変数でconstexprはこの機能を使用することで、コンパイル時に値が決定する定数、"コンパイル時に実行される関数"、"コンパイル時にリテラルとして振る舞うクラスを定義できる"

1、コンパイル時に実行される関数
2、コンパイル時にリテラルとして振る舞うクラスを定義できる"
3、visual studio 2017の環境下では#define NUMBER 5 と定義すると「constexprに変えたらどうですか?」みたいな提案のマークがでるのですがそうしたほうがいいのでしょうか?場合にもよると思うのですが教えてほしいです。

この三つの意味を教えてほしいです。

//#define NUMBER 5
constexpr auto NUMBER = 5;

constexpr int num = 5;
const int n = 5;

int main() {
    _getch();
    return 0;
}