В чем разница между методом в public и private?
Это права доступа к методу. Относятся не к Cи++, а к ООП в целом.
private — имеют доступ только методы самого объекта.
protected — имеют доступ методы объекта и его потомков.
public — кто угодно.
Также существуют права доступа типа «не важно, что объекты станут связанным клубком; я готов к тому, что этот клубок придётся добавлять в программу целиком». В общем, когда объекты имеют доступ к private-методам друг друга.
• В Си++ — ключевое слово friend
• В Java — без ключевого слова (т.н. права доступа package)
• В Паскале — по умолчанию есть доступ к private-полям и методам всех объектов в том же модуле.
Эти особые права доступа (friend/package) оправданы, когда…
• Издержки от клубка незначительны (например, объекты невелики и хорошо взаимосвязаны).
• В клубок входят объект и его утилиты (например, какая-нибудь операция ++).
Своими словами:
public может использоваться во всех методах и классах. Он доступен везде. Не защищён. К примеру у вас есть:public: 
    string name = "Anton";
И эту переменную, которая находится в public, могут использовать все. Её можно поменять откуда угодно. Надеюсь понятно.
Пример:class Toster 
{
public:
   string text = "public может использоваться во всех методах и классах. Он доступен везде. Не защищён";
}
...
class Stackoverflow
{
public:
    Toster toster;
    toster.text = "Обнулил :D";
    // То есть его можно использовать везде. А вот с private так не получится.
}
...
А private - это защищённый метод, чаще всего его используют что бы не накосячить с кодом или что бы кто то не накосячил в твоём коде. Да и вообще это вроде как принятно в ООП (Инкапсуляция). Private может использоваться только внутри класса. То есть что бы никто не изменил твою переменную можно отдельно сделать функцию которая будет давать только информацию об этой переменной, но ни в коем случае не изменять.
К примеру:class myPortfolio 
{
public:
     void getName() {
       cout << name << endl;
    }
private:
    string name = "Anton";
};

class tryChangePortfolio 
{
public:
   void changeName {
       myPortfolio portf;
       portf.name = "Обнулил"; // Ошибка.
    }
}
Тем самым можно получить информацию об name но изменить её никак нельзя.
Ты как бы полностью управляешь своим кодом.