The resource expression class declaration can only be evaluated once whereas you can do an include as may times as you like. You use the resource expression class if you want/need to set parameters from your manifest. It is highly recommended to use hiera and automatic data binding for this as that enables you to always just include the class. If you do use the resource expression class declaration expression, you can include that class (without parameters) as many times as you like - provided that you first define it with parameters. (Done in some other order it will ail with an error).
There is one more difference. When you use include, the class is immediately evaluated, but when using the resource expression class declaration the evaluation is queued, and the class is defined at a later point in time. This only matters if you are using logic in your manifests that are "evaluation order dependent" (there are only a few of them, and the documentation for those operations should clearly say that it depends on the order of evaluation (often referred to in error as "parse order")