Ви з Java на C++ переходите, судячи з public: в один рядок із членом класу?
1. const char * - це вказівник, і if (name != "") буде порівнювати вказівник на name із вказівником на "". Які можуть виявитися як однаковими, так і різними при однакових вмістах стрічок (""). Стрічки треба порівнювати функцією strcmp.
2. Клас user не володіє даними імені. Тобто код
std::string new_name {"abc"};
user.name_update(new_name.c_str());
new_name[1] = "d";
std::cout<<user.get_name(); //UB - звернення до казна-чого в пам'яті. У цьому місці, швидше за все, ім'я юзера буде adc
new_name = "sdiofhweiuhsoifhoshflsdhflskdhfsdlhfslhfsdl";
std::cout<<user.get_name(); //а тут вже усе що завгодно може статися, аж до падіння
Зберігайте гроші в банку стрічки в std::string. Це, до речі, розв'яже проблему з порівнянням.
3. Є різні концепції роботи з даними; в одній з них об'єкти незмінні, а функції створюють і повертають нові об'єкти, а в іншій - функції змінюють об'єкти. Загалом, свої переваги є в обох, але якщо об'єкт незмінний - то й не змінюйте його, а якщо змінний - то не перевантажуйте код перестворенням і перезаписуванням того, що ви змінюєте. Якось визначайтеся. const User& вам у поміч.
4. Користувачу ви повідомляєте, чи відбулася операція; але код далі цього не знає. Якось треба це вирішити.
5. Іменування в стилі Перша_велика_через_підкреслення вважається поганим. Обирайте - або маленькі_через_підкреслення, або КожнеСловоЗВеликоїБезПідкреслень. Для типів частіше використовується друге.
6. Змінні-члени класу бажано якось позначати, скажімо, не name, а name_ чи m_name.
7. Функція printf знаходиться не в <iostream>, а в <cstdio>. Але якщо ви вже вчите C++, а не C - краще використовуйте std::cout.