I wouldn't say "very basic", I've heard that even experienced programmers sometimes have problems with pointers. But anyways, I have ordered book named "C++ Primer, I guess that is good enough.
The problem is less due to pointers themselves and more due to problems relating to manual memory management (which utilizes pointers).
One you learn how to properly use pointers (and really, it's not that hard, maybe 30 minutes tops for some basic usage), it wouldn't hurt to learn about a couple common data structures, like dynamic arrays, linked lists, ring buffers, etc.
In C, you'd have to implement everything yourself. No RAII, no templates, every single data structure has to be manually managed with every operation. And this isn't a simple "I know this pointer points to x", this dealing with pointers that point to other pointers, pointers to point to memory held my other pointers, pointers that point to memory held by other pointers held with pointers. And no memory leaks or segmentation faults are acceptable.
In C++, there's templates so the C++ standard library can abstract away from some common data structures for you (vector, list, and queue, for example, all use pointers internally to manage their data). There's also smart pointers, which can be helpful. So you're not going to have to deal with all that chaos, at least not if you don't want to (and you might, say, if you want a custom allocater, or something).
This chaos is why people use manged languages, by the way.
Not that C++ is bad, it's that is can get a bit hairy sometimes.
I don't understand how this helps me in this situation I am not passing anything to function, I just want an instance of WindowManager without calling its constructor.
You can't. That's how object creation works. It gets constructed when it's created, and destructed when it's destroyed. It's basically a contract to the object that says "
You get to be able to have your initialization code run once when it's created, allowing any set of arguments you want, and your deinitialization code run once when you get destroyed, but you cannot get any arguments". It's there so that you can be 100% sure every object is as valid as it needs to be; you can't have an uninitialized object. That and every object can free every resource it has implicitly.
If you don't want it to be called twice, you create one object. You can pass a reference to this object as long as the object you're referencing doesn't go out of scope before the object holding the reference does (otherwise the object gets deleted before it's finished being used and you'll probably crash your program).