Olá Jhony!
O CarrinhoCompras representa o carrinho ao todo (com todos seus itens).
Já o CarrinhoItem representa somente 1 item do CarrinhoCompras.
Talvez a dúvida seja o por que utilizar um CarrinhoItem e não um Item diretamente, certo?
Acontece que ao utilizar um Item, quando você adicionar 5 livros iguais no carrinho e for remover 1 ele irá remover todos pois ele interpreta o carrinho como um todo e por isso todos os itens que forem iguais seriam removidos.
Já o CarrinhoItem enxerga que os itens são diferentes mesmo que sejam instanciados pela mesma classe, isso acontece pois ele cria um identificador unico para cada item o que faz que resolva o problema citado acima já que ao remover um item ele irá agir como o esperado.