When we say that object A owns object B, what we mean is that object A manages the lifetime of object B--that A controls the construction, copying, moving, and destruction of object B. The user of object A can (and should) "forget about" managing B (for example, via explicit calls to delete B, fclose(B), and so on).
The simplest way for an object A to "own" an object B is for B to be a member variable of A. For example:
struct owning_A {
B b_;
};
struct non_owning_A {
B& b_;
};
void test()
{
B b;
// a1 takes ownership of [a copy of] b.
owning_A a1 { b };
// a2 merely holds a reference to b;
// a2 doesn't own b.
non_owning_A a2 { b };
}
Another way is for A to hold a pointer to B, with the appropriate code in ~A() (and, if necessary, in the copy and move operations...