Dzisiejsze statystyki

Ukończone ćwiczenia
-
Napisane znaki Napisane słowa
-
Czas ćwiczeń
-

Łączne statystyki

Ukończone ćwiczenia
-
Napisane znaki Napisane słowa
-
Czas ćwiczeń
-

Ćwiczenie pisania bezwzrokowego: Programowanie w języku C++

Pisanie bezwzrokowe jest istotne w programowaniu. Korzystając z technik szybkiego pisania, sprawniej tworzysz kod w języku programowania C++.

Dowiedzmy się więcej o języku C++ i pisaniu bezwzrokowym podczas programowania w języku C++.

Programowanie w C++ i pisanie bezwzrokowe

C++ to jeden z najbardziej wpływowych języków programowania we współczesnej informatyce. Jest zarówno potężny, jak i złożony - łączy niskopoziomowe zarządzanie pamięcią odziedziczone po C z wysokopoziomowymi abstrakcjami, takimi jak klasy, szablony ang.: templates czy zaawansowane możliwości przeciążania operatorów ang.: operator overloading. Pisanie kodu w C++ jest często bardziej wymagające niż w językach wyższego poziomu, ponieważ jego składnia zawiera wiele symboli: nawiasy kątowe <> dla szablonów, podwójne dwukropki :: dla operatora zasięgu, średniki ; kończące instrukcje, a także nawiasy klamrowe, okrągłe i kwadratowe. Dla programistów, zwłaszcza tych spędzających wiele godzin dziennie na pisaniu kodu, pisanie bezwzrokowe w C++ jest przydatną umiejętnością. Znajomość położenia klawiszy ułatwia dokładne wpisywanie złożonych wyrażeń szablonowych i skupienie się na projekcie oraz wydajności programu. Szybkie pisanie w C++ pozwala sprawniej wprowadzać i poprawiać kod, ale także przy szybkim tempie pracy trzeba pamiętać o dokładności.

Konwencje i idiomatyczny C++

Podobnie jak w projektach pisanych w Pythonie czy Javie, w C++ stosuje się zasady stylu, które pomagają zachować czytelność i spójność kodu. Konwencje nazewnictwa zależą od projektu: w jednym używa się UpperCamelCase dla klas i struktur, lowerCamelCase dla zmiennych i funkcji oraz UPPER_SNAKE_CASE dla stałych, w innym nazwy zapisuje się małymi literami i oddziela wyrazy podkreśleniami. Należy przestrzegać zasad przyjętych w danym projekcie. Biblioteka standardowa C++ używa małych liter w nazwach plików nagłówkowych, takich jak <iostream>, i funkcji, takich jak std::getline. Dla programistów C++ praktyka pisania bezwzrokowego sprawia, że przestrzeganie tych konwencji staje się naturalne, a długie identyfikatory, takie jak std::chrono::high_resolution_clock czy std::unordered_map, mogą być wpisywane bez wysiłku i bez przerywania koncentracji.

Pliki nagłówkowe, przestrzenie nazw i include

C++ opiera się na dyrektywach #include oraz przestrzeniach nazw do organizacji kodu. Operator zasięgu :: jest jednym z najczęściej używanych symboli. Brak średnika po definicji klasy czy literówka w std skutkują natychmiastowymi błędami kompilacji. Pisanie bezwzrokowe w C++ pozwala konsekwentnie wprowadzać te istotne sekwencje, a szybkie pisanie ułatwia wielokrotne wpisywanie dyrektyw include i odwołań do przestrzeni nazw.

#include <iostream>
#include <vector>

int main() {
    std::vector<int> values = {1, 2, 3};
    for (int v : values) {
        std::cout << v << std::endl;
    }
}

Szablony

Szablony ang.: templates w C++ są odpowiednikiem "generics" znanych z innych języków. Pozwalają pisać kod dla różnych typów, o ile te typy obsługują operacje używane w szablonie. Szablony umożliwiają przy tym sprawdzanie typów podczas kompilacji i stosowanie abstrakcji z zachowaniem wydajności. Typowym wyzwaniem jest poprawne wpisywanie nawiasów kątowych <>, szczególnie w sytuacjach zagnieżdżania, jak w std::map<std::string, std::vector<int>>. Początkujący często zapominają o nawiasach zamykających, a w bardziej zaawansowanym kodzie można korzystać ze specjalizacji szablonów. Pisanie bezwzrokowe w C++ sprawia, że te sekwencje stają się naturalne, a szybkie pisanie umożliwia szybkie eksperymentowanie z kodem silnie opartym na szablonach.

