Not to bash on the existing answers, but they're missing an element (that's arguably a standard defect).
An object is a region of storage. [ Note: A function is not an object, regardless of whether or not it occupies storage in the way that objects do. — end note ]
An object is created by a definition ([basic.def]), by a new-expression ([expr.new]) or by the implementation ([class.temporary]) when needed.
The properties of an object are determined when the object is created.
An object is a region of storage in which constuction has taken place. In fact, most of the time "object" refers to that constructed entity, with its value and state, whereas "storage" just means the memory (or whatever) it is written on.
The difference can be a simple detail:
// `s` names an object that has been constructed... somewhere.
// That storage will live exactly as long as necessary to back `s`
// as long as the object exists -- no need to worry about it.
std::string s = "hello";
// Using the object
std::cout << s << '\n';
But you can also (although it's very rarely useful) separate the object's lifetime from the lifetime of its storage:
// `storage` points at a chunk of... storage.
// It hasn't been initialized, nor does it have a type.
void *storage = malloc(sizeof(std::string));
// Now we constructed an `std::string`:
// we have an actual object inhabiting the storage!
std::string *s = new (storage) std::string("hello");
// Using the object, through the pointer we have
std::cout << *s << '\n';
// Now we destruct the object: it exists no more.
s->~basic_string();
// Now we destroy the storage.
free(storage);
I must stress that this last example is for demonstration purposes only. It's a technique you probably won't encounter, and has been performed here with no error checking whatsoever. Don't try this at home :)
Now, how does it relate to the OOP "object"? Well... not at all. "Object" is a very generic term, and OOP founders just chose to use it as well, independently.