دوره‌ها / آموزش برنامه‌نویسی C++ / C++ Strings

C++ Strings

30 دقیقه Article

رشته‌ها (Strings): مدیریتِ حرفه‌ایِ متن 📜✨

در زبان C، متن‌ها به صورتِ آرایه‌ای از کاراکترها بودند که کار با آن‌ها بسیار سخت بود. اما در C++، کلاسِ std::string در هدرِ <string> ابزاری فوق‌العاده برای ذخیره و دستکاریِ متن‌ها در اختیار ما قرار می‌دهد.

۱. تعریف و اتصال (Concatenation)

می‌توانید دو رشته را به سادگی با علامتِ + به هم بچسبانید:

{code_block('string firstName = "C++";\nstring lastName = "Ninja";\nstring fullName = firstName + " " + lastName;')}

۲. توابعِ کاربردیِ کلاسِ String:

  • .length() یا .size(): طولِ رشته را برمی‌گرداند.
  • [index]: دسترسی به یک کاراکترِ خاص (مثلاً str[0] اولین حرف است).
  • .append(): روشِ دیگری برایِ اضافه کردن متن.
ایندکسینگ: شمارش در رشته‌ها از صفر شروع می‌شود. پس آخرین ایندکس همیشه length - 1 است.

تغییرِ یک کاراکتر:

{code_block('string myStr = "Hello";\nmyStr[0] = "J";\ncout << myStr; // چاپ می‌کند: Jello')}
تکنولوژیِ مدرن: از C++17 به بعد، مفهومی به نام std::string_view معرفی شد که اجازه می‌دهد رشته‌ها را بدونِ کپی کردن و با سرعتِ بسیار بالا فقط "مشاهده" کنید. این یکی از رازهایِ سرعتِ موتورهایِ پردازشِ متن در C++ است.
<hr style="margin: 50px 0; border: 0; border-top: 1px dashed rgba(255,255,255,0.1);">

بخش تخصصی: مهندسیِ داده‌ها و مدیریت حافظه 🧱⚙️⚡

در C++، متغیرها فقط ظرفی برای داده نیستند؛ آن‌ها مدیریت‌کننده‌یِ منابع سیستم هستند. درکِ نحوه‌یِ ذخیره‌سازیِ این داده‌ها، تفاوتِ یک کدنویسِ عادی و یک معمارِ سیستم است.

۱. مقداردهیِ سراسری (Universal Initialization)

از استاندارد C++11 به بعد، روشِ جدیدی برای مقداردهی معرفی شد که از آکولاد {} استفاده می‌کند. این روش دو مزیت بزرگ دارد: اول اینکه از Narrowing Conversion جلوگیری می‌کند (مثلاً نمی‌گذارد یک double را در int بریزید و داده گم شود)؛ و دوم اینکه مشکلِ "Most Vexing Parse" را حل می‌کند که باعث می‌شد کامپایلر فکر کند شما در حالِ اعلانِ یک تابع هستید نه متغیر.

۲. معماریِ شئ String (SSO)

در C++، کلاسِ std::string بسیار هوشمند است. اکثرِ پیاده‌سازی‌هایِ مدرن از تکنیکی به نام Small String Optimization استفاده می‌کنند. اگر رشته‌یِ شما کوتاه باشد (مثلاً کمتر از ۱۵ یا ۲۳ کاراکتر)، آن را مستقیماً داخلِ خودِ شئ (روی Stack) ذخیره می‌کند تا از فراخوانیِ سنگینِ سیستم‌عامل برایِ دریافتِ حافظه از Heap جلوگیری شود. این یعنی سرعتِ فوق‌العاده در پردازشِ متن‌هایِ کوتاه.

۳. دقتِ محاسباتِ اعشاری (IEEE 754)

دنیایِ کامپیوتر باینری است و نمی‌تواند تمامِ اعدادِ اعشاریِ دهدهی را با دقتِ ۱۰۰٪ ذخیره کند. مثلاً عدد 0.1 در باینری یک عددِ متناوب است. به همین دلیل در سیستم‌های مالیِ حساس، هرگز نباید از float یا double برایِ مبالغِ دقیق استفاده کرد؛ مهندسان در این مواقع از متغیرهایِ صحیح (Integer) بر حسبِ "کوچکترین واحد" (مثل ریال یا سنت) استفاده می‌کنند.

نکته مهندسی: استفاده از کلمه‌یِ کلیدی auto به جایِ نوعِ داده، به کامپایلر اجازه می‌دهد خودش نوعِ متغیر را حدس بزند. این کار در کدهایِ پیچیده باعث می‌شود کدِ شما در برابرِ تغییراتِ آینده (Refactoring) مقاوم‌تر باشد.

تمرین‌های عملی

برای تثبیت یادگیری این درس تمرین‌های زیر را حل کنید

طول رشته Easy
سوال تمرین

یک رشته حاویِ عبارتِ Parscode بسازید و تعدادِ کاراکترهایِ آن را با استفاده از تابعِ length() چاپ کنید.

پاسخ تمرین
CPP
#include <iostream>
#include <string>
using namespace std;

int main() {
  string text = "Parscode";
  cout << text.length();
  return 0;
}

آماده رفتن به درس بعدی هستید؟

این درس را به پایان رساندید و می‌توانید به درس بعدی بروید.