cv.cm

Pemrograman · Bahasa pemrograman

Tutorial C++ untuk pemula

7 menit baca

Jawaban singkat

C++ adalah bahasa terkompilasi dengan tipe statis yang memadukan kecepatan dan kontrol tingkat rendah C dengan class, template, dan pustaka standar yang besar. Kompilasi hello.cpp dengan g++ -std=c++20 hello.cpp -o hello lalu jalankan ./hello. Kode C++ modern memakai std::string, std::vector, dan std::map alih-alih array mentah, smart pointer alih-alih delete manual, dan RAII agar resource dilepas secara otomatis.

Buka Pengonversi biner

Apa itu C++ dan untuk apa dipakai

C++ dibuat oleh Bjarne Stroustrup di Bell Labs, dimulai pada 1979 sebagai "C with Classes". C++ distandarkan oleh ISO; C++11 membuka era "C++ modern", disusul C++17, C++20, dan C++23. C++ dipakai di tempat yang mementingkan performa dan kontrol: game engine (Unreal Engine), browser web (Chrome, Firefox), database, sistem trading, perangkat embedded, compiler, dan runtime machine learning. Prinsip utamanya adalah abstraksi tanpa overhead: fitur yang tidak Anda pakai tidak menambah biaya.

Instal compiler dan jalankan Hello, world

Gunakan GCC (g++) atau Clang (clang++) di Linux dan macOS, atau Microsoft Visual C++ di Windows (lewat Visual Studio). Tentukan versi standar secara eksplisit.

#include <iostream>

int main() {
    std::cout << "Hello, world\n";
    return 0;
}
g++ -std=c++20 -Wall -Wextra hello.cpp -o hello
./hello
# Hello, world

std::cout adalah output stream standar dan << menulis ke dalamnya. Semua isi pustaka standar berada di namespace std.

Variabel, tipe data, dan auto

C++ memiliki tipe bawaan yang sama dengan C, ditambah bool sebagai keyword, reference, dan tipe pustaka seperti std::string. auto meminta compiler menyimpulkan tipe dari nilai awalnya. Inisialisasi dengan kurung kurawal {} menolak konversi yang menyempit (narrowing).

TipeContohCatatan
int, long longint n{42};Bilangan bulat bertanda
doubledouble x{3.14};Floating point 64-bit
boolbool ok{true};true atau false
charchar c{'A'};Satu byte
std::stringstd::string s{"hi"};Teks yang dapat bertambah, dari <string>
autoauto v = 2.5;Disimpulkan, di sini double
T&int& r = n;Reference: nama lain untuk n
#include <iostream>
#include <string>

int main() {
    int count{7};
    auto avg = count / 2.0;          // double, 3.5
    std::string name{"Ada"};
    name += " Lovelace";
    const int& ref = count;          // read-only alias of count
    std::cout << name << " " << name.size() << " " << avg << " " << ref << "\n";
    // Ada Lovelace 12 3.5 7
}

Alur kontrol dan fungsi

Alur kontrol sama seperti di C, ditambah perulangan for berbasis range. Kirim objek besar dengan reference const untuk menghindari salinan, dan dengan reference non-const bila fungsi harus mengubahnya.

#include <iostream>
#include <string>
#include <vector>

int square(int x) { return x * x; }

void addSuffix(std::string& s, const std::string& suffix = "!") {
    s += suffix;
}

int main() {
    int score = 72;
    if (score >= 90) std::cout << "A\n";
    else if (score >= 70) std::cout << "B\n";   // B
    else std::cout << "C\n";

    std::vector<int> nums{1, 2, 3};
    for (int n : nums) std::cout << square(n) << " ";  // 1 4 9
    std::cout << "\n";

    std::string word = "hi";
    addSuffix(word);
    std::cout << word << "\n";                  // hi!
}

Class

Class mengelompokkan data member dan member function. Constructor menyiapkan objek; member private disembunyikan dari kode luar. struct sama dengan class, kecuali member-nya publik secara default.

