CROSS JOINs are generally used to explode a data set in order to produce a large number of rows. For example, I use CROSS JOINs to create my Numbers tables.
There are other practical purposes, though. Let's say you have a table of permissions:
CREATE TABLE dbo.BasePermissions
(
PermissionID INT PRIMARY KEY,
Description VARCHAR(32)
);
INSERT dbo.BasePermissions VALUES(1, 'Do stuff'),(2, 'Do other stuff');
Now, you probably have a table mapping UserID -> PermissionID, but this isn't really necessary for admin users. So in that case you might have the following query (let's say the application does need the granular permissions for each user, or you have exceptions for specific users you might apply later, etc.):
SELECT u.UserID, p.PermissionID, p.Description
FROM dbo.Users AS u
CROSS JOIN dbo.BasePermissions AS p
WHERE u.IsAdmin = 1;
This will yield a set of rows (number of admin users * number of permissions), with every permission listed for every admin user. It avoids you having to store every single set, and also means you don't have to update all admin users when you add or remove a permission.
(This is not a super practical example, because the app could be written in such a way that recognizes an admin user, but let's say the app can't be changed.)
As an aside, resist the temptation to ever use a RIGHT JOIN. Stick to LEFT, it's a much simpler way to think about relationships conceptually IMHO. Every time I see a RIGHT JOIN I re-write it to LEFT before I do anything else.