1) Correct. Creates an object of type CRectangle, and uses the default constructor.
2) Wrong. It will compile okay, but doesn't do what you expect. It does not create a CRectangle object. Instead it is a function prototype which returns a CRectangle. Much like how int foo(); declares a function called foo.
3) Wrong because rectb is not a pointer. However assuming that was a typo.. CRectangle* rectb = new CRectangle; is correct. Creates a CRectangle object dynamically using the default constructor.
4) Wrong for same reason number 3 is wrong. But assuming that was a typo: CRectangle* rectb = new CRectangle(); is correct and does what you'd expect -- the same thing as #3.