#include <iostream>
#include <string>
#include <utility>

class Account {
public:
    explicit Account(std::string owner) : owner_(std::move(owner)) {}

    void deposit(double amount) {
        if (amount > 0) balance_ += amount;
    }
    double balance() const { return balance_; }
    const std::string& owner() const { return owner_; }

private:
    std::string owner_;
    double balance_ = 0.0;
};

int main() {
    Account acc{"Ann"};
    acc.deposit(50);
    acc.deposit(-5);   // ignored
    std::cout << acc.owner() << ": " << acc.balance() << "\n";  // Ann: 50
}

Pewarisan (class Savings : public Account) dan fungsi virtual memberi polimorfisme saat runtime. Tandai fungsi yang menimpa dengan override agar compiler memeriksanya.

Container dan algoritma pustaka standar

Pustaka standar (sering disebut STL) menyediakan container dan algoritma yang bekerja bersama lewat iterator.

ContainerSepertiDipakai untuk
std::vector<T>Array dinamisContainer urutan default
std::array<T, N>Array tetapUkuran diketahui saat kompilasi
std::map<K, V>Dictionary terurutKey terurut, pencarian O(log n)
std::unordered_map<K, V>Hash tablePencarian cepat, rata-rata O(1)
std::set<T>Set unik terurutPengecekan keanggotaan, output terurut
#include <algorithm>
#include <iostream>
#include <map>
#include <string>
#include <vector>

int main() {
    std::vector<int> nums{3, 1, 2, 5};
    std::sort(nums.begin(), nums.end());
    auto evens = std::count_if(nums.begin(), nums.end(),
                               [](int n) { return n % 2 == 0; });
    std::cout << nums.front() << " " << nums.back() << " " << evens << "\n";  // 1 5 1

    std::map<std::string, int> ages{{"bob", 25}, {"ann", 31}};
    ages["cy"] = 40;
    for (const auto& [name, age] : ages) {     // structured bindings
        std::cout << name << "=" << age << " ";  // ann=31 bob=25 cy=40
    }
    std::cout << "\n";
}

[](int n) { ... } adalah lambda, fungsi tanpa nama yang ditulis langsung di tempat. Template-lah yang membuat satu std::vector berfungsi untuk tipe elemen apa pun; Anda bisa menulis sendiri dengan template <typename T>.

Fitur khas: RAII dan smart pointer

RAII (Resource Acquisition Is Initialization) berarti sebuah resource dimiliki oleh objek: constructor memperolehnya dan destructor melepaskannya. Karena destructor berjalan otomatis ketika objek keluar dari scope, bahkan saat exception dilempar, memori, file, dan lock tidak bisa bocor. Smart pointer menerapkan RAII pada memori heap.

#include <iostream>
#include <memory>

struct Noisy {
    int id;
    explicit Noisy(int i) : id(i) { std::cout << "create " << id << "\n"; }
    ~Noisy() { std::cout << "destroy " << id << "\n"; }
};

int main() {
    auto a = std::make_unique<Noisy>(1);       // sole owner
    {
        auto b = std::make_shared<Noisy>(2);   // shared, reference-counted
        auto c = b;                            // two owners now
        std::cout << "owners: " << b.use_count() << "\n";
    }                                          // destroy 2 happens here
    std::cout << "end of main\n";
}                                              // destroy 1 happens here

Output: create 1, create 2, owners: 2, destroy 2, end of main, destroy 1. Pada kode modern, Anda hampir tidak perlu menulis new dan delete sendiri.

Penanganan error dengan exception

Lempar objek exception dan tangkap dengan reference const. Tipe exception standar ada di <stdexcept>. Fungsi yang tidak pernah melempar dapat ditandai noexcept.

#include <iostream>
#include <stdexcept>
#include <string>

int parseAge(const std::string& text) {
    int age = std::stoi(text);   // throws std::invalid_argument on "abc"
    if (age < 0) throw std::out_of_range("negative age");
    return age;
}

