To convert your type to another, you need a conversion, not assignment, operator:
operator int() const {
return (h<<4) + l;
}
For the opposite conversion, you would be better off with a converting constructor, rather than an assignment operator:
DByte(int i) : l(i & 0xf), h((i>>4) & 0xf) {}
This can be used for initialising a DByte
as well as assigning to it:
DByte db = 42; // not assignment - requires a constructor
Assignment still works with just this constructor, and no special assignment operator - an integer value can be converted using the constructor, then assigned with the implicit assignment operator.
Finally, there's no point writing your own copy constructor here. The implicit one does exactly the same thing.