Ask a dozen people what OOP means, get a dozen answers.
What follow is 100% my opinion and the other eleven people will disagree.
To me, it's about thinking. It's about the solution to a given problem I come up with inside my head (and on paper sketches) being a model that lends itself to object-heavy implementation.
For example, if I was going to write a program to experimentally simulate queues in a post office, I might decide that each person will be represented by an object, and each queue is also going to be an object, and each open window is going to be an object. Each person will know how long it has been waiting, a queue will be an object containing many people, each window will be an object that takes a person from the front of a queue.
I could then create this in a very OOP fashion. I could write it in C. I could write it in C++. I could write it LISP. Some languages would make it easier than others, because some languages come with easy ways to create and manage these independent objects, but OOP isn't in the language; it's in the design.
To me, an int can be an object. A single char can be an object. It's all about the model, and how I'm building it in code, and how the parts interact.
Languages that make this easy often provide classes and structs and class functions and containers to collect groups of objects together and so on, but that's not OOP; that's just tools that make implementing an OOP easier.
If I have some disparate functions, and I stick them all inside a class, I can call that an object if I like, but it's not OOP. That object isn't part of a coherent design that's easy to think about and easy to reason about because I've modeled it as objects interacting.
In situations where there will only be one instance of any given objects, I find myself dubious as to the value of OOP thinking in such case. Sometimes, it just seems like objects for the sake of it. For example, sometimes I see something like this:
1 2 3 4 5
|
int main()
{
Gameobject game;
game.run();
}
|
and I wonder if there really was a benefit to this single "Gameobject" existing, and would it have been better expressed as something like:
1 2 3 4 5 6 7 8 9 10 11
|
int main()
{
// Init code
while (keepRunning)
{
// main loop
}
// teardown code
}
|