The most conspicuous unsupported features are "new" and "delete".
Someone else may have a different opinion, but I believe the specific answer is that there is no default implementation of new and delete, however they are operators and may be overloaded on a per-class basis. Hence you can implement your own allocator for your classes. The main issue is that you will need to manage your own heap and the details of ensuring that it doesn't extend down into the stack are likely quite complex.
Also, there is no STL support, and apropos built-in types, short and int are 16 bits, long is 32 bits and float and double are identical (32-bit floating-point).
The "Morse morse(13);" example creates an instance of the class, and calls the constructor for the class, but does so in statically allocated memory.
Sort of. The calculation of the amount of space each object requires is done at compile time, the space is allocated on the stack at runtime.
For instance, if a function foo() defines an object of type Morse:
void foo() {
Morse morse(13);
<do something>
return;
}
and another function bar() calls foo():
void bar() {
int someInt;
foo();
return;
}
and the loop() calls both:
void loop() {
int anInt;
foo();
bar();
}
During the first call to foo() (directly from loop()), the Morse object is created on the stack at a particular memory location, and destroyed when the function call returns. During the second call to foo() (via bar()), the Morse object will be in a different location in memory as there is a stack frame for the bar() function active (with the someInt variable in it).