There are many different ways to get what you want. First of all, as it stands now I understand that you do not actually want the Subdivision Surface modifier for smoothing the surface which is what it is mostly used for. You only want a higher amount of faces around the main body. The following examples show you how you can achieve this, note that most of the values and settings I use can vary depending on the look you are going for, especially when you do not produce completely sharp edges but slightly rounded ones with some methods, it all depends on your liking.
So, to get a higher face count you do not need a modifier at all (unless you want to keep the resolution procedurally to change it eventually). You can do the following:
Select the top and bottom edge loop in either Edge Select or Face Select mode. Then right-click and choose Subdivide.
![subdivide in edit mode](https://cdn.statically.io/img/i.sstatic.net/pBCEY3bf.jpg)
By default it will split the faces once vertically. But with the tool options in the bottom left of the viewport, you can then choose the Number of Cuts according to how much you want to increase the resolution. But: this will only split the faces, the top and bottom circles will not get more rounded. You can increase the Smoothness value with the slider to 1, but it will still not be exactly rounded like a circle with the same resolution. To get this result, you have to set a value of $\sqrt{2}$. You can do this by entering sqrt(2)
in the field, this will give an (almost) perfect result But in this case they will be distorted on the Z axis and you have to scale them separately to Z = 0 by pressing SZ0.
![sudiv options](https://cdn.statically.io/img/i.sstatic.net/fzYGSF46.jpg)
Another way to round the edges after subdividing would be - if you have the Blender addon LoopTools enabled (Edit > Preferences > Add-ons and search for "loop") - to select the top and bottom edge loops, then right-click and choose LoopTools > Circle.
![looptools](https://cdn.statically.io/img/i.sstatic.net/gHZwNcIz.jpg)
But this might decrease the radius of the circles a bit so that the cone becomes a (little) bit narrower. You could however enable the tool option Radius to enter a specific value how large the circle should be, but in this case you have to use the tool separately on top and bottom edges, since their radii should differ.
![looptools options](https://cdn.statically.io/img/i.sstatic.net/VC4JwIit.jpg)
You can also do it without the add-on with the To Sphere tool by selecting an edge loop (this has to be done separately on top and bottom as well otherwise it will try to create a sphere instead of a circle) and then pressing Shift+Alt+S and moving your mouse until the To Sphere value in the top left of the viewport is on 1.000, but like the add-on this will slightly reduce the radius of the circle.
![to sphere](https://cdn.statically.io/img/i.sstatic.net/MlCUFapB.jpg)
Now for methods to keep sharp(er) edges when you are using a Subdivision Surface modifier.
A simple way to get a completely sharp edge while using the Subdivision Surface modifier would be to select top and bottom edge loop and set a Mean Crease value of 1. By default the Use Creases option in the modifier is enabled so it should work.
![mean crease](https://cdn.statically.io/img/i.sstatic.net/wEOL4BY8.jpg)
Or you can do it like this: first select the top and bottom face and inset them a little bit with the Inset tool, shortcut I.
![inset](https://cdn.statically.io/img/i.sstatic.net/3YpFUulD.jpg)
Then press Ctrl+R for the Loop Cut and Slide tool, click on the vertical edges to set a loop cut there and after the first click move up (or down) close to the edge, this is a supporting loop to sharpen the corner (but keeping a slight smoothing), repeat this loop cut for the other end of the cone. By the way you can slide the cut fully up or down to create a sharp edge, but this will result in duplicate overlaying geometry which is preferably to avoid.
![loop cut and slide](https://cdn.statically.io/img/i.sstatic.net/1CimSb3L.jpg)
Another possible method would be to select the top and bottom edges and pressing Ctrl+B to bevel the edges. Moving the mouse will change the amount of bevel, scrolling the mouse wheel will change the number of segments. In the example below I used three segments.
![bevel in edit mode](https://cdn.statically.io/img/i.sstatic.net/JpzyNuQ2.jpg)
Or if you want to use the bevel method but not having the beveled edge permanently changed, you can go procedural and add a Bevel modifier to the object. The important thing here is, that you place it above the Subdivision Surface modifier so that the edges get beveled first, and then the mesh gets smoothed.
![bevel modifier](https://cdn.statically.io/img/i.sstatic.net/i1ecnOj8.jpg)