template<typename T>
class Box {
    T value;
public:
    Box(T v) : value(v) {}
    T get() const { return value; }
};

int main() {
    Box<int> b(42);
    std::cout << b.get() << std::endl;
}

Przeciążanie operatorów

Przeciążanie operatorów ang.: operator overloading w C++ umożliwia programiście ponowne zdefiniowanie operatorów takich jak +, << czy [] dla własnych klas. To potężne narzędzie, ale wymaga precyzyjnej składni: poprawnego użycia słowa kluczowego operator, zachowania zgodności z const oraz czasem deklaracji zaprzyjaźnionych funkcji. Przy wpisywaniu długich deklaracji, takich jak friend std::ostream& operator<<(std::ostream&, const MyClass&), łatwo o literówkę, zwłaszcza gdy trzeba szukać poszczególnych klawiszy. Pisanie bezwzrokowe czyni takie deklaracje łatwiejszymi do opanowania, a szybkie pisanie pomaga przy powtarzającym się przeciążaniu wielu operatorów.

#include <iostream>

class Point {
    int x, y;
public:
    Point(int a, int b) : x(a), y(b) {}
    Point operator+(const Point& other) const {
        return Point(x + other.x, y + other.y);
    }
    friend std::ostream& operator<<(std::ostream& os, const Point& p) {
        return os << "(" << p.x << ", " << p.y << ")";
    }
};

int main() {
    Point a(1,2), b(3,4);
    std::cout << (a + b) << std::endl;
}

Wskaźniki, referencje i zarządzanie pamięcią

Jednym z najbardziej charakterystycznych aspektów C++ jest jawne zarządzanie pamięcią. Pisanie wskaźników *, referencji & czy inteligentnych wskaźników, takich jak std::unique_ptr, wymaga ciągłej uwagi. Pominięcie operatora dereferencji lub błędne umieszczenie słowa const całkowicie zmienia zachowanie programu. Pisanie bezwzrokowe w C++ pozwala skupić się na semantyce zamiast na naciśnięciach klawiszy, a szybkie pisanie ułatwia wielokrotne wpisywanie deklaracji wskaźników i referencji.

#include <memory>
#include <iostream>

int main() {
    std::unique_ptr<int> p = std::make_unique<int>(10);
    std::cout << *p << std::endl;
}

Klasy, konstruktory i RAII

C++ spopularyzował idiom RAII (Resource Acquisition Is Initialization), gdzie konstruktory pozyskują zasoby, a destruktory je zwalniają. Ten wzorzec wymaga precyzyjnego pisania konstruktorów, destruktorów (~ClassName) oraz list inicjalizacyjnych. Brak dwukropka czy średnika może zatrzymać kompilację. Ćwicząc pisanie bezwzrokowe w C++, uczysz się dokładnie wpisywać te drobne, ale ważne symbole. Szybkie pisanie sprawia, że powtarzalny kod inicjalizacyjny staje się mniej uciążliwy.

#include <fstream>

class File {
    std::fstream f;
public:
    File(const std::string& name) : f(name) {}
    ~File() { f.close(); }
};

Const-correctness i sygnatury funkcji

C++ zachęca do tzw. const-correctness: niestatyczne funkcje składowe, które tylko odczytują stan obiektu, oznacza się jako const, parametry typu const T& pozwalają przekazywać obiekty przez referencję bez ich modyfikowania, a constexpr stosuje się do stałych znanych w czasie kompilacji. Konsekwentne stosowanie tego podejścia bywa trudne, ale pisanie bezwzrokowe w C++ pomaga wypracować pamięć mięśniową związaną z częstym używaniem const, constexpr i referencji. Szybkie pisanie ułatwia tworzenie wielu wariantów przeciążonych funkcji różniących się jedynie kwalifikacją const.

class User {
    std::string name;
public:
    User(std::string n) : name(n) {}
    const std::string& getName() const { return name; }
};

Standardowa biblioteka szablonów (STL)

STL to jedna z cech definiujących C++. Zawiera kontenery takie jak std::vector, std::map, a także algorytmy w rodzaju std::sort. Ich użycie wiąże się z częstym wpisywaniem nawiasów kątowych i obiektów funkcyjnych. Zagnieżdżone szablony bywają szczególnie podatne na błędy. Pisanie bezwzrokowe w C++ czyni te wzorce naturalnymi, a szybkie pisanie pozwala szybko eksperymentować z różnymi typami kontenerów.

#include <vector>
#include <algorithm>
#include <iostream>

int main() {
    std::vector<int> nums = {5,2,9,1};
    std::sort(nums.begin(), nums.end());
    for (int n : nums) std::cout << n << " ";
}

