Personally I find the majority of classes I use to be effectively stateless with small functions, only using member variables for storing configuration/constants and references to the injected dependencies for that function. Communication between functions uses structs (well, and single parameters and data structures). Because they best encapsulate the idea of data being passed around.
The minority are either data stores that encapsulate the state of the system by exposing CRUD operations, or implementations of data structures.
Encapsulating the concepts of data structures and data stores is quite possibly the most useful part of OO most of the time, being able to pass around a vector is simpler than passing around pointers because it encapsulates all the important information. It directly encodes that X is a dynamic array of Y. Likewise shared_ptr and unique_ptr are much easier to work with than naked pointers.
The way I see it, the biggest mistake people make with approaching OO, and the common issue with the way people are taught how to use objects, is that it's often not correctly impressed upon a programmer that whilst objects exist to encapsulate state and application logic, they aren't supposed to encapsulate both at the same time.
/rantover
So my advice for the best way to learn C++ is to first learn the procedural way for C++, then learn the OO way for C++11, so also learn lambdas and smart pointers as well as learning how to use the various data structures and smart pointers, then learn how to use templates, then learn Java or C#, then read "Clean Code" by Robert Martin, then read "Test Driven Development: By Example" by Kent Beck, then go and learn Haskell. When you return to C++ you'll maybe be able to write readable good C++ code.
Although if you stopped at Haskell, I wouldn't blame you
/rantactuallyover