Pemrograman · Bahasa pemrograman
Tutorial C++ untuk pemula
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.
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, worldstd::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).
| Tipe | Contoh | Catatan |
|---|---|---|
int, long long | int n{42}; | Bilangan bulat bertanda |
double | double x{3.14}; | Floating point 64-bit |
bool | bool ok{true}; | true atau false |
char | char c{'A'}; | Satu byte |
std::string | std::string s{"hi"}; | Teks yang dapat bertambah, dari <string> |
auto | auto 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.
| Container | Seperti | Dipakai untuk |
|---|---|---|
std::vector<T> | Array dinamis | Container urutan default |
std::array<T, N> | Array tetap | Ukuran diketahui saat kompilasi |
std::map<K, V> | Dictionary terurut | Key terurut, pencarian O(log n) |
std::unordered_map<K, V> | Hash table | Pencarian cepat, rata-rata O(1) |
std::set<T> | Set unik terurut | Pengecekan 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 hereOutput: 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::vectorsecara by value padahalconst&sudah cukup. - Mencampur signed dan unsigned dalam perbandingan, seperti
int idenganv.size(). Aktifkan peringatan untuk melihatnya. - Menyimpan iterator atau reference ke
std::vectorsetelahpush_back, yang mungkin memindahkan elemen. - Memakai
newdandeletementah alih-alihstd::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.