Obsługa błędów za pomocą wyjątków

C++ wykorzystuje try, catch i throw do obsługi wyjątków. W przeciwieństwie do wyjątków sprawdzanych w Javie wyjątki w C++ nie muszą być zadeklarowane ani przechwycone, ale składnia nadal wymaga poprawnego wpisania słów kluczowych i nawiasów. Przechwycenie przez wartość zamiast przez referencję w bloku catch tworzy kopię i może spowodować utratę części obiektu należącej do klasy pochodnej; brak średnika po throw jest błędem składni. Pisanie bezwzrokowe w C++ redukuje te pomyłki, a szybkie pisanie sprawia, że kod obsługi błędów staje się mniej żmudny.

#include <stdexcept>
#include <iostream>

int main() {
    try {
        throw std::runtime_error("wystąpił błąd");
    } catch (const std::exception& e) {
        std::cout << e.what() << std::endl;
    }
}

Lambdy i nowoczesne funkcje C++

Od C++11 lambdy stały się ważnym elementem języka. Listę przechwytywania zapisuje się w nawiasach kwadratowych i można pozostawić ją pustą; strzałka poprzedza opcjonalny, jawnie określony typ zwracanej wartości. Przy wpisywaniu tych elementów potrzebna jest precyzja. Dzięki powtarzaniu i pamięci mięśniowej sekwencje takie jak [&], [=] czy () -> wpisujesz coraz sprawniej. Pisanie bezwzrokowe w C++ czyni te wzorce rutyną, a szybkie pisanie pozwala sprawnie rozwijać kod funkcyjny w pętlach czy algorytmach.

#include <vector>
#include <algorithm>
#include <iostream>

int main() {
    std::vector<int> v = {1,2,3,4};
    std::for_each(v.begin(), v.end(), [](int x){ std::cout << x*x << " "; });
}

Makra, preprocesor i kompilacja warunkowa

Preprocesor C++ dodaje kolejną warstwę: makra, #define oraz kompilację warunkową z #ifdef, #ifndef i #endif. Wymagają one dokładnego wpisywania i spójności. Pisanie bezwzrokowe zmniejsza ryzyko literówek w dyrektywach, które mogą powodować błędy kompilacji, a szybkie pisanie pomaga w projektach z wieloma makrami konfiguracyjnymi.

#define DEBUG 1

int main() {
#ifdef DEBUG
    std::cout << "Tryb debugowania" << std::endl;
#endif
}

Współbieżność i nowoczesne biblioteki

Nowoczesne C++ zawiera std::thread, std::async oraz mechanizmy synchronizacji. Funkcje wątków i listy przechwytywania lambd trzeba wpisywać dokładnie. Literówka w nazwie join może spowodować błąd kompilacji, a niewłaściwy sposób przechwytywania zmiennych może prowadzić do trudnych do wykrycia błędów podczas działania programu. Ćwicząc pisanie bezwzrokowe w C++, uczysz się dokładnie wpisywać te sekwencje. Szybkie pisanie ułatwia wprowadzanie i poprawianie kodu dla wielu wątków i zadań, ale nadal trzeba uważnie sprawdzać synchronizację i czas życia obiektów.

#include <thread>
#include <iostream>

void task() {
    std::cout << "Działa" << std::endl;
}

int main() {
    std::thread t(task);
    t.join();
}

Podsumowanie

C++ łączy niskopoziomową kontrolę charakterystyczną dla C z abstrakcjami programowania obiektowego i szablonowego. Jego składnia jest pełna symboli - nawiasów kątowych, dwukropków, średników, gwiazdek, ampersandów i operatorów podwójnych dwukropków - co sprawia, że dokładność jest nieustannie wymagana. Zasady nazewnictwa i formatowania zależą od projektu, dlatego należy przestrzegać konwencji przyjętych w edytowanym kodzie. Ćwicząc pisanie bezwzrokowe w C++, skup się na sekwencjach znaków używanych w szablonach, przeciążeniach operatorów, lambdach i kodzie współbieżnym. Szybkie pisanie w C++ ułatwia wprowadzanie i poprawianie plików nagłówkowych, odwołań do przestrzeni nazw oraz powtarzalnych konstrukcji. Obie umiejętności przydają się przy klawiaturze, ale poprawne użycie szablonów i bezpieczne zarządzanie zasobami oraz wątkami wymagają także zrozumienia i sprawdzenia kodu.

Następny tekst
Następna lekcja
Zadanie Wróć do testu
cpp
Wykres Ukryj