تابع با const reference
برای ورودی بزرگ فقطخواندنی از const reference استفاده کنید.
#include <string>std::string greet(const std::string& name) { return "Hello, " + name;}
راهنمای مرور نحو C++، انواع، توابع، کلاسها و مدیریت منابع با الگوهای مدرن. ترجیح را به typeهای استاندارد و الگوریتمهای STL بدهید. پارامترها را با توجه به مالکیت و نیاز به تغییر انتخاب کنید. مالکیت منابع را در طول عمر object مدل کنید. نوعهای هوشمند را به pointer خام برای مالکیت ترجیح دهید. از این صفحه بهعنوان مرجع سریع استفاده کنید و مثالها و نکتهها را با نسخهٔ ابزار، نیاز و شرایط واقعی پروژهٔ خود تطبیق دهید.
برای ورودی بزرگ فقطخواندنی از const reference استفاده کنید.
#include <string>std::string greet(const std::string& name) { return "Hello, " + name;}ranges الگوریتم را مستقیم روی بازه اعمال میکند؛ حداقل استاندارد را بررسی کنید.
#include <iostream>#include <ranges>#include <vector>std::vector<int> values{1, 2, 3, 4, 5};for (int value : values | std::views::filter([](int n) { return n % 2 == 0; })) { std::cout << value << '\n';}enum class دامنه و type safety به enum اضافه میکند.
enum class State { ready, running, stopped };const char* label(State state) { switch (state) { case State::ready: return "ready"; case State::running: return "running"; case State::stopped: return "stopped"; } return "unknown";}make_unique تخصیص را ایمن میکند و آزادسازی به scope وابسته میشود.
#include <memory>auto item = std::make_unique<Item>(42);item->process();std::move امکان انتقال مالکیت را صریح میکند.
std::vector<std::string> source{"alpha", "beta"};std::vector<std::string> destination = std::move(source);std::optional برای نبود مقدار و std::expected برای نتیجه همراه خطا در استانداردهای پشتیبان.
#include <optional>std::optional<int> find_score(const Scores& scores, UserId id) { auto it = scores.find(id); if (it == scores.end()) return std::nullopt; return it->second;}constructor وضعیت معتبر بسازد و عضوها خصوصی بمانند.
class Meter { public: explicit Meter(double value) : value_(value) {} double value() const { return value_; } private: double value_;};معیار مرتبسازی را در یک comparator قابلآزمون متمرکز کنید.
std::sort(tasks.begin(), tasks.end(), [](const Task& left, const Task& right) { return left.priority > right.priority; });streamهای C++ با خروج از scope بسته میشوند؛ بازشدن فایل را بررسی کنید.
std::ifstream input("data.txt");if (!input) { throw std::runtime_error("could not open data.txt");}std::string line;while (std::getline(input, line)) { process(line);}تعریف متغیر را با مقدار اولیه انجام دهید و نوع مناسب را انتخاب کنید.
برای مقادیر قابلتغییر از auto فقط وقتی استفاده کنید که نوع روشن بماند.
پارامتر بزرگ فقطخواندنی را با const T& دریافت کنید.
از std::vector، std::string و الگوریتمهای استاندارد بهجای آرایه خام استفاده کنید.
مالکیت منابع را با RAII و نوعهای هوشمند مدیریت کنید.
از std::unique_ptr برای مالکیت یکتا و std::shared_ptr فقط برای اشتراک واقعی استفاده کنید.
برای نوعهای محدود از enum class استفاده کنید.
استثنا یا نتیجه خطا را روشن و سازگار با قرارداد تابع مدیریت کنید.
نسخه استاندارد، تنظیمات ساخت و هشدارهای کامپایلر را مشخص کنید.
مرزهای آرایه، عمر شیء و مسیرهای خطا را با تست و ابزارهای تحلیل بررسی کنید.
مالکیت منابع را با RAII و smart pointerهایی مثل std::unique_ptr مدل کنید؛ raw pointer را مالکیتدار فرض نکنید.
نوع عددی و سرریز را آگاهانه بررسی کنید و برای تبدیل narrowing از cast بدون کنترل پرهیز کنید.