Clean Code in C++: How to Write Code You Won't Be Ashamed of in a Year

Online Python Trainer for Beginners

Learn Python easily without overwhelming theory. Solve practical tasks with automatic checking, get hints in Russian, and write code directly in your browser — no installation required.

Start Course

Why Clean Code in C++ is Not About Pedantry, But About Respect



If you've ever opened a project written "on the fly" a year ago and couldn't understand what a function named doStuff() does — you know what we're talking about. Clean code in C++ is not just about aesthetics. It's about saving time, nerves, and money. C++ is a powerful language, but also a treacherous one: memory is managed manually, templates can spawn monsters, and operator overloading can be real magic. Without discipline, code quickly turns into "spaghetti."



In this article, we'll break down how to write clean code in C++ so that it's easy to read, maintain, and extend. No fluff — just practice, examples, and proven principles.



Rule #1: Naming is 50% of Success



Names of variables, functions, and classes should answer the question "what is this?" or "what does it do?". Forget about int x and void f(). Use meaningful names.



Bad Example

int d; // what is d? distance? date? dummy?void p() { // prints? parses? cries?    // ...}


Good Example

int distanceInMeters;void printUserProfile() {    // ...}


Tip: Stick to one style. For C++, the standard is camelCase for variables and functions, PascalCase for classes. Don't mix snake_case and camelCase in the same project — it reduces readability.



Rule #2: Functions Should Be Small and Do One Thing



The Single Responsibility Principle works not only for classes but also for functions. An ideal function is 5–20 lines. If a function does more than one thing — break it up.



Bad

void processData(vector<int>& data) {    // sorting    sort(data.begin(), data.end());    // filtering    vector<int> filtered;    for (int x : data) if (x > 0) filtered.push_back(x);    // output    for (int x : filtered) cout << x << " ";}


Good

vector<int> filterPositive(const vector<int>& data) {    vector<int> result;    for (int x : data) if (x > 0) result.push_back(x);    return result;}

void printData(const vector<int>& data) { for (int x : data) cout << x << " ";}

void processData(vector<int>& data) { sort(data.begin(), data.end()); auto filtered = filterPositive(data); printData(filtered);}


Now each function can be reused and tested separately. Clean code in C++ is modularity.



Rule #3: Avoid Magic Numbers and Strings



Numbers and strings whose meaning is unclear from context are evil. Extract them into constants.



Bad

if (temperature > 100) {    cout << "Danger!";}


Good

constexpr int MAX_SAFE_TEMPERATURE = 100;

if (temperature > MAX_SAFE_TEMPERATURE) { cout << "Danger!";}


Now, if the threshold changes, you change it in one place. Instead of searching for all 100s in the code.



Rule #4: Comments Are Not an Excuse for Bad Code



The best comment is the one that isn't needed because the code speaks for itself. Don't write "what the code does" — that's visible. Write "why it does it."



Bad Comment

// increment i by 1i++;


Good Comment

// Use pre-increment for POD types — faster++i;


Use // TODO: for unfinished sections, but don't overuse it. Ideal code requires no explanations.



Rule #5: Use RAII and Smart Pointers



C++ is famous for manual memory management, but modern C++ (C++11 and later) has powerful tools

Blogs

Book Recommendations