Усі відповіді поки що були зосереджені на темі вашого запитання, як сказано, яка "в чому різниця між c і c ++". Насправді це звучить так, ніби ви знаєте, у чому різниця, ви просто не розумієте, для чого вам знадобиться ця різниця. Тож інші відповіді намагалися пояснити ОО та інкапсуляцію.
Мені хотілося прислухатись до ще однієї відповіді, тому що, виходячи з деталей вашого запитання, я вважаю, що вам потрібно зробити кілька кроків назад.
Ви не розумієте призначення C ++ або OO, адже вам здається, що вашій програмі потрібно просто зберігати дані. Ці дані зберігаються у змінних. "Чому я хочу зробити змінну недоступною? Тепер я більше не можу отримати доступ до неї! Зробивши все загальнодоступним, а ще краще глобальним, я можу читати дані з будь-якого місця, і немає проблем". - І ви маєте рацію, виходячи з масштабів проектів, про які ви зараз пишете, мабуть, не так вже й багато проблем (або є, але ви просто ще не усвідомлювали їх).
Я думаю, що основне питання, на яке вам дійсно потрібно відповісти, це: "Чому я коли-небудь хотів би приховати дані? Якщо я це роблю, я не можу з цим працювати!" І ось чому:
Скажімо, ви починаєте новий проект, відкриваєте текстовий редактор і починаєте писати функції. Кожен раз, коли вам потрібно щось зберігати (щоб запам'ятати це на потім), ви створюєте змінну. Щоб зробити простішими, ви зробите ваші змінні глобальними. Ваша перша версія вашого додатка працює чудово. Тепер ви почнете додавати більше функцій. У вас є більше функцій, певні дані, які ви зберігали раніше, потрібно читати з нового коду. Інші змінні потрібно модифікувати. Ви продовжуєте писати більше функцій. Що ви, можливо, помітили (або, якщо ні, то абсолютно помітите в майбутньому), так як ваш код збільшується, вам потрібно більше і довше, щоб додати наступну функцію. І як ваш код збільшується, додавати функції стає важче і складніше, не порушуючи щось, що раніше працювало. Чому? Бо потрібно пам’ятати, що всеваші глобальні змінні зберігаються, і вам потрібно пам'ятати, де всі вони змінюються. І вам потрібно пам’ятати, яку функцію нормально викликати в точному порядку, і якщо ви будете викликати їх в іншому порядку, ви можете отримати помилки, оскільки ваші глобальні змінні ще не зовсім дійсні. Ви коли-небудь стикалися з цим?
Наскільки великі ваші типові проекти (рядки коду)? Зараз зображення проекту від 5000 до 50000 разів більше, ніж ваш. Також в ньому працюють кілька людей. Як усі в команді можуть запам'ятати (або навіть усвідомлювати), що роблять усі ці змінні?
Те, що я описав вище, є прикладом ідеально поєднаного коду. І з зорі часу (якщо припустити, що час розпочався 1 січня 1970 року), людський рід шукав способів уникнути цих проблем. Те, як їх уникнути, - це розбиття коду на системи, підсистеми та компоненти та обмеження кількості функцій, які мають доступ до будь-якої частини даних. Якщо у мене є 5 цілих чисел і рядок, які представляють собою якийсь стан, мені було б легше працювати з цим станом, якби лише 5 функцій встановили / отримали значення? або якщо 100 функцій встановлено / отримають ці самі значення? Навіть без мов OO (тобто C) люди наполегливо працювали над ізоляцією даних від інших даних та створенням чітких меж розділення між різними частинами коду. Коли проект набуває певного розміру, простота програмування стає ні, "чи можу я отримати доступ до змінної X з функції Y",
Ось чому введені концепції ОО, і саме тому вони є настільки потужними. Вони дозволяють приховати свої дані від себе, і ви хочете це робити спеціально, адже чим менше код бачить ці дані, тим менше шансів, що, додавши наступну функцію, ви щось зламаєте. Це головне призначення концепцій інкапсуляції та програмування ОО. Вони дозволяють розбити наші системи / підсистеми на ще більш деталізовані поля, до того моменту, яким би великим не був загальний проект, до заданого набору змінних можна отримати лише 50-200 рядків коду, і все! Програмне забезпечення OO, очевидно, набагато більше, але, по суті, саме тому C ++ надає вам параметри оголошення даних / функцій приватними, захищеними або загальнодоступними.
Друга найбільша ідея в ОО - концепція шарів абстракції. Хоча процедурні мови також можуть мати абстракції, програміст C повинен докладати зусиль для створення таких шарів, але в C ++, коли ви оголошуєте клас, ви автоматично створюєте шар абстракції (все одно від вас залежить, чи буде ця абстракція чи ні). додасть або видалить значення). Ви повинні прочитати / вивчити більше про шари абстракції, і якщо у вас виникнуть запитання, я впевнений, що цей форум з радістю відповість і на них.