int main() {
    try {
        std::cout << parseAge("41") << "\n";   // 41
        std::cout << parseAge("abc") << "\n";
    } catch (const std::invalid_argument&) {
        std::cout << "not a number\n";         // not a number
    } catch (const std::exception& e) {
        std::cout << "error: " << e.what() << "\n";
    }
}

Untuk kegagalan yang diperkirakan, banyak codebase mengembalikan std::optional<T> (C++17) atau std::expected<T, E> (C++23) alih-alih melempar exception.

Program kecil yang lengkap: frekuensi kata

#include <algorithm>
#include <cctype>
#include <fstream>
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>

int main(int argc, char* argv[]) {
    if (argc != 2) {
        std::cerr << "usage: " << argv[0] << " FILE\n";
        return 1;
    }
    std::ifstream in(argv[1]);
    if (!in) {
        std::cerr << "cannot open " << argv[1] << "\n";
        return 1;
    }
    std::unordered_map<std::string, int> counts;
    std::string word;
    while (in >> word) {
        std::string clean;
        for (unsigned char ch : word)
            if (std::isalpha(ch)) clean += static_cast<char>(std::tolower(ch));
        if (!clean.empty()) ++counts[clean];
    }
    std::vector<std::pair<std::string, int>> top(counts.begin(), counts.end());
    std::sort(top.begin(), top.end(),
              [](const auto& a, const auto& b) { return a.second > b.second; });
    for (size_t i = 0; i < top.size() && i < 5; ++i)
        std::cout << top[i].second << "  " << top[i].first << "\n";
}

Kompilasi dengan g++ -std=c++20 -O2 words.cpp -o words dan jalankan ./words notes.txt. File ditutup otomatis ketika in keluar dari scope, lagi-lagi berkat RAII.

Kesalahan umum pemula

  • Menulis using namespace std; di file header, yang mencemari setiap file yang meng-include-nya.
  • Mengirim objek besar seperti std::vector secara by value padahal const& sudah cukup.
  • Mencampur signed dan unsigned dalam perbandingan, seperti int i dengan v.size(). Aktifkan peringatan untuk melihatnya.
  • Menyimpan iterator atau reference ke std::vector setelah push_back, yang mungkin memindahkan elemen.
  • Memakai new dan delete mentah alih-alih std::make_unique, std::vector, atau tipe pemilik lainnya.

Langkah selanjutnya

Gunakan cppreference.com sebagai referensi bahasa dan pustaka, serta C++ Core Guidelines (disunting oleh Bjarne Stroustrup dan Herb Sutter) untuk praktik yang baik. Situs Standard C++ Foundation, isocpp.org, punya halaman getting-started dengan rekomendasi buku. Pelajari CMake untuk membangun proyek, lalu lanjut ke move semantics, template, constexpr, dan concurrency dengan std::thread.

FAQ

Perlukah belajar C sebelum C++?

Tidak wajib. Pengajaran C++ modern dimulai dengan std::string, std::vector, dan class, serta memperkenalkan pointer mentah dan array gaya C belakangan. Belajar C lebih dulu memang membantu memahami memori.

Standar C++ mana yang sebaiknya dipakai?

C++17 dan C++20 didukung dengan baik oleh GCC, Clang, dan MSVC terkini, dan dukungan C++23 terus bertambah. Pilih satu secara eksplisit dengan flag seperti -std=c++20.

Apa perbedaan pointer dan reference?

Reference adalah alias yang harus terikat saat dibuat dan tidak dapat dialihkan atau bernilai null. Pointer menyimpan alamat, bisa null, dan bisa diubah untuk menunjuk ke tempat lain.

Apakah C++ sulit dipelajari?

Bahasanya besar, jadi kurva belajarnya lebih panjang daripada Python atau Go. Berpegang pada fitur modern, container standar, dan smart pointer menghindarkan sebagian besar jebakan klasik.

Semua tutorial pemrograman