به عنوان یک مسیحی، شنیدن اصطلاحاتی مانند پرسبیترین و پروتستان به جای یکدیگر رایج است، اما این دو یکسان نیستند.
در حالی که هر دو گروه شباهت‌هایی دارند، تفاوت‌های قابل توجهی نیز بین آن‌ها وجود دارد که آن‌ها را از هم متمایز می‌کند.
در این مقاله، تفاوت‌های بین فرقه‌های پرسبیترین و پروتستان، از جمله ریشه‌ها، باورها و آموزه‌های کلیدی، حکومت و ساختار کلیسا، شیوه‌های عبادت و تأثیرات اجتماعی و مشارکت‌ها را بررسی خواهم کرد.

پرسبیترینیسم و پروتستانیسم دو شاخه متمایز از مسیحیت هستند که از اصلاحات پروتستانی در قرن شانزدهم پدید آمدند.
در حالی که هر دو گروه تاریخ و میراث مشترکی دارند، باورها و شیوه‌های الهیاتی متفاوتی دارند.
پرسبیترینیسم شکلی از پروتستانیسم اصلاح شده است که بر حاکمیت خدا و اقتدار کتاب مقدس تأکید دارد.
پروتستانیسم، از سوی دیگر، اصطلاحی گسترده است که شامل طیف وسیعی از فرقه‌های مسیحی است که اقتدار کلیسای کاتولیک روم را رد می‌کنند و بر اهمیت تفسیر فردی از کتاب مقدس تأکید دارند.
نکات کلیدی

پرسبیترینیسم و پروتستانیسم دو شاخه متمایز از مسیحیت هستند که از اصلاحات پروتستانی در قرن شانزدهم پدید آمدند.
پرسبیترینیسم بر حاکمیت خدا و اقتدار کتاب مقدس تأکید دارد، در حالی که پروتستانیسم اقتدار کلیسای کاتولیک روم را رد می‌کند و بر اهمیت تفسیر فردی از کتاب مقدس تأکید دارد.
در حالی که هر دو گروه شباهت‌هایی دارند، تفاوت‌های قابل توجهی نیز بین آن‌ها وجود دارد که آن‌ها را از هم متمایز می‌کند، از جمله ریشه‌ها، باورها و آموزه‌های کلیدی، حکومت و ساختار کلیسا، شیوه‌های عبادت و تأثیرات اجتماعی و مشارکت‌ها.

ریشه‌ها و پیشینه تاریخی

به عنوان یک فرقه پروتستانی، پرسبیترینیسم ریشه در اصلاحات پروتستانی قرن شانزدهم دارد.
این جنبش با انتشار ۹۵ تز مارتین لوتر در سال ۱۵۱۷ آغاز شد، که اقتدار کلیسای کاتولیک را به چالش کشید و خواستار اصلاحات شد.
جان کالون، یک الهی‌دان فرانسوی، بر ایده‌های لوتر گسترش داد و سیستمی از الهیات را توسعه داد که بر تقدیر و حاکمیت خدا تأکید داشت.
آموزش‌های کالون در توسعه پرسبیترینیسم، به ویژه در اسکاتلند و سایر قسمت‌های اروپا، تأثیرگذار بود.
در اسکاتلند، جان ناکس یکی از چهره‌های کلیدی در تأسیس پرسبیترینیسم به عنوان شکل غالب پروتستانیسم بود.
ناک در ژنو زیر نظر کالون تحصیل کرد و برای رهبری اصلاحات اسکاتلند به اسکاتلند بازگشت.
کلیسای اسکاتلند در سال ۱۵۶۰ تأسیس شد.
پرسبیترینیسم همچنین در توسعه کلیسای انگلستان نقش داشت. در زمان سلطنت ملکه الیزابت اول، بسیاری از پروتستان‌های انگلیسی به دنبال اصلاح کلیسای انگلستان به خطوط پرسبیترین بودند.
با این حال، سلطنت انگلیس و اسقف‌های آنجلیکانی در برابر این تلاش‌ها مقاومت کردند و کلیسای انگلستان تا حد زیادی بدون تغییر باقی ماند.
امروزه، پرسبیترینیسم یکی از بزرگترین فرقه‌های پروتستانی در جهان است که میلیون‌ها پیرو در ایالات متحده، اسکاتلند و سایر کشورها دارد.
در حالی که ریشه در اصلاحات دارد، در طول زمان تکامل یافته و تحت تأثیر عوامل مختلف الهیاتی و فرهنگی قرار گرفته است.
باورها و آموزه‌های کلیدی

به عنوان یک پرسبیترین، من به حاکمیت خدا و اقتدار کتاب مقدس اعتقاد دارم. کتاب مقدس بالاترین مرجع در امور ایمان و عقیده است و اساس باورهای ماست.
ما همچنین به تثلیث اعتقاد داریم، که آموزه‌ای است مبنی بر اینکه یک خدا وجود دارد که در سه شخص وجود دارد: پدر، پسر و روح القدس.
یکی از تفاوت‌های کلیدی بین پرسبیترین‌ها و سایر فرقه‌های پروتستانی، اعتقاد ما به تقدیر است.
این ایده است که خدا از قبل انتخاب کرده است چه کسی نجات یابد و چه کسی نجات نیابد. این باور بر این اساس است که خدا دانا و قادر مطلق است و برای هر یک از ما برنامه‌ای دارد.
جنبه مهم دیگر ایمان ما مفهوم فیض است. ما معتقدیم که فقط از طریق فیض، از طریق ایمان به عیسی مسیح نجات می‌یابیم.
این بدان معناست که ما نمی‌توانیم نجات خود را از طریق اعمال نیک یا هر وسیله دیگری به دست آوریم. در عوض، هدیه‌ای رایگان از جانب خداست که وقتی ایمان خود را به عیسی می‌گذاریم دریافت می‌کنیم.
از نظر اعتراف به ایمان خود، ما به کتاب اعترافات پایبند هستیم که مجموعه‌ای از بیانیه‌های ایمان است که توسط کلیسای پرسبیترین به تصویب رسیده است.
این بیانیه‌های ایمان به ما کمک می‌کنند تا در درک کتاب مقدس و باورهای خود راهنمایی شویم.
الهیات ما در آموزه‌های جان کالون، که شخصیتی برجسته در اصلاحات پروتستانی بود، ریشه دارد.
کالوینیسم بر حاکمیت خدا و این ایده تأکید دارد که نجات هدیه‌ای رایگان است که نمی‌توان آن را از طریق اعمال نیک به دست آورد.
به طور خلاصه، پرسبیترین‌ها به حاکمیت خدا، اقتدار کتاب مقدس، تثلیث، تقدیر، فیض و پایبندی به کتاب اعترافات اعتقاد دارند.
الهیات ما در کالوینیسم ریشه دارد و بر هدیه رایگان نجات از طریق ایمان به عیسی مسیح تأکید دارد.
حکومت و ساختار کلیسا

از نظر حکومت کلیسا، کلیساهای پرسبیترین از سیستمی پیروی می‌کنند که بر اساس قانون ارشدان است. خود اصطلاح "پرسبیترین" از کلمه یونانی "presbyteros" به معنای "ارشد" گرفته شده است.
سیستم آن‌ها با سلسله مراتبی از نهادهای حاکم از جمله جلسه، مجمع، مجمع منطقه‌ای و مجمع عمومی مشخص می‌شود.
جلسه نهاد حاکم یک کلیسای محلی است و از کشیش و گروهی از ارشدان تشکیل شده است.
ارشدان توسط جماعت انتخاب می‌شوند و برای خدمت به عنوان رهبران معنوی، ارائه راهنمایی و پشتیبانی به کشیش و جماعت، تعیین می‌شوند.
مجمع نهاد حاکمی است که بر گروهی از کلیساهای محلی در یک منطقه خاص نظارت می‌کند. این نهاد از نمایندگانی از هر یک از کلیساهای مجمع و گروهی از ارشدان تعیین شده تشکیل شده است.
مجمع مسئول تعیین و انضباط کشیشان و همچنین ارائه راهنمایی و پشتیبانی به کلیساهای محلی است.
مجمع منطقه‌ای نهاد حاکمی است که بر گروهی از مجمع‌ها در یک منطقه بزرگتر نظارت می‌کند. این نهاد از نمایندگانی از هر یک از مجمع‌ها در مجمع منطقه‌ای و گروهی از ارشدان تعیین شده تشکیل شده است.
مجمع منطقه‌ای مسئول اطمینان از پیروی مجمع‌ها از قوانین و مقررات کلیسای پرسبیترین است.
در نهایت، مجمع عمومی بالاترین نهاد حاکم کلیسای پرسبیترین است. این نهاد از نمایندگانی از هر یک از مجمع‌های منطقه‌ای و گروهی از ارشدان تعیین شده تشکیل شده است.
مجمع عمومی مسئول تعیین سیاست و دکترین برای کل کلیسای پرسبیترین است.
در مقابل، کلیساهای پروتستان به طور کلی شکل غیرمتمرکزتری از حکومت کلیسا دارند.
در حالی که برخی از کلیساهای پروتستان دارای سیستمی از ارشدان هستند، به اندازه سیستم پرسبیترین سلسله مراتبی نیست. در عوض، کلیساهای پروتستان تمایل دارند بیشتر به صورت جماعتی باشند، با هر کلیسای محلی که دارای درجه بالایی از خودمختاری است.
با این حال، سیستم حکومت کلیسای پرسبیترین بر اهمیت ارشدان و ساختار سلسله مراتبی تأکید دارد، در حالی که کلیساهای پروتستان تمایل دارند بیشتر جماعتی و غیرمتمرکز باشند.
مقایسه با سایر فرقه‌ها

به عنوان یک پرسبیترین، من اذعان می‌کنم که فرقه‌های مسیحی دیگری نیز وجود دارند.
در حالی که قطعاً شباهت‌هایی بین این فرقه‌ها وجود دارد، تفاوت‌های کلیدی نیز وجود دارد که باید از آن‌ها آگاه باشید.
یکی از بزرگترین تفاوت‌ها بین پروتستان‌ها و کاتولیک‌ها است. در حالی که هر دو گروه مسیحی هستند، تفاوت‌های الهیاتی قابل توجهی دارند.
به عنوان مثال، کاتولیک‌ها به اقتدار پاپ و اهمیت سنت اعتقاد دارند، در حالی که پروتستان‌ها این ایده‌ها را رد می‌کنند و به رویکرد فردگرایانه‌تری به ایمان ترجیح می‌دهند.
تفاوت‌هایی نیز بین پرسبیترینیسم و سایر فرقه‌های پروتستانی وجود دارد.
به عنوان مثال، باپتیست‌ها تمایل دارند بر اهمیت نجات فردی و تعمید غوطه‌وری تأکید کنند، در حالی که پرسبیترین‌ها تأکید بیشتری بر حاکمیت خدا و اهمیت سرایز دارند.
متدیست‌ها، از سوی دیگر، تمایل دارند بیشتر بر عدالت اجتماعی و اهمیت اعمال نیک تأکید کنند، در حالی که پرسبیترین‌ها تمایل دارند بر اهمیت ایمان و فیض نسبت به اعمال تأکید کنند.
لوتری‌ها، مانند پرسبیترین‌ها، تأکید زیادی بر حاکمیت خدا و اهمیت ایمان دارند.
با این حال، آن‌ها تفاوت‌های قابل توجهی نیز دارند، مانند اعتقادشان به هم‌جواری (ایده‌ای که نان و شراب در شام خداوند هم نان و شراب و هم بدن و خون مسیح هستند).
آنگلیکن‌ها و اپیسکوپالی‌ها نیز در بسیاری از جهات شبیه پرسبیترین‌ها هستند، اما تمایل دارند بر اهمیت سنت و مراسم مذهبی تأکید کنند.
آن‌ها همچنین ساختار سلسله مراتبی دارند، با اسقف‌هایی که نقش کلیدی در کلیسا ایفا می‌کنند.
در حالی که قطعاً تفاوت‌هایی بین پرسبیترینیسم و سایر فرقه‌ها وجود دارد، من معتقدم که همه ما ایمانی مشترک به عیسی مسیح و تمایل به خدمت به او داریم.
چهره‌های کلیدی و تأثیرات
هنگام بررسی تفاوت‌های بین پرسبیترینیسم و پروتستانیسم، مهم است که چهره‌های کلیدی و تأثیراتی را که باورها و شیوه‌های هر گروه را شکل داده‌اند، درک کنیم.
یکی از مهمترین چهره‌ها در اصلاحات پروتستانی مارتین لوتر بود. لوتر به عنوان یک راهب و الهی‌دان، به آموزه‌های کلیسای کاتولیک در مورد نجات و اقتدار پاپ اعتراض کرد.
او معتقد بود که نجات می‌تواند فقط از طریق ایمان به دست آید، نه از طریق اعمال نیک یا سرایز. ایده‌های لوتر جنبشی را به راه انداخت که در نهایت منجر به تشکیل بسیاری از فرقه‌های پروتستانی شد.
چهره مهم دیگر در اصلاحات جان کالون، یک الهی‌دان فرانسوی بود که کلیسای پرسبیترین را تأسیس کرد.
کالون به تفسیر سختگیرانه از کتاب مقدس و آموزه تقدیر اعتقاد داشت، که بیان می‌کرد خدا از قبل تعیین کرده است چه کسی نجات یابد و چه کسی محکوم شود.
کلیسای پرسبیترین با تأکید بر حاکمیت خدا و اقتدار کتاب مقدس مشخص می‌شود.
در مقابل، پروتستانیسم اصطلاحی گسترده است که شامل فرقه‌های مختلفی است که هر کدام باورها و شیوه‌های خاص خود را دارند. با این حال، چهره‌ها و تأثیرات کلیدی وجود دارند که در بسیاری از فرقه‌های پروتستانی مشترک هستند.
به عنوان مثال، پروتستانیسم در آموزه‌های عیسی مسیح و کتاب مقدس ریشه دارد، نه در اقتدار پاپ یا کلیسای کاتولیک.
پروتستانیسم همچنین بر اهمیت ایمان فردی و رابطه شخصی با خدا تأکید دارد. این در باور پروتستان به نجات از طریق ایمان به تنهایی، نه از طریق اعمال نیک یا سرایز منعکس شده است.
بسیاری از فرقه‌های پروتستانی همچنین رد استفاده از نمادها و سایر اشکال تصویر مذهبی را می‌کنند، در عوض بر کلام خدا همانطور که در کتاب مقدس بیان شده است تمرکز می‌کنند.
درک چهره‌های کلیدی و تأثیراتی که باورها و شیوه‌های هر گروه را شکل داده است برای درک تفاوت‌های بین آن‌ها ضروری است.
شیوه‌ها و سبک عبادت

از آنجایی که هر دو فرقه پرسبیترین و پروتستان بخشی از ایمان بزرگتر مسیحی هستند، شیوه‌ها و باورهای مشترک زیادی دارند.
با این حال، تفاوت‌هایی در سبک‌های عبادت آن‌ها وجود دارد.
پرسبیترینیسم شامل سبک عبادت رسمی‌تری است که شامل سرودها، دعاها و سرایز است. سرایز به عنوان وسیله‌ای برای فیض در نظر گرفته می‌شوند و شامل غسل تعمید و شام خداوند (عشاء ربانی) است.
آن‌ها معتقدند که این سرایز مهم هستند زیرا توسط عیسی در انجیل متی (۲۸:۱۹-۲۰) دستور داده شده‌اند و به دلیل اینکه نشان قابل مشاهده‌ای از فیض خدا هستند.
در مقابل، بسیاری از فرقه‌های پروتستانی راهی غیررسمی‌تر برای عبادت دارند.
ممکن است سرایز زیادی نداشته باشند و ممکن است به اهمیت عبادت رسمی تأکید کمتری کنند.
با این حال، آن‌ها هنوز بر انجیل عیسی مسیح و زندگی‌ای که برای خدا خوشایند است تأکید زیادی دارند.
علیرغم این تفاوت‌ها، هر دو فرقه پرسبیترین و پروتستان بر اهمیت عبادت تأکید مشترک دارند.
آن‌ها معتقدند که عبادت راهی برای ارتباط با خدا و ابراز قدردانی از برکات اوست. عبادت همچنین به عنوان راهی برای یادگیری بیشتر در مورد خدا و رشد در ایمان دیده می‌شود.
در حالی که تفاوت‌هایی در سبک‌های عبادت فرقه‌های پرسبیترین و پروتستان وجود دارد، هر دو بر اهمیت عبادت و زندگی‌ای که برای خدا خوشایند است تأکید زیادی دارند.
پرسبیترینیسم در مناطق مختلف

پرسبیترینیسم شاخه‌ای از پروتستانیسم است که در طول اصلاحات پروتستانی قرن شانزدهم پدید آمد.
از آن زمان به مناطق مختلفی در سراسر جهان گسترش یافته است. در این بخش، به طور خلاصه پرسبیترینیسم در آمریکا، ایالات متحده، فیلادلفیا و سایر مناطق را مورد بحث قرار خواهم داد.
آمریکا

پرسبیترینیسم در اوایل قرن هجدهم به آمریکا رسید و اولین مجمع در سال ۱۷۰۶ در فیلادلفیا تأسیس شد.
امروزه، کلیسا (ایالات متحده آمریکا) بزرگترین فرقه پرسبیترین در این کشور است که بیش از ۱.۵ میلیون عضو و بیش از ۹۰۰۰ جماعت دارد.
فرقه‌های دیگری نیز در آمریکا وجود دارند، مانند کلیسای آمریکا (PCA)، کلیسای پرسبیترین ارتدوکس (OPC) و کلیسای انجیلی (EPC).
ایالات متحده

پرسبیترینیسم یکی از بزرگترین فرقه‌های پروتستانی در ایالات متحده است که بیش از ۲ میلیون عضو و بیش از ۱۰ هزار جماعت دارد.
کلیسای پرسبیترین (ایالات متحده آمریکا) بزرگترین فرقه پرسبیترین در این کشور است، اما فرقه‌های دیگری نیز وجود دارند.
کلیسای آمریکا (PCA) یک فرقه پرسبیترین محافظه‌کار است که در دهه ۱۹۷۰ از کلیسای پرسبیترین (ایالات متحده آمریکا) جدا شد.
کلیسای ارتدوکس (OPC) یک فرقه محافظه‌کارتر است که در دهه ۱۹۳۰ از کلیسای پرسبیترین در ایالات متحده آمریکا جدا شد.
فیلادلفیا

فیلادلفیا به عنوان زادگاه پرسبیترینیسم در آمریکا شناخته می‌شود.
اولین مجمع در آمریکا در سال ۱۷۰۶ در فیلادلفیا تأسیس شد و این شهر میزبان چندین کلیسای تاریخی پرسبیترین است، مانند کلیسای اول پرسبیترین در فیلادلفیا و کلیسای دوم پرسبیترین در فیلادلفیا.
سایر مناطق

پرسبیترینیسم به مناطق دیگری در سراسر جهان، مانند اروپا، آسیا و آفریقا گسترش یافته است. در اروپا، فرقه‌هایی در اسکاتلند، ایرلند و انگلستان وجود دارد.
در آسیا، فرقه‌های پرسبیترین در کره جنوبی، تایوان و ژاپن وجود دارد. در آفریقا، فرقه‌هایی در غنا، نیجریه و آفریقای جنوبی وجود دارد.
حضور قابل توجهی در آمریکا، ایالات متحده و فیلادلفیا دارد، اما به مناطق دیگری مانند اروپا، آسیا و آفریقا نیز گسترش یافته است.
تأثیرات اجتماعی و مشارکت‌ها

به عنوان کسی که پرسبیترین است، باید به تأثیرات اجتماعی و مشارکت‌هایی که فرقه من در طول تاریخ داشته است افتخار کنم.
پرسبیترین‌ها در مأموریت‌های مختلف در سراسر جهان، از جمله امدادرسانی در بلایای طبیعی، انجیل‌گرایی و آموزش شرکت داشته‌اند.
یکی از قابل توجه‌ترین مشارکت‌های این نوع کلیسا در زمینه آموزش است.
آن‌ها مدارس و دانشگاه‌های زیادی را در سراسر جهان تأسیس کرده‌اند، از جمله دانشگاه پرینستون که در سال ۱۷۴۶ توسط کلیسای پرسبیترین تأسیس شد.
این مؤسسات تأثیر قابل توجهی بر جامعه داشته‌اند و بسیاری از رهبران تأثیرگذار در زمینه‌های مختلف را پرورش داده‌اند.
علاوه بر آموزش، پرسبیترین‌ها همچنین در مسائل عدالت اجتماعی دخیل بوده‌اند. این کلیسا سابقه طولانی در حمایت از حقوق جوامع حاشیه‌نشین، از جمله زنان، اقلیت‌ها و فقرا دارد.
بسیاری از این کلیساها برنامه‌های عدالت اجتماعی را برای رسیدگی به مسائلی مانند فقر، نژادپرستی و نابرابری ایجاد کرده‌اند.
پرسبیترین‌ها همچنین سنت قوی در ترویج بشردوستی و شفقت دارند.
این کلیسا در تلاش‌های بشردوستانه مختلف، از جمله امدادرسانی در بلایای طبیعی، کمک به پناهندگان و ابتکارات مراقبت‌های بهداشتی شرکت داشته است.
کمک به بلایای طبیعی پرسبیترین (PDA)، به عنوان مثال، وزارتی از کلیسای پرسبیترین (ایالات متحده آمریکا) است که امداد و پشتیبانی را به جوامعی که از بلایای طبیعی آسیب دیده‌اند ارائه می‌دهد.
آن‌ها در طول تاریخ مشارکت‌های اجتماعی قابل توجهی داشته‌اند و کلیسا همچنان در مأموریت‌ها و ابتکارات عدالت اجتماعی مختلف در حال حاضر دخیل است.
اختلافات و بحث‌ها

هنگام بررسی اختلافات و بحث‌ها، چندین زمینه وجود دارد که فرقه‌های پرسبیترین و پروتستان در آن تفاوت دارند.
در اینجا برخی از مهمترین اختلافات و بحث‌ها آورده شده است:
تقدیر

یکی از مهمترین تفاوت‌ها بین پرسبیترین‌ها و پروتستان‌ها اعتقاد آن‌ها به تقدیر است. پرسبیترین‌ها به تقدیر اعتقاد دارند، به این معنی که خدا از قبل تعیین کرده است چه کسی نجات یابد و چه کسی نجات نیابد.
از سوی دیگر، پروتستان‌ها به تقدیر اعتقاد ندارند و معتقدند که هر کسی می‌تواند اگر عیسی مسیح را به عنوان ناجی خود بپذیرد، نجات یابد.
اقتدار کتاب مقدس

زمینه دیگری که پرسبیترین‌ها و پروتستان‌ها در آن تفاوت دارند، دیدگاه آن‌ها در مورد اقتدار کتاب مقدس است.
پرسبیترین‌ها معتقدند که کتاب مقدس بالاترین مرجع در امور ایمان و عمل است.
پروتستان‌ها، از سوی دیگر، معتقدند که کتاب مقدس کلام الهام‌گرفته خداست، اما این تنها مرجع در امور ایمان و عمل نیست.
انضباط

پرسبیترین‌ها و پروتستان‌ها همچنین در رویکرد خود به انضباط تفاوت دارند. پرسبیترین‌ها به انضباط کلیسا اعتقاد دارند، به این معنی که کلیسا اختیار دارد اعضای خود را به دلیل رفتار گناه آلود مجازات کند.
پروتستان‌ها، از سوی دیگر، معتقدند که انضباط باید به عهده فرد و رابطه او با خدا گذاشته شود.
تأکید

در نهایت، تفاوت در نحوه تأکید پرسبیترین‌ها و پروتستان‌ها بر باورهای خود وجود دارد.
پرسبیترین‌ها به خاطر قاطعیت و سگما‌تیک بودن در باورهای خود شناخته می‌شوند، در حالی که پروتستان‌ها تمایل دارند ذهن بازتر و پذیرای دیدگاه‌های مختلف باشند.
به طور کلی، در حالی که تفاوت‌های متعددی بین پرسبیترین‌ها و پروتستان‌ها وجود دارد، مهم است که به یاد داشته باشیم که هر دو گروه ایمانی مشترک به عیسی مسیح و تمایل به خدمت به او دارند.


بسیاری از پیوندهای موجود در این مقاله به یک محصول بررسی‌شده‌ی خاص هدایت می‌شوند. خرید این محصولات از طریق پیوندهای وابسته به تولید کمیسیون برای Christian.net کمک می‌کند، بدون هیچ‌گونه هزینه اضافی. (برای کسب اطلاعات بیشتر اینجا را ببینید)
فهرست مطالب

مقدمه
اعتقادات و اعمال
سلسله مراتب کلیسا
آیین‌های مقدس
عبادت و مراسم مذهبی
دیدگاه‌ها در مورد رستگاری
نتیجه‌گیری

مقدمه
کاتولیسیسم و پرسبیترینیسم دو شاخه‌ی متمایز از مسیحیت هستند که هر کدام تاریخچه‌ی غنی، اعتقادات و اعمال خاص خود را دارند. در حالی که هر دو سنت در آموزه‌های عیسی مسیح ریشه دارند، در طول قرن‌ها به طور جداگانه تکامل یافته‌اند که منجر به تفاوت‌هایی در الهیات، ساختار کلیسا و عبادت شده است. درک تفاوت‌های بین کاتولیسیسم و پرسبیترینیسم می‌تواند بینش‌های ارزشمندی را در مورد بافت متنوع ایمان مسیحی ارائه دهد.
بررسی این تفاوت‌ها به منظور تعیین برتری یا ضعف نیست؛ بلکه فرصتی برای قدردانی از بیان‌های منحصر به فرد ایمان است که در سنت مسیحی پدیدار شده‌اند. با بررسی ویژگی‌های متمایز کاتولیسیسم و پرسبیترینیسم، می‌توانیم درک عمیق‌تری از ماهیت چندوجهی مسیحیت و راه‌های مختلفی که افراد و جوامع با باورهای معنوی خود ارتباط برقرار می‌کنند، به دست آوریم.
در بخش‌های بعدی، سفری مقایسه‌ای را آغاز خواهیم کرد و اصول اساسی، آیین‌ها و ساختارهای سازمانی را که کاتولیسیسم را از پرسبیترینیسم متمایز می‌کند، بررسی خواهیم کرد. با روشن کردن این تفاوت‌ها، هدف ما تقویت قدردانی بیشتر برای تنوع تفکر و عمل مسیحی است و در نهایت، درک جمعی ما را از بافت چندوجهی ایمان مسیحی غنی‌تر می‌کنیم.
اعتقادات و اعمال
کاتولیسیسم و پرسبیترینیسم مجموعه‌های متمایزی از اعتقادات و اعمال را در بر می‌گیرند که زندگی معنوی پیروان خود را شکل می‌دهند. درک این تفاوت‌ها برای فهم تفاوت‌های کلامی و عقیدتی بین این دو سنت ضروری است.
کاتولیسیسم
کاتولیسیسم، با ریشه‌هایی که به اوایل کلیسای مسیحی بازمی‌گردد، مجموعه‌ای غنی از اعتقادات و اعمال را حفظ می‌کند. محور اصلی ایمان کاتولیک، پرستش تثلیث مقدس - پدر، پسر و روح القدس - و همچنین پرستش مریم، مادر عیسی، و جماعت قدیسین است. کاتولیک‌ها به اقتدار پاپ اعتقاد دارند که به عنوان جانشین سنت پیتر و رئیس دنیوی کلیسا در نظر گرفته می‌شود. آموزه‌ی استحاله، که می‌آموزد نان و شراب مورد استفاده در عشای ربانی به بدن و خون واقعی مسیح تبدیل می‌شوند، یک اصل اساسی از ایمان کاتولیک است. علاوه بر این، آیین‌های مقدس، از جمله تعمید، تایید، اعتراف، ازدواج، کشیشی و مسح بیماران، اهمیت زیادی در سنت کاتولیک دارند.
پرسبیترینیسم
در مقابل، پرسبیترینیسم، شاخه‌ای از پروتستانیسم اصلاح‌شده، بر حاکمیت خدا و اقتدار کتاب مقدس تأکید دارد. پرسبیترین‌ها به مفهوم تقدیر اعتقاد دارند، که ادعا می‌کند خدا رستگاری برخی افراد را از پیش تعیین کرده است. حکومت کلیسای پرسبیترین با سیستمی از بزرگان یا پرسبیترها مشخص می‌شود که اقتدار را در کلیسا در اختیار دارند. بر خلاف کاتولیسیسم، عبادت پرسبیترین با سادگی مشخص می‌شود، با تأکید بر موعظه و خواندن مزامیر و سرودها. آیین‌های مقدس، از جمله تعمید و شام ربانی، در عبادت پرسبیترین مرکزی هستند و با احترام و وقار برگزار می‌شوند.
تفاوت‌های اعتقادات و اعمال کاتولیسیسم و پرسبیترینیسم، تحولات تاریخی و الهیاتی را که این سنت‌ها را شکل داده‌اند، منعکس می‌کند. در حالی که کاتولیسیسم بر پرستش قدیسین، اقتدار پاپ و ماهیت آیین‌های مقدس تأکید دارد، پرسبیترینیسم بر حاکمیت خدا، اقتدار کتاب مقدس و رویکرد ساده‌تر به عبادت و حکومت تأکید می‌کند.
درک این تمایزات، بیان‌های متنوع ایمان مسیحی را روشن می‌کند و ماهیت چندوجهی معنویت را در سنت مسیحی گسترده‌تر برجسته می‌کند. با به رسمیت شناختن و قدردانی از این تفاوت‌ها، می‌توانیم درک عمیق‌تری از بافت غنی از باورها و اعمالی که کاتولیسیسم و پرسبیترینیسم را مشخص می‌کنند، ایجاد کنیم.
سلسله مراتب کلیسا
کاتولیسیسم
در کاتولیسیسم، سلسله مراتب کلیسا با ساختاری متمرکز با پاپ در راس آن مشخص می‌شود. پاپ که به عنوان اسقف رم نیز شناخته می‌شود، به عنوان جانشین سنت پیتر در نظر گرفته می‌شود که عیسی رهبری کلیسای اولیه مسیحی را به او سپرد. به عنوان عالی‌ترین پاپ، پاپ بالاترین اقتدار را در مسائل ایمان و اخلاق برای کاتولیک‌ها در سراسر جهان دارد. زیر پاپ، کالج کاردینال‌ها وجود دارد که به عنوان مشاوران خدمت می‌کنند و پاپ جدید را پس از خالی شدن مقام انتخاب می‌کنند. سطح بعدی سلسله مراتب شامل اسقف‌ها است که بر اسقف‌نشین‌ها نظارت می‌کنند و مسئول رفاه معنوی مؤمنان در مناطق مربوطه خود هستند. علاوه بر این، کشیشان که به عنوان رهبران معنوی در کلیساهای محلی خدمت می‌کنند و دیوان‌ها که در وزارت‌های شبانی و خیریه کمک می‌کنند، اجزای ضروری ساختار سلسله مراتبی کلیسای کاتولیک را تشکیل می‌دهند.
پرسبیترینیسم
در مقابل، پرسبیترینیسم از یک مدل غیرمتمرکزتر حکومت کلیسا پیروی می‌کند. سلسله مراتب کلیسا با سیستمی از بزرگان یا پرسبیترها مشخص می‌شود که به طور جمعی نهاد حاکم به نام مجمع را تشکیل می‌دهند. این مدل رهبری جمعی، تأکید پرسبیترین بر تصمیم‌گیری مشترک و اجتناب از تمایزات سلسله مراتبی در بین روحانیون را منعکس می‌کند. هر مجمع به یک نهاد منطقه‌ای گسترده‌تر به نام سنا متصل است که از مجمع‌های فردی در حوزه قضایی خود پشتیبانی و نظارت می‌کند. در سطح ملی، مجمع عمومی به عنوان عالی‌ترین نهاد حاکم عمل می‌کند و نمایندگانی از مجمع‌ها و سناها را گرد هم می‌آورد تا به مسائل الهیاتی، اداری و کلیسایی رسیدگی کنند.
ساختارهای متضاد سلسله مراتب کلیسا در کاتولیسیسم و پرسبیترینیسم، رویکردهای متفاوت به رهبری، اقتدار و تصمیم‌گیری در سنت‌های مربوطه را منعکس می‌کند. در حالی که کاتولیسیسم یک مدل متمرکز را با پاپ به عنوان مرجع نهایی در آغوش می‌گیرد، پرسبیترینیسم یک رویکرد برابرتر و مشارکتی به حکومت کلیسا را تجسم می‌بخشد و بر خرد و تشخیص جمعی بزرگان و مجمع‌ها تأکید می‌کند. درک این تمایزات، چارچوب‌های سازمانی متنوعی را که ابعاد معنوی و اداری جوامع ایمان کاتولیک و پرسبیترین را زیربنا می‌کنند، روشن می‌کند.
آیین‌های مقدس
کاتولیسیسم
در کاتولیسیسم، آیین‌های مقدس اهمیت عمیقی به عنوان آیین‌های مقدسی دارند که فیض خدا را به مؤمنان منتقل می‌کنند. کلیسای کاتولیک هفت آیین مقدس را به رسمیت می‌شناسد که هر کدام به عنوان نشانه‌ای مرئی از حضور خدا و وسیله‌ای برای تغذیه معنوی مؤمنان عمل می‌کنند. این آیین‌های مقدس شامل تعمید، تایید، اقرار، ازدواج، کشیشی و مسح بیماران است.
تعمید، آغاز به ایمان مسیحی را نشان می‌دهد و فرد را از گناه اصلی پاک می‌کند و او را به جامعه مؤمنان وارد می‌کند. تایید، که اغلب در دوران نوجوانی انجام می‌شود، پیوند با کلیسا را تقویت می‌کند و عطایای روح القدس را اعطا می‌کند. عشای ربانی که به عنوان مقدس نیز شناخته می‌شود، آیین مقدس مرکزی عبادت کاتولیک است که در آن مؤمنان در بدن و خون مسیح شرکت می‌کنند. اقرار یا آشتی، فرصتی را برای توبه و بخشش گناهان از طریق اعتراف به یک کشیش فراهم می‌کند. مسح بیماران، شفا و آسایش معنوی را برای کسانی که با بیماری یا ضعف روبرو هستند، فراهم می‌کند. کشیشی، افراد را به کشیشی منصوب می‌کند، در حالی که ازدواج، پیوند دو فرد در ازدواج را تقدیس می‌کند.
پرسبیترینیسم
در پرسبیترینیسم، آیین‌های مقدس به عنوان اعمال نمادین دیده می‌شوند که حقایق معنوی ایمان مسیحی را نشان می‌دهند. این سنت دو آیین مقدس را به رسمیت می‌شناسد: تعمید و شام ربانی (عشای ربانی). تعمید که اغلب به نوزادان به عنوان نشانه‌ای از عهد خدا با فرد و گنجاندن او در جامعه ایمان داده می‌شود، نمادی از شستن گناه و تولد دوباره در مسیح است. شام ربانی که با نان و شراب جشن گرفته می‌شود، مرگ فداکارانه عیسی مسیح و تغذیه معنوی به دست آمده از شرکت در عناصر را به یاد می‌آورد.
رویکرد پرسبیترین به آیین‌های مقدس بر ماهیت نمادین آنها تأکید می‌کند و بر نقش آنها به عنوان نشانه‌های مرئی از فیض خدا و واقعیت‌های معنوی سفر مسیحی تأکید می‌کند. در حالی که درک کاتولیک از آیین‌های مقدس بر کارایی آنها به عنوان کانال‌های فیض الهی تأکید دارد، پرسبیترینیسم بر اهمیت نمادین و آموزشی آنها در زمینه عبادت و شکل‌گیری معنوی تأکید می‌کند.
دیدگاه‌های متفاوت در مورد آیین‌های مقدس در کاتولیسیسم و پرسبیترینیسم، ظرافت‌های الهیاتی و تأکیدات عقیدتی را که این سنت‌ها را متمایز می‌کنند، منعکس می‌کند. درک این تفاوت‌ها، بینش‌های ارزشمندی را در مورد بیان‌های متنوع ایمان مسیحی و تفاسیر متفاوت از زندگی آیین‌های مقدس در سنت مسیحی گسترده‌تر ارائه می‌دهد.
عبادت و مراسم مذهبی
کاتولیسیسم
در کاتولیسیسم، عبادت و مراسم مذهبی نقش محوری در زندگی معنوی مؤمنان ایفا می‌کنند. جشن عشای ربانی که به عنوان مقدس نیز شناخته می‌شود، به عنوان اوج عبادت کاتولیک قرار دارد. مقدس با نمادگرایی غنی، نظم ساختاریافته و مشارکت مؤمنان در بازسازی قربانی مسیح مشخص می‌شود. تقویم مذهبی که فصل‌های روزآمد، کریسمس، روزه، عید پاک و زمان معمولی را دنبال می‌کند، ریتم عبادت کاتولیک را راهنمایی می‌کند و چارچوبی برای یادبود رویدادهای کلیدی در زندگی مسیح و کلیسا فراهم می‌کند.
مراسم مذهبی کاتولیک با احترام به سنت مشخص می‌شود و آیین‌های مقدس، دعاها و سرودهایی را در بر می‌گیرد که از قرن‌ها به نسل‌ها منتقل شده‌اند. استفاده از بخور، شمع و لباس‌های مقدس به غنای حسی تجربه مذهبی می‌افزاید و فضایی مقدس ایجاد می‌کند که از عبادت‌کنندگان دعوت می‌کند تا با رازهای الهی درگیر شوند.
پرسبیترینیسم
در عبادت پرسبیترین، سادگی و وقار ویژگی‌های کلیدی هستند که بیان مذهبی ایمان را شکل می‌دهند. تمرکز بر موعظه کلام است و موعظه‌ها جایگاه مرکزی در خدمات عبادت پرسبیترین دارند. خواندن سرودها که اغلب با موسیقی ارگان همراه است، جنبه‌ای ارزشمند از مراسم مذهبی پرسبیترین است و مشارکت جمعی نقش مهمی در تجربه عبادت موسیقی دارد.
عبادت پرسبیترین توسط راهنمای عبادت عمومی خدا هدایت می‌شود که اصول و عناصر عبادت در این سنت را مشخص می‌کند. رعایت آیین‌های مقدس، به ویژه تعمید و شام ربانی، جزء جدایی‌ناپذیر از عمل مذهبی پرسبیترین است و با احترام و وقار جشن گرفته می‌شود.
رویکردهای متضاد
رویکردهای متضاد به عبادت و مراسم مذهبی در کاتولیسیسم و پرسبیترینیسم، تأکیدات متفاوت بر سنت، نمادگرایی و مشارکت جمعی را منعکس می‌کند. در حالی که مراسم مذهبی کاتولیک یک فرم پیچیده‌تر و آیین‌دارانه از عبادت را در بر می‌گیرد، عبادت پرسبیترین بر سادگی و مرکزیت موعظه و مشارکت جمعی تأکید می‌کند.
درک این تفاوت‌ها، بینش‌های ارزشمندی را در مورد راه‌های متنوعی که جوامع مسیحی ایمان خود را ابراز می‌کنند و با مقدسات ارتباط برقرار می‌کنند، ارائه می‌دهد. سبک‌های متمایز عبادت و مراسم مذهبی در کاتولیسیسم و پرسبیترینیسم به بافت غنی سنت‌های مسیحی کمک می‌کند و راه‌های متنوعی را برای عبادت‌کنندگان برای مواجهه با الهی و پرورش زندگی معنوی خود ارائه می‌دهد.
دیدگاه‌ها در مورد رستگاری
کاتولیسیسم و پرسبیترینیسم دیدگاه‌های متمایزی در مورد مفهوم رستگاری دارند که تفاوت‌های الهیاتی و تأکیدات عقیدتی آنها را منعکس می‌کند. این دیدگاه‌ها درک چگونگی آشتی افراد با خدا و دستیابی به حیات ابدی را شکل می‌دهند و به عنوان عناصر اساسی سیستم اعتقادی هر سنت عمل می‌کنند.
در کاتولیسیسم، رستگاری به عنوان یک تلاش مشترک بین فیض الهی و پاسخ انسان دیده می‌شود. مفهوم توجیه، که شامل فرآیند درست شدن در نظر خدا است، در الهیات کاتولیک مرکزی است. کلیسای کاتولیک می‌آموزد که رستگاری از طریق ایمان، مشارکت در آیین‌های مقدس و پیگیری اعمال نیک الهام گرفته از فیض خدا به دست می‌آید. آیین‌های مقدس، به ویژه تعمید و عشای ربانی، به عنوان ابزاری در اعطای فیض الهی در نظر گرفته می‌شوند، در حالی که اعمال خیریه و زندگی اخلاقی به عنوان بیان‌های ضروری ایمان دیده می‌شوند. درک کاتولیک از رستگاری، مفهوم تقدیس را در بر می‌گیرد، که در آن مؤمنان فراخوانده می‌شوند تا در قدسیت رشد کنند و با فیض خدا به کمال معنوی تلاش کنند.
در مقابل، پرسبیترینیسم بر حاکمیت خدا در رستگاری افراد تأکید دارد. ریشه در سنت اصلاح‌شده، الهیات پرسبیترین مفهوم تقدیر را بیان می‌کند، که ادعا می‌کند خدا، در اراده الهی خود، رستگاری افراد خاصی را از پیش تعیین کرده است. این دکترین که اغلب با آموزه‌های جان کالوین همراه است، بر این باور تأکید می‌کند که فیض خدا تنها عامل تعیین‌کننده در رستگاری مؤمنان است. در حالی که پرسبیترینیسم بر اهمیت ایمان و کار تحول‌آفرین روح‌القدس در زندگی مؤمنان تأکید می‌کند، این سنت تأکید اصلی را بر انتخاب حاکمانه‌ی خدا و اطمینان از رستگاری برای کسانی که توسط خدا انتخاب شده‌اند، قرار می‌دهد.
دیدگاه‌های متفاوت در مورد رستگاری در کاتولیسیسم و پرسبیترینیسم، ظرافت‌های الهیاتی و تأکیدات عقیدتی را که این سنت‌ها را متمایز می‌کنند، منعکس می‌کند. در حالی که کاتولیسیسم بر رابطه مشارکتی بین فیض الهی و پاسخ انسان در پیگیری رستگاری تأکید دارد، پرسبیترینیسم بر حاکمیت خدا در انتخاب و رهایی افراد تأکید می‌کند.
درک این دیدگاه‌های متفاوت، قدردانی ما را از ماهیت چندوجهی ایمان مسیحی و راه‌های متنوعی که مؤمنان مفهوم رستگاری را درک و تجربه می‌کنند، غنی می‌کند. این دیدگاه‌های متضاد در مورد رستگاری به غنای الهیاتی سنت مسیحی کمک می‌کند و لنزهای متمایزی را ارائه می‌دهد که از طریق آنها افراد و جوامع با سؤالات عمیق سرنوشت انسان و فیض الهی درگیر می‌شوند.
نتیجه‌گیری
در نتیجه، مقایسه کاتولیسیسم و پرسبیترینیسم بافت غنی از باورها، اعمال و ساختارهای سازمانی را آشکار می‌کند که این دو شاخه از مسیحیت را متمایز می‌کند. بررسی تفاوت‌های آنها بینش‌های ارزشمندی را در مورد بیان‌های متنوع ایمان مسیحی و ظرافت‌های الهیاتی که این سنت‌ها را در طول زمان شکل داده‌اند، ارائه می‌دهد.
کاتولیسیسم، با تأکید بر پرستش قدیسین، اقتدار پاپ و ماهیت آیین‌های مقدس، احترام عمیقی به سنت، آیین و جنبه‌های جمعی ایمان نشان می‌دهد. مرکزیت عشای ربانی، پرستش مریم و زندگی آیین‌های مقدس، غنای آیین و عمق معنوی باورها و اعمال کاتولیک را برجسته می‌کند.
از سوی دیگر، پرسبیترینیسم، ریشه در سنت اصلاح‌شده، رویکرد ساده‌تری به عبادت، حکومت و تفسیر الهیاتی را تجسم می‌بخشد. تأکید بر حاکمیت خدا، اقتدار کتاب مقدس و یک مدل جمعی حکومت کلیسا، تأکیدات الهیاتی و ساختارهای کلیسایی متمایزی را که جوامع ایمان پرسبیترین را تعریف می‌کند، برجسته می‌کند.
دیدگاه‌های متضاد در مورد رستگاری، سلسله مراتب کلیسا، آیین‌های مقدس، عبادت و مراسم مذهبی، مناظر الهیاتی متنوعی را در سنت مسیحی گسترده‌تر نشان می‌دهد. در حالی که کاتولیسیسم و پرسبیترینیسم در عناصر دکترین و کلیسایی کلیدی اختلاف نظر دارند، هر دو سنت گواهی بر پویایی و سازگاری مداوم ایمان مسیحی در زمینه‌های فرهنگی و تاریخی متنوع هستند.
با به رسمیت شناختن و قدردانی از این تفاوت‌ها، درک عمیق‌تری از ماهیت چندوجهی باور مسیحی و عمل به دست می‌آوریم. غنای الهیاتی و تنوع درون مسیحیت ما را به پذیرش روحیه‌ای از گفتگو، احترام متقابل و تعهد مشترک به دنبال کردن حقیقت معنوی و شکوفایی جمعی دعوت می‌کند.
در نهایت، مقایسه کاتولیسیسم و پرسبیترینیسم یادآوری از پویایی و سازگاری مداوم ایمان مسیحی است و ما را به درگیر شدن با بیان‌های متنوع معنویت و پرورش قدردانی عمیق‌تر برای بافت غنی از باورها و اعمالی که سنت مسیحی را مشخص می‌کند، دعوت می‌کند.


سلام به همه علاقه‌مندان C++!
به این راهنمای مختصر درباره اشاره‌گرهای هوشمند C++ خوش آمدید. امروز، به دنیای این ابزارها شیرجه می‌زنیم که مدیریت حافظه در برنامه‌های C++ شما را بسیار آسان‌تر و ایمن‌تر می‌کند.
در این مقاله، سه نوع اشاره‌گر هوشمند را بررسی می‌کنیم و چند نکته عملی در مورد نحوه استفاده از آن‌ها مانند یک حرفه‌ای به اشتراک می‌گذاریم. بنابراین، چه یک تازه‌کار C++ باشید و چه یک برنامه‌نویس باتجربه، فکر می‌کنم این مقاله برای شما بسیار مفید خواهد بود.
اشاره‌گر هوشمند عمومی
همانطور که می‌دانید، C++ به خاطر ارائه ابزارهایی که به شما کمک می‌کنند تا به روش‌های مختلف دچار خطای segmentation fault یا نشت حافظه شوید، مشهور است. مشکل اصلی این نوع خطاهای زمان اجرا، استفاده از اشاره‌گرهای خام و مواردی مانند فراموش کردن آزاد کردن حافظه یا دسترسی به قسمت اشتباه حافظه است.
به طور کلی، بیشتر مشکلات مربوط به حافظه را می‌توان با استفاده از اشاره‌گرهای هوشمند برطرف کرد. ایده آن‌ها کنترل مالکیت اشاره‌گر و آزادسازی خودکار حافظه است.
از استاندارد 11 C++ به بعد، سه نوع اشاره‌گر داریم: std::unique_ptr، std::shared_ptr و std::weak_ptr. با کمک آن‌ها می‌توانید (و فکر می‌کنم باید) 99٪ از کارهای روزمره خود را حل کنید.
اشاره‌گر یکتا
اشاره‌گر یکتا نوعی از اشاره‌گرهای هوشمند است که یک مکانیسم ساده برای مدیریت یک اشاره‌گر خام توسط یک مالک پیاده‌سازی می‌کند. اشاره‌گر داخل نمی‌تواند به طور تصادفی به دیگری کپی شود. پس از آزادسازی پشته، اشاره‌گر داخل نیز حذف می‌شود.
در پیاده‌سازی C++ از اشاره‌گرهای هوشمند، آن‌ها دقیقاً به همان روشی که اشاره‌گرهای خام کار می‌کنند، کار می‌کنند. در اینجا یک مثال کلی از نحوه استفاده از اشاره‌گرهای هوشمند آورده شده است:
#include <iostream>
#include <memory>
int main() {
std::unique_ptr<int> u1(new int(1));
std::unique_ptr<int> u2(new int(2));
std::unique_ptr<int> u3 = std::move(u1);
// std::unique_ptr<int> u4 = u2; // error

if(u1) {
        // چاپ نمی‌شود زیرا u1 تهی است
        std::cout << *u1 << std::endl;
    }
    if(u2) {
        std::cout << *u2 << std::endl;
    }
    if(u3) {
        std::cout << *u3 << std::endl;
    }
return 0;
}
همانطور که از مثال بالا می‌بینید، اشاره‌گر یکتا نمی‌تواند کپی شود، این توسط کامپایلر تضمین شده است. همچنین، اگر مطمئن نیستید، خوب است بررسی کنید که آیا std::unique_ptr شما آدرس معتبری دارد (nullptr نیست) تا بتوانید به داده‌ها دسترسی پیدا کنید.
مالکیت همچنین می‌تواند با استفاده از تابع release به دست آید که با کمک آن می‌توانید اشاره‌گر را دریافت کنید و std::uniques_ptr دیگر آن را در اختیار نخواهد داشت. با این حال، من استفاده از این تابع را توصیه نمی‌کنم زیرا ممکن است ناامن باشد.
#include <iostream>
#include <memory>
int main() {
std::unique_ptr<int> uniqueInt(new int(42));
std::cout << *uniqueInt << std::endl; // 42

int* rawPtr = uniqueInt.release();
    std::cout << *rawPtr << std::endl; // 42
if (!uniqueInt) {
        std::cout << "دیگر حافظه را در اختیار ندارد." << std::endl;
    }
delete rawPtr;
return 0;
}
اشاره‌گر مشترک
هشدار: پس از بررسی دقیق‌تر، متوجه خواهید شد که این نوع اشاره‌گر تقریباً به همان روشی که یک جمع‌آورنده زباله انتزاعی کار می‌کند، عمل می‌کند، اما حافظه تخصیص‌یافته درست پس از زمانی که دیگر نیازی به آن نیست، آزاد می‌شود.
ایده اشاره‌گر مشترک این است که به همه مالکان (بیش از یک) اجازه دهد به یک داده یکسان اشاره کنند.
مهم: حافظه فقط در صورتی آزاد می‌شود که آخرین شیء shared_ptr حذف شود، بنابراین هر کسی که می‌خواهد این داده‌ها به وجود خود ادامه دهند.
در اینجا یک مثال کوچک از نحوه کار آن آورده شده است:
#include <iostream>
#include <memory>
int main() {
std::shared_ptr<int> sharedInt = std::make_shared<int>(12);

std::cout << *sharedInt << std::endl; // 12
std::shared_ptr sharedInt2 = sharedInt;
*sharedInt = 100;
std::cout << *sharedInt << std::endl; // 100
    std::cout << *sharedInt2 << std::endl; // 100
return 0;
}
همچنین می‌توان آن را به راحتی کپی کرد:
#include <iostream>
#include <memory>
void printValue(std::shared_ptr sharedInt) {
std::cout << *sharedInt << std::endl; // 123

}
int main() {
    std::shared_ptr sharedInt = std::make_shared<int>(123);
    printValue(sharedInt);
    return 0;
}
و در اینجا مثالی وجود دارد که نشان می‌دهد چگونه آزادسازی حافظه اتفاق می‌افتد. می‌توانیم آن را با استفاده از تابع use_count بررسی کنیم که با کمک آن می‌توانیم بدانیم چند مالک وجود دارد.
#include <iostream>
#include <memory>
class MyClass {
public:
    MyClass(int value) : value(value) {}
~MyClass() {}
private:
    int value;
};
int main() {
    std::shared_ptr sharedObj = std::make_shared<MyClass>(42);
    std::shared_ptr sharedObj2 = sharedObj;
std::cout << sharedObj.use_count()  << std::endl; // 2
    std::cout << sharedObj2.use_count() << std::endl; // 2
sharedObj.reset();
std::cout << sharedObj.use_count()  << std::endl; // 0
    std::cout << sharedObj2.use_count() << std::endl; // 1
sharedObj2.reset();
std::cout << sharedObj.use_count()  << std::endl; // 0
    std::cout << sharedObj2.use_count() << std::endl; // 0
return 0;
}
اشاره‌گر ضعیف
به طور خلاصه، std::weak_ptr مانند std::shared_ptr است، اما مالک حافظه نیست، بنابراین می‌تواند حتی اگر یک اشاره‌گر ضعیف به آن اشاره کند، آزاد شود. در اینجا نحوه استفاده از آن آمده است:
#include <iostream>
#include <memory>
int main() {
std::shared_ptr<int> sharedInt = std::make_shared<int>(42);
std::weak_ptr<int> weakInt = sharedInt;

std::cout << "مالکان: " << sharedInt.use_count() << std::endl;
if (auto shared = weakInt.lock()) {
        std::cout << "مقدار: " << *shared << std::endl;
    } else {
        std::cout << "در دسترس نیست" << std::endl;
    }
// آزاد کردن اشاره‌گر مشترک
    sharedInt.reset();
if (auto shared = weakInt.lock()) {
        std::cout << "مقدار: " << *shared << std::endl;
    } else {
        std::cout << "در دسترس نیست" << std::endl;
    }
return 0;
}
خروجی:
مالکان: 1
مقدار: 42
در دسترس نیست
بنابراین، اشاره‌گر ضعیف مالک حافظه نیست و می‌توان آن را به طور ایمن آزاد کرد. این مفهوم بسیار ساده‌ای است، اما من مطمئن هستم که نمی‌دانید چرا C++ به آن نیاز دارد. در پاراگراف بعدی توضیح خواهم داد.
تله با اشاره‌گرهای مشترک
تصور کنید دو شیء دارید که هر کدام دارای اشاره‌گر مشترک به دیگری به عنوان یک فیلد هستند. ما از آن‌ها برای مدتی استفاده کردیم و باید آزاد شوند. Object1 مخرب خود را فراخوانی می‌کند و سعی می‌کند ابتدا فیلد اشاره‌گر مشترک خود از Object2 را آزاد کند، سپس مخرب Object2 فراخوانی می‌شود و ابتدا فیلد اشاره‌گر مشترک خود از Object1 را آزاد می‌کند. اوه نه، این یک تله است!
در اینجا مثالی از چنین موقعیتی آورده شده است:
#include <iostream>
#include <memory>
class B;
class A {
public:
    std::shared_ptr b_ptr;
A() {
        std::cout << "سازنده A" << std::endl;
    }
~A() {
        std::cout << "مخرب A" << std::endl;
    }
};
class B {
public:
    std::shared_ptr a_ptr;
B() {
        std::cout << "سازنده B" << std::endl;
    }
~B() {
        std::cout << "مخرب B" << std::endl;
    }
};
int main() {
    {
        std::shared_ptr a = std::make_shared<A>();
        std::shared_ptr b = std::make_shared<B>();
a->b_ptr = b;
        b->a_ptr = a;
    }
return 0;
}
خروجی:
سازنده A
سازنده B
مخرب‌ها هرگز فراخوانی نمی‌شوند، بنابراین حافظه آزاد نمی‌شود.
برای جلوگیری از چنین موقعیتی، باید از کلاس std::weak_ptr استفاده کنید که عملکرد اصلی آن این است که اگر قرار باشد تخصیص داده شود، ادعا نکند.
در اینجا مثالی وجود دارد که در آن از اشاره‌گر ضعیف برای رفع مشکل استفاده می‌کنم:
#include <iostream>
#include <memory>
class B; // اعلان پیش‌رو
class A {
public:
    std::shared_ptr b_ptr;
A() {
        std::cout << "سازنده A" << std::endl;
    }
~A() {
        std::cout << "مخرب A" << std::endl;
    }
};
class B {
public:
    std::weak_ptr a_weak_ptr;
B() {
        std::cout << "سازنده B" << std::endl;
    }
~B() {
        std::cout << "مخرب B" << std::endl;
    }
};
int main() {
    std::shared_ptr a = std::make_shared<A>();
    std::shared_ptr b = std::make_shared<B>();
a->b_ptr = b;
    b->a_weak_ptr = a;
// چرخه اشاره‌گر مشترک شکسته شده است و حافظه به درستی آزاد می‌شود زمانی که دیگر نیازی به مراجع نباشد.
return 0;
}
اکنون مخرب‌ها فراخوانی می‌شوند و تمام حافظه آزاد می‌شود:
سازنده A
سازنده B
مخرب A
مخرب B
نتیجه‌گیری
به طور خلاصه، اشاره‌گرهای هوشمند C++ ابزارهای مفیدی هستند که به مدیریت حافظه به روشی ایمن‌تر و کارآمدتر کمک می‌کنند. با استفاده از std::unique_ptr، std::shared_ptr و std::weak_ptr، برنامه‌نویسان می‌توانند مدیریت حافظه را آسان‌تر کنند. به یاد داشته باشید، std::weak_ptr می‌تواند به جلوگیری از مشکلات حافظه زمانی که اشیاء به یکدیگر وابسته هستند کمک کند و اطمینان حاصل کند که برنامه‌های C++ شما به طور روان و قابل اعتماد اجرا می‌شوند.
امیدوارم از این مقاله لذت برده باشید و برای شما مفید بوده باشد. اگر چنین است، لطفاً کف بزنید تا من از آن مطلع شوم.
منابع مورد استفاده:

https://en.cppreference.com/w/
https://www.learncpp.com/cpp-tutorial/circular-dependency-issues-with-stdshared_ptr-and-stdweak_ptr/

Github | برای من قهوه بخرید | LinkedIn


اشاره‌گرهای هوشمند نوعی کلاس مدیریت منابع در ++C هستند که به عنوان یک پوشش برای اشاره‌گر خام عمل می‌کنند. آن‌ها جمع‌آوری زباله خودکار را فراهم می‌کنند و اطمینان می‌دهند که حافظه زمانی آزاد شود که دیگر مورد نیاز نباشد. اشاره‌گرهای هوشمند می‌توانند به جلوگیری از نشت حافظه و کاهش خطر اشاره‌گرهای معلق کمک کنند که می‌تواند باعث خرابی یک برنامه شود. آن‌ها همچنین نوشتن کد ایمن در برابر استثنائات را آسان‌تر می‌کنند، زیرا حافظه به طور خودکار هنگام پرتاب یک استثنا آزاد می‌شود. اشاره‌گرهای هوشمند همچنین می‌توانند برای ساده‌سازی مدیریت منابع مشترک مانند فایل‌ها و پایگاه‌های داده استفاده شوند.


مروری
یک اشاره‌گر متغیری است که آدرس متغیر دیگری را در خود نگه می‌دارد. برای استفاده از یک اشاره‌گر، باید حافظه را برای آن متغیر اختصاص دهید. مشکل آن‌ها این است که اگر فراموش کنید حافظه نگه‌داشته‌شده توسط اشاره‌گر را آزاد کنید، حافظه برای کل مدت اجرای برنامه اشغال خواهد شد. به این حالت، نشت حافظه گفته می‌شود.
بنابراین، اشاره‌گرهای هوشمند در ++C راهی برای رهایی از این مشکل به شما می‌دهند. هنگام استفاده از یک اشاره‌گر هوشمند، آن اشاره‌گر هوشمند حافظه را زمانی که متغیر از محدوده خارج می‌شود، آزاد می‌کند.

مشکلات اشاره‌گرهای معمولی
اشاره‌گرها بخش ضروری برنامه‌نویسی هستند. آن‌ها به کار با یک متغیر واحد در چندین تابع کمک می‌کنند. اما همه این ویژگی‌ها به بهایی همراه هستند که باید بپردازید. هنگام کار با اشاره‌گرها در یک برنامه، باید توجه ویژه‌ای داشته باشید. باید متغیر اشاره‌گر را ردیابی کنید و حافظه نگه‌داشته‌شده توسط آن را پس از انجام تمام عملیات خود با دقت آزاد کنید. اگر این کار را انجام ندهید، برنامه هر بار کمی حافظه را به سرقت می‌برد و آن را برای کل مدت اجرای برنامه نگه می‌دارد و در نتیجه باعث نشت حافظه می‌شود، زیرا اشاره‌گر را گم کرده‌اید و اکنون نمی‌دانید بلوک حافظه کجا قرار دارد.
و اگر این اتفاق بارها و بارها بیفتد، خیلی سریع حافظه شما تمام می‌شود و با خطای استثنای حافظه مواجه می‌شوید و نمی‌دانید چرا این اتفاق می‌افتد.
این یک مشکل جدی است. مشکلی که نیاز به بررسی جدی دارد، درست است؟ همکاران برنامه‌نویس ما که می‌خواستند همه ما را از دردسر آزاد کردن حافظه نگه‌داشته‌شده توسط یک متغیر اشاره‌گر رها کنند، ایده جدیدی ارائه دادند. و ایده آن‌ها کارساز بود.

معرفی اشاره‌گرهای هوشمند
همکاران برنامه‌نویس ما با الهام از ایده کلاس‌ها، نوع خاصی از نوع داده تعریف‌شده توسط کاربر (بعد از همه، کلاس‌ها هم نوع داده تعریف‌شده توسط کاربر هستند، درست است؟) ایجاد کردند. ایده‌ای که از آن اشاره‌گرهای هوشمند را توسعه دادند این است که یک شیء کلاس زمانی که کنترل برنامه از محدوده تعریف شیء خارج می‌شود، خود را نابود می‌کند. بنابراین می‌توانید حافظه اشاره‌گر را در مخرب آزاد کنید. این کار به طور خودکار حافظه نگه‌داشته‌شده توسط اشاره‌گر را آزاد می‌کند. این اشاره‌گرهای هوشمند شگفت‌انگیز در داخل فایل هدر تعریف شده‌اند.
بنابراین، ابتدا باید آن هدر را به برنامه خود وارد کنید تا از اشاره‌گرهای هوشمند استفاده کنید. و سپس تمام کاری که باید انجام دهید این است که شیء اشاره‌گر در محدوده مناسب تعریف شود تا بتوانید تمام عملیات مورد نظر خود را در آن انجام دهید. و این کار در مقایسه با کار آسانی است.

نحوه استفاده از اشاره‌گرهای هوشمند
شاید اکنون بپرسید: "هی، این عالی به نظر می‌رسد، چگونه می‌توانم از آن استفاده کنم؟"، "آیا برای هر یک از اشاره‌گرهایی که در برنامه خود استفاده خواهم کرد، باید یک کلاس جداگانه ایجاد کنم؟ این کار بسیار زیاد است!"
پاسخ این است. در بیشتر موارد، شما فقط یک اشاره‌گر خام استاندارد را همانطور که معمولاً انجام می‌دهید ایجاد می‌کنید. اما سپس آن اشاره‌گر استاندارد را که ایجاد کرده‌اید بلافاصله به اشاره‌گر هوشمند منتقل می‌کنید.
نحو کلی برای فرآیند ذکر شده در بالا ممکن است به این صورت باشد:

اینجا:

`new data_type()` روشی است که معمولاً یک اشاره‌گر معمولی ایجاد می‌کنیم و بلافاصله آن را به سازنده اشاره‌گر هوشمند منتقل می‌کنیم که در آن
`smart_pointer_type` نوع اشاره‌گر هوشمندی است که می‌خواهید از آن استفاده کنید، مانند `unique_ptr`، `shared_ptr` یا `weak_ptr`.
و `data_type` نوع داده متغیر اشاره‌گر است
`pointer_name` نام متغیر اشاره‌گر است.

اکنون ممکن است بپرسید اما "چگونه به داده‌هایی که اشاره‌گر به آن اشاره می‌کند دسترسی پیدا کنم؟"
شما می‌توانید به داده‌های نگه‌داشته‌شده توسط اشاره‌گر هوشمند همانطور که با اشاره‌گرهای استاندارد انجام می‌دهید دسترسی پیدا کنید. می‌توانید از عملگرهای "*" و "->" همانطور که معمولاً روی یک اشاره‌گر استاندارد انجام می‌دهید استفاده کنید و به داده‌های کپسوله شده در اشاره‌گر هوشمند دسترسی پیدا کنید. این کار با کمک ویژگی بارگذاری عملگر زبان برنامه‌نویسی ++C انجام می‌شود.

انواع اشاره‌گرهای هوشمند
این یک ایده فوق‌العاده است، اما موارد استفاده زیادی برای این ایده وجود دارد. توسعه‌دهندگان زبان برنامه‌نویسی ++C اشاره‌گرهای هوشمند مختلف زیادی را توسعه دادند که هر کدام کمی با قبلی متفاوت هستند. بیایید در مورد رایج‌ترین آن‌ها صحبت کنیم و ببینیم چگونه و کجا می‌توانید از آن‌ها استفاده کنید.

`Unique_ptr`
`unique_ptr` یکی از رایج‌ترین اشاره‌گرهای هوشمند است. اگر مطمئن نیستید کدام اشاره‌گر هوشمند را استفاده کنید، این اشاره‌گری است که باید با آن پیش بروید.
`unique_ptr` همانطور که از نامش پیداست، یک اشاره‌گر منحصر به فرد را در خود نگه می‌دارد، یعنی حافظه نگه‌داشته‌شده توسط این اشاره‌گر نمی‌تواند توسط هیچ اشاره‌گر دیگری نشان داده شود. این تنها اشاره‌گری خواهد بود که آن حافظه را در خود نگه می‌دارد. به شما اجازه داده نمی‌شود یک کپی دیگر از اشاره‌گر ایجاد کنید. در حالی که حافظه نگه‌داشته‌شده توسط اشاره‌گر نمی‌تواند توسط هیچ اشاره‌گر دیگری کپی یا به اشتراک گذاشته شود، همیشه می‌توانید آن را به یک اشاره‌گر جدید منتقل کنید. این کار را می‌توان با استفاده از تابع `move()` کتابخانه قالب استاندارد ++C انجام داد.

نحو:
نحو داده شده در بالا نحوه ایجاد یک اشاره‌گر منحصر به فرد `p1` برای یک کلاس به نام `FOO` را توضیح می‌دهد. در اینجا `FOO` را با نوع داده‌ای که حافظه در خود نگه می‌دارد و `p1` را با نام اشاره‌گری که می‌خواهید جایگزین کنید.
مثال:
توضیح:
در این مثال داده شده در بالا، یک متغیر اشاره‌گر جدید به نام `ptr` برای یک مقدار صحیح 13 در داخل تابعی به نام `my_func()` ایجاد می‌کنیم. سپس برخی عملیات را انجام می‌دهیم و سپس اشاره‌گر منحصر به فرد را به یک متغیر جدید به نام `ptr2` منتقل می‌کنیم. و سپس یک شرط به نام `$x == 45$` را بررسی می‌کنیم و وقتی مقدار آن درست باشد، فقط از تابع خارج می‌شویم. ما نگران آزاد کردن حافظه‌ای که ایجاد کرده‌ایم نیستیم، زیرا این کار به طور خودکار توسط اشاره‌گر هوشمند انجام می‌شود.

`Shared_ptr`
`unique_ptr` همیشه برای همه موارد استفاده شما کافی نخواهد بود. ممکن است در برخی مواقع نیاز داشته باشید یک کپی از اشاره‌گر را برای انتقال آن به تابع دیگری ایجاد کنید. بنابراین برای کمک به شما در این شرایط، `shared_ptr` توسعه داده شد.
`shared_ptr` به شما امکان می‌دهد یک کپی از اشاره‌گر ایجاد کنید. تا زمانی که همه اشاره‌گرهایی که آن حافظه را در خود نگه می‌دارند از محدوده خارج شوند، حافظه را در خود نگه می‌دارد. این کار با حفظ یک شمارنده مرجع انجام می‌شود.
شمارنده مرجع تعداد اشاره‌گرهایی را که به آن مکان حافظه اشاره می‌کنند، در خود نگه می‌دارد. مخرب مقدار شمارنده مرجع را بررسی می‌کند و حافظه را فقط در صورتی آزاد می‌کند که مقدار شمارنده مرجع 1 باشد، یعنی فقط اشاره‌گر فعلی به آن حافظه اشاره می‌کند. همچنین می‌توانید مالکیت حافظه‌ای را که اشاره‌گر در خود نگه می‌دارد با استفاده از متد `reset` لغو کنید. در این صورت، مقدار شمارنده مرجع 1 واحد کاهش می‌یابد که نشان می‌دهد یک مالک کمتر برای آن مکان حافظه وجود دارد. در هر زمان می‌توانید از تابع `use_count()` برای اطلاع از تعداد اشاره‌گرهایی که به یک مکان اشاره می‌کنند استفاده کنید.

نحو:
نحو داده شده در بالا نحوه ایجاد یک اشاره‌گر مشترک `p1` برای یک کلاس به نام `FOO` را توضیح می‌دهد. در اینجا `FOO` را با نوع داده‌ای که حافظه در خود نگه می‌دارد و `p1` را با نام اشاره‌گری که می‌خواهید جایگزین کنید.
مثال:
توضیح:
در این مثال داده شده در بالا، 2 اشاره‌گر مشترک به نام‌های `p1` و `p2` برای یک کلاس به نام `Articles` ایجاد می‌کنیم. و با آن‌ها کار می‌کنیم. حافظه فقط زمانی آزاد می‌شود که هر دو متغیر `p1` و `p2` از محدوده خارج شوند.

`Weak_ptr`
`weak_ptr` بسیار شبیه به `shared_ptr` است. تنها تفاوت این است که اگر یک `weak_ptr` به یک `shared_ptr` ایجاد کنید، مقدار شمارنده مرجع افزایش نمی‌یابد.
بنابراین، اشاره‌گر هوشمند حافظه را صرف نظر از اینکه `weak_ptr` هنوز در محدوده است یا خیر، آزاد می‌کند. برنامه‌نویس می‌تواند از این مورد استفاده کند اگر می‌خواهید بررسی کنید که آیا `shared_ptr` هنوز حافظه را در خود نگه می‌دارد یا خیر.

نحو:
نحو داده شده در بالا نحوه ایجاد یک اشاره‌گر ضعیف `p1` برای یک کلاس به نام `FOO` را توضیح می‌دهد. در اینجا `FOO` را با نوع داده‌ای که حافظه در خود نگه می‌دارد و `p1` را با نام اشاره‌گری که می‌خواهید جایگزین کنید.
مثال:
برای این کار، می‌توانیم از همان مثالی که برای درک `Shared_ptr` استفاده کردیم استفاده کنیم. زیرا هر دو بسیار شبیه به هم هستند.
توضیح:
در این برنامه، یک متغیر اشاره‌گر مشترک به نام `p1` برای کلاس `Articles` ایجاد می‌کنیم. سپس برخی عملیات را با اشاره‌گر `p1` انجام می‌دهیم. سپس یک اشاره‌گر ضعیف جدید به نام `p2` ایجاد می‌کنیم و `p1` را به آن اختصاص می‌دهیم. می‌توانیم با `p2` همانطور که با `p1` کار کردیم کار کنیم. اما تنها تفاوت این است که وقتی `p1` از محدوده خارج می‌شود، حافظه آزاد می‌شود و پس از آن دیگر نمی‌توانیم با اشاره‌گر `p2` به حافظه دسترسی پیدا کنیم.

`Auto_ptr`
`auto_ptr` اولین پیاده‌سازی از اشاره‌گرهای هوشمند است. این شبیه به `unique_ptr` بود. با این حال، هنگامی که استاندارد جدید در ++C 11 تعریف شد، `auto_ptr` حذف شد و با سه اشاره‌گر ذکر شده در بالا جایگزین شد.
استفاده از `auto_ptr` در برنامه خود توصیه نمی‌شود زیرا دارای نقص‌های طراحی است. بنابراین لطفاً از اشاره‌گرهای دیگر ذکر شده در بالا استفاده کنید.

مقایسه اعلان اشاره‌گر خام با اعلان اشاره‌گر هوشمند (برنامه نمونه)
مثال ذکر شده در بالا نحوه تفاوت مقداردهی اولیه اشاره‌گر هوشمند با یک اشاره‌گر معمولی را توضیح می‌دهد. همانطور که می‌بینید، هنگام استفاده از اشاره‌گر خام معمولی، باید با دقت اشاره‌گر را ردیابی کنید و حافظه نگه‌داشته‌شده توسط آن را با استفاده از کلمه کلیدی `delete` آزاد کنید.
اگر این کار را انجام ندهید، باعث نشت حافظه می‌شود. اما با اشاره‌گرهای هوشمند، نگران آن نخواهید بود. حافظه به طور خودکار زمانی که متغیر اشاره‌گر از محدوده خارج می‌شود، آزاد می‌شود.

دستورالعمل‌هایی که باید هنگام کار با اشاره‌گرهای هوشمند در ++C دنبال کنید

همیشه سعی کنید از اشاره‌گرهای هوشمند در ++C استفاده کنید زیرا بهتر است مطمئن شوید که به دلیل نشت حافظه، حافظه شما تمام نمی‌شود.
اگر مطمئن نیستید کدام اشاره‌گر هوشمند را استفاده کنید، از `Unique_ptr` استفاده کنید.
فقط در صورت برخورد با چندین اشاره‌گر یا رشته که در آن نیاز به به اشتراک گذاشتن مکان دارید، از `Shared_ptr` استفاده کنید.
اگر فقط می‌خواهید یک شیء را بررسی کنید و قصد ندارید با آن به طور جدی کار کنید، می‌توانید از `Weak_ptr` استفاده کنید.
سعی کنید استفاده از اشاره‌گرهای خام را تا حد امکان کاهش دهید و وقتی این کار را انجام می‌دهید، مطمئن شوید که حافظه نگه‌داشته‌شده توسط اشاره‌گر را به درستی آزاد می‌کنید.

نتیجه‌گیری

اشاره‌گرهای هوشمند در برنامه‌نویسی ++C ایده‌ای برای جبران عدم وجود جمع‌آوری‌کننده‌های زباله است.
با اشاره‌گرهای هوشمند در ++C، می‌توانید فراموش کردن آزاد کردن حافظه پس از اجرای یک برنامه و در نتیجه نشت حافظه را فراموش کنید.
سه نوع رایج از اشاره‌گرهای هوشمند در ++C وجود دارد: `Unique_ptr`، `Shared_ptr` و `Weak_ptr`.
هنگام مطمئن نبودن از کدام اشاره‌گر هوشمند را استفاده کنید، از `Unique_ptr` استفاده کنید.
فقط در صورت نیاز به به اشتراک گذاشتن اشاره‌گر به توابع یا رشته‌های دیگر، از `Shared_ptr` استفاده کنید.
اگر نمی‌خواهید حافظه توسط این اشاره‌گر نگه‌داشته شود، از `Weak_ptr` استفاده کنید.
هرگز از `Auto_ptr` استفاده نکنید. همیشه بهتر است از اشاره‌گرهای هوشمند به‌روز و پرکاربرد استفاده کنید.
سعی کنید استفاده از اشاره‌گرهای خام معمولی را تا حد امکان در برنامه‌های خود کاهش دهید.


هدف این مقاله ارائه نمای کلی از مفاهیم اساسی اشاره‌گرهای هوشمند در ++C است، با هدف ارائه یک نقطه شروع مفید برای خواننده. مهم است که روشن شود این مقاله ادعای ارائه یک پیاده‌سازی دقیق از نحوه نوشتن یا استفاده از اشاره‌گرهای هوشمند در کتابخانه‌های ++C را ندارد.

یکی از ویژگی‌های خاص زبان ++C، مدیریت حافظه پویا است. بر خلاف جاوا یا سی شارپ، ++C یک جمع‌کننده زباله داخلی ندارد. از بارنه استراستروپ، سازنده ++C، پرسیده شد: "چرا ++C جمع‌آوری زباله ندارد؟". پاسخ او این بود: "من زباله را دوست ندارم. من ریختن آشغال را دوست ندارم. ایده‌آل من این است که با تولید نکردن زباله، نیاز به جمع‌کننده زباله را از بین ببرم". این درست است به این معنا که ++C خود هیچ زباله‌ای ایجاد نمی‌کند، بلکه توسعه‌دهنده است که زباله ایجاد می‌کند. بنابراین، مسئولیت مدیریت (آزاد کردن) حافظه تخصیص داده شده پویا بر عهده آنهاست. اشاره‌گرها راهی برای دسترسی به حافظه هیپ هستند. اما مشکل با اشاره‌گرها این است که مستعد ایجاد نشت حافظه در یک برنامه هستند. مثال زیر را در نظر بگیرید:
```cpp
class Box
{
private:
    int length, width, height;
};

Box * func()
{
    Box * b = new Box();
    return b;
}
```
در اینجا یک شیء از کلاس Box به صورت پویا در هیپ درون تابع func() تخصیص داده می‌شود و حافظه حتی پس از خروج تابع نیز زنده می‌ماند. اکنون، مسئولیت آزاد کردن حافظه پس از استفاده بر عهده فراخواننده این تابع است. اگر توسعه‌دهنده فراموش کند این حافظه پویا را حذف کند، به آن نشت حافظه می‌گویند و منبع نشت شده تا پایان برنامه در دسترس نیست.

نشت حافظه حتی در صورتی که توسعه‌دهنده فراموش نکند کدی برای آزاد کردن حافظه تخصیص داده شده پویا بنویسد، نیز می‌تواند رخ دهد. مثال زیر را در نظر بگیرید:
```cpp
void someFunc(unsigned int size)
{
    Box * boxArr = new Box[size]; // تخصیص یک آرایه از Boxها
    /*
    // برخی پردازش‌ها
    */
    delete[] boxArr;
}
```
تابع someFunc() بی‌خطر به نظر می‌رسد - حافظه به صورت پویا در ابتدا تخصیص داده می‌شود و در انتها حذف می‌شود و هیچ امکانی برای نشت حافظه وجود ندارد، درست است؟ اینجاست که باید مراقب باشید. اگر در بخش میانی برنامه استثنایی رخ دهد و کنترل اجرا به انتهای تابع نرسد و حذف انجام نشود چه می‌شود؟ ما هنوز یک نشت حافظه داریم و این نشت حافظه تشخیص و رفع آن بسیار دشوار خواهد بود.

اشاره‌گر هوشمند یک الگوی استفاده از اشاره‌گر معمولی است که به گونه‌ای کپسوله شده است که نیازی به حذف صریح شیء مورد اشاره نداشته باشیم. اشاره‌گرهای هوشمند از الگوی RAII یا Resource Acquisition Is Initialization پیروی می‌کنند، که در آن مالکیت یک شیء تخصیص داده شده در هیپ با یک شیء تخصیص داده شده در پشته است، به طوری که هنگام فراخوانی مخرب آن، می‌توان آزاد کردن حافظه پویا را انجام داد. بله، ++C تضمین می‌کند که مخرب یک شیء تخصیص داده شده به صورت استاتیک همیشه فراخوانی می‌شود، صرف نظر از یک استثنا. اشاره‌گرهای هوشمند در فضای نام std در فایل هدر تعریف شده‌اند. محبوب‌ترین آنها [unique_ptr](https://en.cppreference.com/w/cpp/memory/unique_ptr) و [shared_ptr](https://en.cppreference.com/w/cpp/memory/shared_ptr) هستند. unique_ptr فقط به یک مالک از اشاره‌گر زیرین اجازه می‌دهد، در حالی که shared_ptr یک اشاره‌گر هوشمند با شمارنده مرجع است.

تابع بالا someFunc() می‌تواند با استفاده از یک اشاره‌گر هوشمند به صورت زیر بازنویسی شود:
```cpp
void someFunc(unsigned int size)
{
    unique_ptr box(new Box); // تخصیص یک شیء Box
    unique_ptr
    // برخی پردازش‌ها
    */
}
```
در این پیاده‌سازی، توسعه‌دهنده نیازی به حذف صریح حافظه تخصیص داده شده در انتهای تابع ندارد. همانطور که می‌بینیم، box و boxArr اشیاء تخصیص داده شده به صورت استاتیک از کلاس unique_ptr هستند و مالک حافظه تخصیص داده شده پویا زیرین هستند. توجه داشته باشید که شیء new Box و آرایه new Box[size] در هیپ تخصیص داده می‌شوند و توسط اشیاء کلاس unique_ptr - box و boxArr به ترتیب در پشته متعلق به آنها هستند. با خروج تابع، مخرب کلاس unique_ptr فراخوانی می‌شود که مراقبت از حذف حافظه زیرین را به عهده دارد. حتی اگر در میانه برنامه استثنایی رخ دهد، مخرب کلاس unique_ptr فراخوانی می‌شود زیرا اجرا از تابع خارج می‌شود.

در این پست، نحوه نوشتن کلاس unique_ptr خود را خواهیم دید. من قصد دارم آن را my_unique_ptr بنامم. بنابراین برای شروع، به بدنه کلاس خود نیاز داریم و قصد داریم یک کلاس الگو بسازیم تا آن را مستقل از نوع نگه داریم.
```cpp
template <typename T>
class my_unique_ptr
{
private:
    T * ptr = nullptr;

public:
    my_unique_ptr() : ptr(nullptr) // سازنده پیش‌فرض
    {
    }

    my_unique_ptr(T * ptr) : ptr(ptr) // سازنده
    {
    }
};
```
در مرحله بعد، نمی‌خواهیم اجازه کپی کردن یک شیء به شیء دیگر را بدهیم، زیرا این بدان معناست که آدرس حافظه زیرین کپی می‌شود که باعث می‌شود مالکیت آن حافظه با بیش از یک شیء my_unique_ptr باقی بماند. می‌توان این کار را با افزودن کد زیر به کلاس خود انجام داد.
```cpp
/* حذف معنای کپی */
my_unique_ptr(const my_unique_ptr & obj) = delete;
// سازنده کپی حذف شد
my_unique_ptr& operator=(const my_unique_ptr & obj) = delete;
// تخصیص کپی حذف شد
```
راستی، این راهی برای غیرفعال کردن یک عملکرد خاص در هر یک از کلاس‌های خود با نوشتن = delete است. بنابراین، اکنون کلاس ما اجازه کپی کردن یک شیء به شیء دیگر را نمی‌دهد. اگر کاربر کلاس سعی کند سازنده کپی یا تخصیص کپی را فراخوانی کند، خطایی مانند این دریافت خواهد کرد:

اما ما هنوز باید بتوانیم مالکیت حافظه زیرین را از یک شیء my_unique_ptr به شیء دیگر منتقل کنیم. من به معنای انتقال اشاره کرده‌ام و به طور خلاصه در مورد آن در یک پست دیگر در مورد نحوه نوشتن کلاس رشته STL خود بحث کرده‌ام. بنابراین، می‌توانیم سازنده انتقال و تخصیص انتقال را در کلاس خود به صورت زیر داشته باشیم:
```cpp
my_unique_ptr(my_unique_ptr && dyingObj) // سازنده انتقال
{
    // انتقال مالکیت حافظه اشاره شده توسط dyingObj
    this->ptr = dyingObj.ptr;
    dyingObj.ptr = nullptr;
}

void operator=(my_unique_ptr && dyingObj) // تخصیص انتقال
{
    // پاک کردن هرگونه داده موجود
    // انتقال مالکیت حافظه اشاره شده
    this->ptr = dyingObj.ptr;
    dyingObj.ptr = nullptr;
}
```
ما همچنین به عملگرهای بارگذاری شده برای دسترسی به شیء از طریق آن‌ها در کلاس خود نیاز داریم. این را می‌توان به صورت زیر اضافه کرد:
```cpp
T* operator->() // دریافت اشاره‌گر با استفاده از عملگر فلش
{
    return this->ptr;
}

T& operator*() // باز کردن اشاره‌گر زیرین
{
    return *(this->ptr);
}
```
خب، my_unique_ptr کامل و آماده استفاده است. در زیر پیاده‌سازی کامل کلاس my_unique_ptr آمده است. یک نسخه الگو با [] یعنی <T[]> نیز اضافه شده است تا از ایجاد آرایه‌ها پشتیبانی کند. این نسخه از کلاس همچنین با یک تابع برای بارگذاری عملگر [] برای دسترسی مبتنی بر فهرست اضافه شده است.

در اینجا مثالی از نحوه استفاده از این کلاس آمده است:
```cpp
int main(){
    // ایجاد یک شیء my_unique_ptr که یک شیء 'Box' را در خود نگه می‌دارد
    my_unique_ptr box1(new Box);

    // ایجاد یک شیء my_unique_ptr که یک آرایه از اشیاء 'Box' را در خود نگه می‌دارد
    my_unique_ptr

    Box b1 = boxArr[0]; // دسترسی مبتنی بر فهرست

    return 0;
}
```
هر new باید یک delete متناظر داشته باشد، اما در اینجا از آنجایی که شیء Box (ها) در یک شیء اشاره‌گر هوشمند کپسوله شده است، نیازی به فراخوانی delete نداریم زیرا مخرب my_unique_ptr هنگام تکمیل محدوده آن فراخوانی می‌شود و مخرب مراقبت از آزاد کردن حافظه تخصیص داده شده پویا را به عهده دارد. حتی اگر در میانه برنامه استثنایی رخ دهد، مخرب کلاس my_unique_ptr فراخوانی می‌شود زیرا اجرا از تابع خارج می‌شود.

توجه داشته باشید که نباید از **new** یا **malloc** روی خود اشاره‌گر هوشمند استفاده کنید. همچنین نیازی به حذف حافظه زیرین نیست. اجازه دهید اشاره‌گر هوشمند آن را حذف کند.

در پست بعدی، نحوه نوشتن کلاس shared_ptr خود را خواهیم دید.

P/S: این ممکن است یک پیاده‌سازی کامل از کلاس unqiue_ptr نباشد. این فقط برای آموزش خوانندگان در مورد اشاره‌گرهای هوشمند و استفاده از دانش برای نوشتن کلاس اشاره‌گر هوشمند خود در نظر گرفته شده است. خواننده می‌تواند توابع دیگری را در صورت لزوم اضافه کند.


مقدمه
اشاره‌گرهای هوشمند چه هستند؟ پاسخ به این سوال نسبتاً ساده است؛ اشاره‌گر هوشمند، اشاره‌گری است که باهوش است. این به چه معناست؟ در واقع، اشاره‌گرهای هوشمند اشیائی هستند که مانند اشاره‌گرها رفتار می‌کنند اما فراتر از یک اشاره‌گر عمل می‌کنند. این اشیاء به اندازه اشاره‌گرها انعطاف‌پذیر هستند و مزیت داشتن یک شیء را دارند (مانند سازنده‌ها و مخرب‌ها که به طور خودکار فراخوانی می‌شوند). اشاره‌گر هوشمند برای حل مشکلاتی که استفاده از اشاره‌گرهای معمولی ایجاد می‌کند طراحی شده است (به همین دلیل هوشمند نامیده می‌شوند).

مشکلات اشاره‌گرها
چه مشکلات رایجی در برنامه‌های ++C هنگام استفاده از اشاره‌گرها با آن مواجه می‌شویم؟ پاسخ، مدیریت حافظه است. به کد زیر نگاه کنید:
char* pName  = new char[1024];
…
SetName(pName);
…
…
if(null != pName)
{
       delete[] pName;
}
چند بار با باگی مواجه شده‌ایم که به دلیل فراموش کردن حذف pName ایجاد شده است. عالی می‌شد اگر کسی بتواند آزادسازی حافظه را زمانی که اشاره‌گر دیگر مفید نیست بر عهده بگیرد (در اینجا در مورد جمع‌آوری زباله صحبت نمی‌کنیم). اگر خود اشاره‌گر از آن مراقبت کند چه؟ بله، دقیقاً همان کاری است که اشاره‌گرهای هوشمند برای آن طراحی شده‌اند. بیایید یک اشاره‌گر هوشمند بنویسیم و ببینیم چگونه می‌توانیم یک اشاره‌گر را بهتر مدیریت کنیم.

با یک مثال واقعی شروع می‌کنیم. فرض کنید کلاسی به نام Person داریم که به صورت زیر تعریف شده است.
class Person
{
    int age;
    char* pName;
public:
    Person(): pName(0),age(0)
    {
    }
    Person(char\* pName, int age): pName(pName), age(age)
    {
    }
    ~Person()
    {
    }

    void Display()
    {
        printf("Name = %s Age = %d \\n", pName, age);
    }
    void Shout()
    {
        printf("Ooooooooooooooooo",);
    }

};
اکنون کد کلاینت را برای استفاده از Person می‌نویسیم.
void main()
{
    Person* pPerson  = new Person("Scott", 25);
    pPerson->Display();
    delete pPerson;
}
اکنون به این کد نگاه کنید، هر بار که یک اشاره‌گر ایجاد می‌کنم، باید مراقب حذف آن باشم. این دقیقاً همان چیزی است که می‌خواهم از آن اجتناب کنم. به یک مکانیسم خودکار نیاز دارم که اشاره‌گر را حذف کند. چیزی که به ذهنم می‌رسد، مخرب است. اما اشاره‌گرها مخرب ندارند، پس چه؟ اشاره‌گر هوشمند ما می‌تواند یک مخرب داشته باشد. بنابراین یک کلاس به نام SP ایجاد خواهیم کرد که می‌تواند یک اشاره‌گر به کلاس Person را نگه دارد و هنگام فراخوانی مخرب آن، اشاره‌گر را حذف کند. بنابراین کد کلاینت من به چیزی شبیه به این تغییر خواهد کرد:
void main()
{
    SP p(new Person("Scott", 25));
    p->Display();
    }
به نکات زیر توجه کنید:

ما یک شیء از کلاس SP ایجاد کرده‌ایم که اشاره‌گر کلاس Person ما را نگه می‌دارد. از آنجایی که مخرب کلاس SP هنگام خارج شدن این شیء از محدوده فراخوانی می‌شود، اشاره‌گر کلاس Person را حذف می‌کند (به عنوان مسئولیت اصلی خود). بنابراین دردسر حذف اشاره‌گر را نداریم.
نکته مهم دیگر این است که باید بتوانیم متد Display را با استفاده از شیء کلاس SP به همان روشی که با استفاده از اشاره‌گر کلاس Person فراخوانی می‌کردیم، فراخوانی کنیم، یعنی کلاس باید دقیقاً مانند یک اشاره‌گر رفتار کند.

رابط برای یک اشاره‌گر هوشمند
از آنجایی که اشاره‌گر هوشمند باید مانند یک اشاره‌گر رفتار کند، باید از همان رابط اشاره‌گرها پشتیبانی کند. یعنی باید از عملیات زیر پشتیبانی کنند.

ارجاع‌زدایی (عملگر *)
غیرمستقیم‌سازی (عملگر ->)

بیایید اکنون کلاس SP را بنویسیم.
class SP
{
private:
    Person*    pData; public:
    SP(Person* pValue) : pData(pValue)
    {
    }
    ~SP()
    {
                delete pData;
    }
Person& operator\* ()
{
    return \*pData;
}

Person\* operator\-\> ()
{
    return pData;
}

};
این کلاس، کلاس اشاره‌گر هوشمند ما است. مسئولیت اصلی این کلاس، نگه داشتن یک اشاره‌گر به کلاس Person و سپس حذف آن هنگام فراخوانی مخرب آن است. همچنین باید از رابط اشاره‌گر پشتیبانی کند.

کلاس اشاره‌گر هوشمند عمومی
یک مشکل که در اینجا مشاهده می‌کنیم این است که می‌توانیم از این کلاس اشاره‌گر هوشمند فقط برای یک اشاره‌گر از کلاس Person استفاده کنیم. این بدان معناست که ما باید یک کلاس اشاره‌گر هوشمند برای هر نوع ایجاد کنیم و این کار آسانی نیست. می‌توانیم این مشکل را با استفاده از الگوها و عمومی کردن این کلاس اشاره‌گر هوشمند حل کنیم. بنابراین بیایید کد را به این صورت تغییر دهیم:
template < typename T > class SP
{
    private:
    T*    pData;     public:
    SP(T* pValue) : pData(pValue)
    {
    }
    ~SP()
    {
        delete pData;
    }
T& operator\* ()
{
    return \*pData;
}

T\* operator\-\> ()
{
    return pData;
}

};
void main()
{
    SPDisplay();
    }
اکنون می‌توانیم از کلاس اشاره‌گر هوشمند خود برای هر نوع اشاره‌گری استفاده کنیم. آیا اشاره‌گر هوشمند ما واقعاً هوشمند است؟ به قطعه کد زیر نگاه کنید.
void main()
{
    SPDisplay();
    {
        SPDisplay();
            }
    p->Display();
}
به این اتفاق توجه کنید. p و q به یک اشاره‌گر کلاس Person اشاره می‌کنند. اکنون وقتی q از محدوده خارج می‌شود، مخرب q فراخوانی می‌شود که اشاره‌گر کلاس Person را حذف می‌کند. اکنون نمی‌توانیم p->Display(); را فراخوانی کنیم زیرا p با یک اشاره‌گر معلق باقی می‌ماند و این فراخوانی با شکست مواجه می‌شود. (توجه داشته باشید که این مشکل حتی اگر از اشاره‌گرهای معمولی به جای اشاره‌گرهای هوشمند استفاده می‌کردیم نیز وجود داشت.) ما نباید اشاره‌گر کلاس Person را حذف کنیم مگر اینکه کسی از آن استفاده نکند. چگونه این کار را انجام دهیم؟ پیاده‌سازی یک مکانیسم شمارش ارجاع در کلاس اشاره‌گر هوشمند ما این مشکل را حل می‌کند.

شمارش ارجاع
کاری که انجام خواهیم داد این است که یک کلاس شمارش ارجاع RC خواهیم داشت. این کلاس یک مقدار صحیح را حفظ می‌کند که تعداد ارجاعات را نشان می‌دهد. ما روش‌هایی برای افزایش و کاهش تعداد ارجاعات خواهیم داشت.
class RC
{
    private:
    int count;
    public:
    void AddRef()
    {
                count++;
    }
int Release()
{
                    return --count;
}

};
اکنون که یک کلاس شمارش ارجاع داریم، آن را به کلاس اشاره‌گر هوشمند خود معرفی خواهیم کرد. ما یک اشاره‌گر به کلاس RC را در کلاس SP خود حفظ خواهیم کرد و این اشاره‌گر برای همه نمونه‌های اشاره‌گر هوشمند که به یک اشاره‌گر یکسان اشاره می‌کنند، به اشتراک گذاشته می‌شود. برای این اتفاق افتادن، به یک عملگر انتساب و سازنده کپی در کلاس SP خود نیاز داریم.
template < typename T > class SP
{
private:
    T*    pData;           RC* reference;
public:
    SP() : pData(0), reference(0)
    {
                reference = new RC();
                reference->AddRef();
    }
SP(T\* pValue) : pData(pValue), reference(0)
{
            reference = new RC();
            reference-\>AddRef();
}

SP(const SP<T\>& sp) : pData(sp.pData), reference(sp.reference)
{
                            reference-\>AddRef();
}

~SP()
{
                            if(reference-\>Release() == 0)
    {
        delete pData;
        delete reference;
    }
}

T& operator\* ()
{
    return \*pData;
}

T\* operator\-\> ()
{
    return pData;
}

SP<T\>& operator = (const SP<T\>& sp)
{
            if (this != &sp)         {
                                if(reference-\>Release() == 0)
        {
            delete pData;
            delete reference;
        }

                                pData = sp.pData;
        reference = sp.reference;
        reference-\>AddRef();
    }
    return \*this;
}

};
بیایید به کد کلاینت نگاه کنیم.
void main()
{
    SPDisplay();
    {
        SPDisplay();
    SP<PERSON\> r;
    r = p;
    r-\>Display();
        }
p-\>Display();
    }

وقتی یک اشاره‌گر هوشمند p از نوع Person ایجاد می‌کنیم، سازنده SP فراخوانی می‌شود، داده‌ها ذخیره می‌شوند و یک اشاره‌گر RC جدید ایجاد می‌شود. متد AddRef از RC فراخوانی می‌شود تا تعداد ارجاعات به 1 افزایش یابد. اکنون SP<person> q = p;</person> یک اشاره‌گر هوشمند جدید q با استفاده از سازنده کپی ایجاد می‌کند. در اینجا داده‌ها کپی می‌شوند و ارجاع دوباره به 2 افزایش می‌یابد. اکنون r = p; عملگر انتساب را فراخوانی می‌کند تا مقدار p را به q اختصاص دهد. در اینجا نیز داده‌ها کپی می‌شوند و تعداد ارجاعات افزایش می‌یابد و در نتیجه تعداد به 3 می‌رسد. وقتی r و q از محدوده خارج می‌شوند، مخرب اشیاء مربوطه فراخوانی می‌شود. در اینجا تعداد ارجاعات کاهش می‌یابد، اما داده‌ها حذف نمی‌شوند مگر اینکه تعداد ارجاعات به صفر برسد. این فقط زمانی اتفاق می‌افتد که مخرب p فراخوانی شود. بنابراین داده‌های ما فقط زمانی حذف می‌شوند که کسی به آن ارجاع ندهد.

کاربردها
نشت حافظه: استفاده از اشاره‌گرهای هوشمند کار مدیریت اشاره‌گرها را برای نشت حافظه کاهش می‌دهد. اکنون می‌توانید یک اشاره‌گر ایجاد کنید و در مورد حذف آن فراموش کنید، اشاره‌گر هوشمند این کار را برای شما انجام می‌دهد. این ساده‌ترین جمع‌آوری‌کننده زباله است که می‌توانیم به آن فکر کنیم.
استثناها: اشاره‌گرهای هوشمند در جایی که از استثناها استفاده می‌شود بسیار مفید هستند. به عنوان مثال، به کد زیر نگاه کنید:
void MakeNoise()
{
    Person* p = new Person("Scott", 25);
    p->Shout();
    delete p;
}
ما در اینجا از یک اشاره‌گر معمولی استفاده می‌کنیم و پس از استفاده از آن حذف می‌کنیم، بنابراین همه چیز در اینجا خوب به نظر می‌رسد. اما اگر متد Shout استثنایی را پرتاب کند چه؟ delete p; هرگز فراخوانی نمی‌شود. بنابراین ما یک نشت حافظه داریم. بیایید آن را مدیریت کنیم.
void MakeNoise()
{
    Person* p = new Person("Scott", 25);
    try
    {
        p->Shout();
    }
    catch(...)
    {
        delete p;
        throw;
    }
    delete p;
}
آیا فکر نمی‌کنید این سربار گرفتن یک استثنا و دوباره پرتاب کردن آن است؟ اگر اشاره‌گرهای زیادی ایجاد کرده باشید، این کد دست و پا گیر می‌شود. چگونه یک اشاره‌گر هوشمند کمک می‌کند؟ بیایید به همان کد نگاه کنیم اگر از یک اشاره‌گر هوشمند استفاده کنیم.
void MakeNoise()
{
    SPShout();
}
ما در اینجا از یک اشاره‌گر هوشمند استفاده می‌کنیم. بله، نیازی به گرفتن استثنا در اینجا نداریم. اگر متد Shout استثنایی را پرتاب کند، باز شدن پشته برای تابع رخ می‌دهد و در طول این فرآیند، مخرب همه اشیاء محلی فراخوانی می‌شود، بنابراین مخرب p فراخوانی می‌شود که حافظه را آزاد می‌کند، بنابراین ما ایمن هستیم. بنابراین استفاده از اشاره‌گرهای هوشمند در اینجا بسیار مفید است.

نتیجه‌گیری
اشاره‌گرهای هوشمند برای نوشتن کد ایمن و کارآمد در ++C مفید هستند. از اشاره‌گرهای هوشمند استفاده کنید و از مزایای جمع‌آوری زباله بهره‌مند شوید. به پیاده‌سازی auto_ptr اسکات مایرز در STL نگاهی بیندازید.
من 5 سال گذشته در صنعت نرم‌افزار کار کرده‌ام. از کار بر روی فناوری‌های پیچیده و جدید لذت می‌برم. روی فناوری‌های مایکروسافت مانند VC++، COM، XML، SQL کار کرده‌ام. در حال حاضر روی .Net، C# کار می‌کنم.


نمودار کد مورس برای ۲۶ حرف الفبای لاتین و ۱۰ رقم[1]

این کلید مورس در ابتدا توسط راه‌آهن گوتارد استفاده می‌شد و بعدها توسط یک رادیو آماتور کوتاه‌موج[2] به کار رفت.
کد مورس روشی است که در مخابرات برای کدگذاری حروف متن به‌صورت توالی‌های استانداردی از دو مدت سیگنال متفاوت، که به نقطه و خط (یا به‌صورت «دیت» و «داه») شناخته می‌شوند، استفاده می‌کند.[3][4] کد مورس به نام ساموئل مورس نامگذاری شده است، که یکی از توسعه‌دهندگان اولیه سیستم مورد استفاده برای تلگراف الکتریکی بود.
کد مورس بین‌المللی ۲۶ حرف اساسی لاتین A تا Z، یک حرف لاتین با لهجه (É)، اعداد عربی و مجموعه‌ای کوچک از علائم نگارشی و سیگنال‌های رویه‌ای (پرو‌سایین) را کدگذاری می‌کند. بین حروف بزرگ و کوچک تمایزی وجود ندارد.[1] هر نماد کد مورس از توالی‌ای از دیت و داه تشکیل می‌شود. مدت زمان دیت می‌تواند برای وضوح سیگنال و مهارت اپراتور متفاوت باشد، اما برای هر پیام، پس از تعیین، به‌عنوان واحد پایه زمان در کد مورس به‌کار می‌رود. مدت زمان داه سه برابر مدت زمان دیت است (اگرچه برخی تلگراف‌کاران عمداً طول داه را برای سیگنال واضح‌تر طولانی می‌کنند). هر دیت یا داه درون یک حرف کدگذاری‌شده، پس از آن یک فاصله برابر با مدت دیت می‌آید. حروف یک کلمه با فاصله‌ای برابر با سه دیت از هم جدا می‌شوند و کلمات با فاصله‌ای برابر با هفت دیت از هم جدا می‌شوند.[1][5][a]

کد مورس می‌تواند به‌صورت قابل درک برای حواس انسانی به‌صورت صدا یا نور قابل‌مشاهده ارسال شود، به‌طوری که افراد آموزش‌دیده بتوانند آن را مستقیماً تفسیر کنند.[7][8] معمولاً کد مورس با کلیدینگ روشن-خاموش یک رسانه حامل اطلاعات مانند جریان الکتریکی، امواج رادیویی، نور مرئی یا امواج صوتی منتقل می‌شود.[9][10] جریان یا موج در زمان دیت یا داه حضور دارد و در فواصل بین دیت و داه غیرفعال است.[11][12]

از آنجا که بسیاری از زبان‌های طبیعی بیش از ۲۶ حرف الفبای لاتین دارند، الفبای مورس برای آن زبان‌ها توسعه یافته است، عمدتاً با ترانس‌لیتره کردن کدهای موجود.[13]

برای افزایش کارایی انتقال، کد مورس در ابتدا طوری طراحی شد که مدت هر نماد تقریباً معکوس فراوانی وقوع حرفی باشد که در متن زبان انگلیسی نمایان می‌شود. بنابراین رایج‌ترین حرف در انگلیسی، حرف E، کوتاه‌ترین کد را دارد – یک دیت واحد. چون عناصر کد مورس بر پایه نسبت‌ها نه زمان‌های ثابت تعریف می‌شوند، کد معمولاً با بیشترین سرعتی که گیرنده می‌تواند رمزگشایی کند، ارسال می‌شود. سرعت انتقال کد مورس (سرعت) بر حسب گروه‌های در دقیقه بیان می‌شود که معمولاً به‌صورت کلمه در دقیقه شناخته می‌شود.[b][7]

توسعه و تاریخچه
تلگراف‌ها و کدهای پیش از مورس

دستگاه تلگراف سوزنی تک‌سوزنی
اوایل قرن نوزدهم، آزمایش‌گران اروپایی پیشرفت‌هایی در سیستم‌های سیگنال‌سازی الکتریکی به‌دست آوردند که از تکنیک‌های مختلفی شامل الکتریسیته ساکن و الکتریسیته حاصل از پشته‌های ولتاژیک برای ایجاد تغییرات الکتروشیمیایی و الکترومغناطیسی استفاده می‌کردند. این طرح‌های آزمایشی پیش‌درآمدهای کاربردهای عملی تلگرافی بودند.[14]

کلید تلگراف و صداگر. سیگنال «روشن» است وقتی دکمه فشار داده می‌شود و «خاموش» وقتی رها می‌شود. طول و زمان دیت و داه کاملاً توسط تلگرافیست کنترل می‌شود.
پس از کشف الکترومغناطیس توسط هانس کریستین Ørsted در سال ۱۸۲۰ و اختراع الکترومغناطیس توسط ویلیام استرجن در سال ۱۸۲۴، پیشرفت‌هایی در تلگراف الکترومغناطیسی در اروپا و آمریکا رخ داد. پالس‌های جریان الکتریکی از طریق سیم‌ها به‌منظور کنترل یک الکترومغناطیس در دستگاه گیرنده ارسال می‌شد. بسیاری از اولین سیستم‌های تلگراف از سیستم سوزنی تک‌سوزنی استفاده می‌کردند که ابزار بسیار ساده و مقاومی بود؛ اما کند بود، زیرا اپراتور گیرنده باید بین نگاه کردن به سوزن و نوشتن پیام جابجا می‌شد. در کد مورس، انحراف سوزن به سمت چپ معادل یک دیت و انحراف به سمت راست معادل یک داه بود.[15] سوزن هر بار که به راست یا چپ حرکت می‌کرد، کلیک می‌کرد. با ایجاد دو کلیک متفاوت (با نصب یک توقف‌گاه عاجی و یک متال) انتقال‌ها در دستگاه سوزنی تک‌سوزنی هم شنیدنی و هم قابل‌مشاهده شد که منجر به سیستم صداگر دو صفحه‌ای شد.[16]

ویلیام کوک و چارلز ویتستون در بریتانیا تلگراف الکتریکی را توسعه دادند که در گیرنده‌های آن از الکترومغناطیس‌ها استفاده می‌شد. آن‌ها در ژوئن ۱۸۳۷ پتنت انگلیسی دریافت کردند و آن را بر روی راه‌آهن لندن‑برمنگام نشان دادند؛ این اولین تلگراف تجاری بود. کارل فریدریش گائوس و ویلهلم ادوارد وبر (۱۸۳۳) و همچنین کارل آگوست فون اشتاین‌هیل (۱۸۳۷) برای سیستم‌های تلگراف خود از کدهایی با طول کلمه‌های متفاوت استفاده می‌کردند.[17] در سال ۱۸۴۱، کوک و ویتستون تلگرافی ساختند که حروف را از یک چرخ حروف‌چاپی که توسط چکش ضربه می‌خورد، چاپ می‌کرد.[18]: 79

ساموئل مورس و آلفرد ویل

دستگاه گیرنده کد مورس که بر روی نوار کاغذی ضبط می‌کند
هنرمند آمریکایی ساموئل مورس، فیزیک‌دان آمریکایی جوزف هنری و مهندس مکانیک آلفرد ویل سیستم تلگراف الکتریکی را توسعه دادند. طبیعت «روشن یا خاموش» سیگنال‌های آن باعث شد تا روش انتقال زبان طبیعی تنها با پالس‌های الکتریکی و سکوت بین آن‌ها جستجو شود. حدود سال ۱۸۳۷، مورس این روش را توسعه داد که پیش‌نویس اولیه کد مورس بین‌المللی بود.[18]: 79

سیستم مورس برای تلگرافی که حدود ۱۸۴۴ برای اولین بار استفاده شد، برای ایجاد حفره در نوار کاغذی هنگام دریافت جریان‌های الکتریکی طراحی شده بود. گیرنده اولیه مورس از یک ساعت مکانیکی برای حرکت نوار کاغذی استفاده می‌کرد. وقتی جریان الکتریکی دریافت می‌شد، یک الکترومغناطیس یک آرمتور را فعال می‌کرد که نوک قلم را بر روی نوار در حال حرکت فشار می‌داد و حفره‌ای ایجاد می‌کرد. وقتی جریان قطع می‌شد، یک فنر نوک قلم را عقب می‌کشید و آن بخش از نوار بدون علامت می‌ماند. کد مورس طوری توسعه یافت که اپراتورها بتوانند حفره‌های روی نوار را به متن پیام تبدیل کنند.

در اولین طرح خود برای یک کد، مورس قصد داشت فقط اعداد را منتقل کند و برای هر کلمه کتاب کد داشته باشد تا بر اساس عدد ارسال‌شده جستجو شود. اما کد به‌سرعت توسط آلفرد ویل در سال ۱۸۴۰ گسترش یافت تا حروف و کاراکترهای ویژه را نیز شامل شود تا به‌صورت عمومی‌تری قابل استفاده باشد. ویل با شمارش حروف موجود در جعبه حروف یک روزنامه محلی در مورریستون، نیوجرسی، فراوانی استفاده از حروف در زبان انگلیسی را تخمین زد.[18]: 84  علامت‌های کوتاه «نقطه» و علامت‌های بلند «خط» نامیده شدند و حروف پرکاربردتر کوتاه‌ترین توالی‌های نقطه و خط را دریافت کردند. این کد که اولین بار در ۱۸۴۴ استفاده شد، بعدها به‌عنوان کد مورس خطی، کد مورس آمریکایی یا کد راه‌آهن شناخته شد تا پایان تلگرافی راه‌آهن در ایالات متحده در دهه ۱۹۷۰.[citation needed]

تغییر از کد گرافیکی به کد شنیداری توسط اپراتور
در سیستم اولیه تلگراف مورس، آرمتور گیرنده هنگام حرکت به‌درون و بیرون موقع علامت‌گذاری نوار، صدای کلیکی تولید می‌کرد. اپراتورهای تلگراف به‌سرعت فهمیدند که می‌توانند این کلیک‌ها را مستقیماً به نقطه و خط تبدیل کنند و به‌صورت دستی آنها را بنویسند؛ بنابراین نوار کاغذی دیگر لازم نبود. وقتی کد مورس برای ارتباط رادیویی سازگار شد، نقطه و خط به‌صورت پالس‌های کوتاه و بلند صوتی ارسال شدند.

آموزش تلگرافی بعداً نشان داد که افراد هنگام یادگیری کد مورس بهتر عمل می‌کنند وقتی که «مانند یک زبان» آموزش داده شود؛ به‌طوری که هر کد به‌عنوان یک «کلمه» کامل درک شود نه به‌عنوان توالی جداگانه‌ای از نقطه و خط، همان‌طور که ممکن است در صفحه نمایش داده شود.[19]

با پیدایش صداهای تولیدشده توسط گیرنده‌های رادیو‑تلگراف، اپراتورها نقطه را به صورت «دیت» و خط را به صورت «داه» تلفظ کردند تا صداهای شنیده‌شده را بازتاب دهند. برای حفظ سرعت معمول ارسال، دیت‌هایی که آخرین عنصر یک کد نیستند به صورت «دی» تلفظ می‌شوند. به‌عنوان مثال حرف L (  ▄ ▄▄▄ ▄ ▄ ) به صورت «دی داه دی دیت» تلفظ می‌شود.[20][21] گاهی کد مورس به‌صورت طنزآمیز «ایدی‑امپتی» نامیده می‌شد؛ یک دیت به «ایدی» و یک داه به «امپتی» تبدیل می‌شد که به کلمه «امپتین» منجر می‌شد.[22]

مقایسه نسخه‌های تاریخی کد مورس با استاندارد کنونی. چپ: کد مورس آمریکایی بعدی از ۱۸۴۴.[17] مرکز: نسخه اصلاح‌شده و منطقی که توسط فریدریش گرکه در راه‌آهن‌های آلمان استفاده می‌شد. راست: استاندارد فعلی ITU.
بهبود کد مورس توسط گرکه
کد مورس، همان‌طور که در استاندارد بین‌المللی فعلی (International Morse Code Recommendation, ITU‑R M.1677‑1) تعریف شده است، از پیشنهادی بسیار بهبود یافته توسط فریدریش گرکه در سال ۱۸۴۸ که به «الفبای هامبورگ» معروف شد، استخراج شد؛ تنها نقص واقعی آن استفاده از کدی بسیار طولانی (  ▄ ▄▄▄ ▄ ▄ ▄  و بعداً کد مساوی‌مدت  ▄▄▄ ▄▄▄ ▄▄▄ ) برای حرف مصوت پرکاربرد O بود.

گرکه بسیاری از نقاط کد را تغییر داد و در این فرآیند طول‌های مختلف داه‌ها و فواصل بین عناصر مختلف کد مورس آمریکایی را حذف کرد و تنها دو عنصر کدگذاری، نقطه و خط، باقی ماند. کدهای حروف صدادار آلمانی و CH اضافه شد. کد گرکه در آلمان و اتریش در سال ۱۸۵۱ پذیرفته شد.[23]

این نهایتاً منجر به کد مورس بین‌المللی در سال ۱۸۶۵ شد. کد مورس بین‌المللی بیشتر نقاط کد گرکه را به‌کار گرفت. کدهای O و P از سیستمی که توسط استاین‌هیل توسعه یافته بود، گرفته شد. یک نقطه کد جدید برای J افزوده شد چون گرکه بین I و J تمایزی قائل نبود. تغییراتی نیز در X، Y و Z اعمال شد. در نهایت تنها چهار نقطه کد (E، H، K و N) همانند کد مورس اصلی باقی ماندند که دو مورد آخر داه‌هایشان به طول کامل گسترش یافت. کد آمریکایی اصلی که در جدول مقایسه شده به سال ۱۸۳۸ بازمی‌گردد؛ کد آمریکایی بعدی که در جدول نشان داده شده در سال ۱۸۴۴ توسعه یافت.[17]

رادیو‑تلگرافی و هوانوردی
در دهه ۱۸۹۰، کد مورس به‌طور گسترده‌ای برای ارتباطات رادیویی اولیه قبل از امکان انتقال صدا استفاده شد. در اواخر قرن نوزدهم و اوایل قرن بیستم، بیشتر ارتباطات بین‌المللی با سرعت بالا از طریق کد مورس بر روی خطوط تلگرافی، کابل‌های زیرآبی و مدارهای رادیویی انجام می‌شد.

اگرچه فرستنده‌های قبلی بزرگ و سیستم‌های انتقال با شکاف جرقه خطرناک و دشوار بودند، برخی تلاش‌های اولیه وجود داشت: در سال ۱۹۱۰، نیروی دریایی ایالات متحده آزمایش ارسال مورس از یک هواپیما را انجام داد.[24] اما اولین رادیو‑تلگرافی منظم هوانوردی بر روی کشتی‌های هوایی بود که فضای کافی برای تجهیزات رادیویی بزرگ و سنگین آن زمان داشتند. همان سال، رادیویی بر روی کشتی هوایی America نقش مهمی در هماهنگی نجات خدمه آن ایفا کرد.[25]

در طول جنگ جهانی اول، کشتی‌های زیپلین مجهز به رادیو برای بمباران و شناسایی دریایی استفاده می‌شدند[26] و دستگاه‌های جهت‌یابی رادیویی زمینی برای ناوبری کشتی‌های هوایی به کار می‌رفتند.[26] کشتی‌های هوایی متفقین و هواپیماهای نظامی نیز از رادیو‑تلگرافی استفاده می‌کردند.

با این حال، در طول جنگ جهانی اول رادیو هوانوردی به‌طور گسترده‌ای استفاده نمی‌شد و در دهه ۱۹۲۰، هیچ سیستم رادیویی برای پروازهای مهمی مانند پرواز چارلز لیندبرگ از نیویورک به پاریس در ۱۹۲۷ وجود نداشت. پس از برخاستن لیندبرگ و «روح سنت‑لوئیس»، او کاملاً بدون ارتباط و تنها بود. کد مورس در هوانوردی از اواسط دهه ۱۹۲۰ به‌صورت منظم به‌کار گرفته شد. تا سال ۱۹۲۸، زمانی که اولین پرواز هواپیما توسط Southern Cross از کالیفرنیا به استرالیا انجام شد، یکی از چهار عضو خدمه اپراتور رادیویی بود که با ایستگاه‌های زمینی از طریق رادیو‑تلگرافی ارتباط برقرار می‌کرد.

از دهه ۱۹۳۰، هر دو خلبان‌های نظامی و غیرنظامی ملزم به توانایی استفاده از کد مورس بودند، هم برای استفاده با سیستم‌های ارتباطی اولیه و هم برای شناسایی بیکن‌های ناوبری که شناسه‌های دو یا سه حرفی را به‌صورت مداوم در کد مورس پخش می‌کردند. نقشه‌های هوانوردی شناسه هر کمک‌ناوبری را در کنار موقعیت آن روی نقشه نشان می‌دهند.

علاوه بر این، ارتش‌های متحرک می‌توانستند بدون رادیو‑تلگرافی مؤثر نباشند؛ آن‌ها سریع‌تر از خطوط تلگراف و تلفن جدید حرکت می‌کردند. این موضوع به‌ویژه در حملات بلیتزکریگ نیروهای آلمانی نازی در لهستان، بلژیک، فرانسه (۱۹۴۰)، اتحاد جماهیر شوروی و شمال آفریقا مشهود بود؛ همچنین توسط ارتش بریتانیا در شمال آفریقا، ایتالیا و هلند؛ و توسط ارتش ایالات متحده در فرانسه و بلژیک (۱۹۴۴) و جنوب آلمان (۱۹۴۵).

تلگرافی سریع‌العملی و رادیو‑تلگرافی دریایی

کلاس آموزشی کد مورس نیروی دریایی ایالات متحده در سال ۲۰۱۵. ملوانان از مهارت‌های جدید خود برای جمع‌آوری اطلاعات سیگنال استفاده می‌کنند.
رادیو‑تلگرافی با کد مورس در طول جنگ جهانی دوم حیاتی بود، به‌ویژه برای انتقال پیام‌ها بین کشتی‌های جنگی و پایگاه‌های دریایی. ارتباطات کشتی‑به‑کشتی با رادیو‑تلگرافی، با پیام‌های رمزگذاری‌شده انجام می‌شد زیرا سیستم‌های رادیویی صوتی آن زمان محدودیت‌های برد و امنیت داشتند. رادیو‑تلگرافی همچنین به‌طور گسترده‌ای توسط هواپیماهای جنگی، به‌ویژه هواپیماهای گشت‌زیر دریایی که برای شناسایی کشتی‌های دشمن، کشتی‌های باربری و کشتی‌های نظامی ارسال می‌شد، استفاده می‌شد.

کد مورس تا سال ۱۹۹۹ به‌عنوان استاندارد بین‌المللی برای اضطراری دریایی استفاده می‌شد تا زمانی که توسط سیستم جهانی اضطراری و ایمنی دریایی (GMDSS) جایگزین شد. زمانی که نیروی دریایی فرانسه استفاده از کد مورس را در ۳۱ ژانویه ۱۹۹۷ متوقف کرد، آخرین پیام ارسالی «Calling all. This is our last call before our eternal silence.» بود.[27]

پایان تلگرافی تجاری
در ایالات متحده آخرین انتقال تجاری کد مورس در ۱۲ ژوئیه ۱۹۹۹ انجام شد؛ پیام خاتمه با پیام اصلی ساموئل مورس از سال ۱۸۴۴ «WHAT HATH GOD WROUGHT» و پروسایین SK («پایان تماس») همراه بود.[28]

تا سال ۲۰۱۵، نیروی هوایی ایالات متحده هنوز سالانه ده نفر را در کد مورس آموزش می‌داد.[29]

نیروی ساحلی ایالات متحده تمام استفاده از کد مورس در رادیو را متوقف کرده و دیگر فرکانس‌های رادیویی را برای دریافت پیام‌های مورس، از جمله فرکانس اضطراری MF ۵۰۰ kHz، نظارت نمی‌کند.[30] با این حال، کمیسیون ارتباطات فدرال هنوز به متقاضیانی که آزمون‌های کد و نوشتاری را پاس می‌کنند، مجوز اپراتور رادیو‑تلگرافی تجاری می‌دهد.[31] دارندگان این مجوز ایستگاه قدیمی کد مورس ساحلی کالیفرنیا KPH را فعال کرده و به‌صورت منظم از این ایستگاه یا KSM پخش می‌کنند. به‌طور مشابه، چند ایستگاه کشتی موزه‌ای در ایالات متحده توسط علاقه‌مندان به مورس اداره می‌شود.[32]

مهارت اپراتور

پدال ایامبیک تجاری که همراه با کلید الکترونیکی برای تولید کد مورس با سرعت بالا استفاده می‌شود؛ زمان‌بندی آن توسط کلید الکترونیکی کنترل می‌شود.[c]
سرعت کد مورس بر حسب کلمه در دقیقه (WPM) یا کاراکتر در دقیقه (CPM) اندازه‌گیری می‌شود. کاراکترها به‌دلیل تعداد متفاوت دیت و داه طول متفاوتی دارند؛ بنابراین کلمات نیز در طول زمان نقطه متفاوتی دارند حتی اگر تعداد کاراکترهایشان برابر باشد. به همین دلیل برای اندازه‌گیری سرعت ارسال اپراتورها یک کلمه استاندارد انتخاب می‌شود: دو کلمه استاندارد رایج PARIS و CODEX هستند.[33] اپراتورهای ماهر می‌توانند کد را با سرعت بیش از ۴۰ WPM در ذهن خود «کپی» کنند.

علاوه بر توانایی نوشتن، درک و کپی کردن کاراکترهای الفبایی، عددی، نقطه‌گذاری یا نمادهای خاص در سرعت بالا، اپراتورهای ماهر باید به‌طور کامل از تمام نمادهای خاص غیرنوشتاری (پرو‑سایین) و معانی این سیگنال‌های رویه‌ای در پروتکل ارتباطات کد مورس بین‌المللی آگاه باشند.

مسابقات بین‌المللی کپی کد هنوز گاهی برگزار می‌شود. در ژوئیه ۱۹۳۹ در مسابقه‌ای در Asheville، کارولینای شمالی، تد ر. مک‌الروی (W1JYN) رکوردی همچنان پابرجا برای کپی مورس با ۷۵.۲ WPM ثبت کرد.[34] پیرپونت (2004) نیز اشاره می‌کند که برخی اپراتورها ممکن است از ۱۰۰ WPM عبور کرده باشند.[34] در آن زمان، آن‌ها «عبارات و جملات» را می‌شنوند نه کلمات. بیشترین سرعتی که تا به‌حال توسط یک کلید مستقیم به‌دست آمد، در سال ۱۹۴۲ توسط هری ترنر (W9YZE) (درگذشته ۱۹۹۲) که در یک نمایش در پایگاه ارتش آمریکا ۳۵ WPM را نشان داد، بود. برای مقایسه دقیق رکوردهای سرعت کپی کد در دوره‌های مختلف، باید در نظر داشت که کلمات استاندارد مختلف (۵۰ دیت در مقابل ۶۰ دیت) و فواصل بین‌کلمه‌ای مختلف (۵ دیت در مقابل ۷ دیت) ممکن است در تعیین این سرعت‌ها به‌کار رفته باشند. به‌عنوان مثال، سرعت‌های محاسبه‌شده با کلمه استاندارد CODEX و PARIS می‌توانند تا ۲۰ ٪ متفاوت باشند.

امروزه در میان اپراتورهای آماتور چند سازمان وجود دارد که توانایی کد با سرعت بالا را به‌دست‌آمده‌ها اعطا می‌کند؛ یک گروه شامل کسانی است که می‌توانند مورس را با ۶۰ WPM کپی کنند.[35] همچنین گواهی‌نامه‌های مهارت کد توسط چندین جامعه رادیو آماتور، از جمله American Radio Relay League، صادر می‌شود. جایزه پایه آن از ۱۰ WPM شروع می‌شود و با تأییدهای تا ۴۰ WPM ادامه می‌یابد و برای هر کسی که بتواند متن ارسالی را کپی کند، در دسترس است. اعضای Boy Scouts of America می‌توانند نوار مترجم مورس را بر روی یونیفرم خود بگذارند اگر معیارهای ترجمه کد با ۵ WPM را برآورده کنند.

یک اپراتور سیگنال‌دار نیروی دریایی ایالات متحده در سال ۲۰۰۵ کد مورس می‌فرستد.
تا مه ۲۰۱۳، مجوزهای رادیو‑تلگرافی تجاری کلاس اول، دوم و سوم (تجاری) که بر پایه آزمون‌های کد بر اساس کلمه استاندارد CODEX بودند، هنوز توسط کمیسیون ارتباطات فدرال ایالات متحده صادر می‌شد. مجوز کلاس اول نیاز به گروه کد ۲۰ WPM و مهارت متن ۲۵ WPM داشت؛ سایرین آزمون گروه کد ۱۶ WPM (پنج بلوک حروف به‌صورت شبیه‌سازی متن رمزگذاری‌شده) و آزمون متن ۲۰ WPM (زبان ساده) داشتند. همچنین باید آزمون‌های کتبی دربارهٔ روش‌های عملیاتی و نظریه الکترونیک را پاس می‌کردند. یک شرط ویژه برای کلاس اول، یک سال تجربه برای اپراتورهای ایستگاه‌های کشتی و ساحل بود؛ این اجازه می‌داد دارنده به‌عنوان اپراتور ارشد بر روی کشتی مسافربری خدمت کند. اما از سال ۱۹۹۹، استفاده از سیستم‌های ارتباطی ماهواره‌ای و HF بسیار بالا (GMDSS) این مجوزها را منسوخ کرد. (در آن زمان، برآورده کردن شرط تجربه برای کلاس اول بسیار دشوار بود.)

در حال حاضر، تنها یک کلاس مجوز، مجوز اپراتور رادیو‑تلگرافی، صادر می‌شود. این مجوز یا با پاس کردن آزمون‌ها یا به‌عنوان تجدید مجوزهای دوم و اول که به این مجوز دائمی تبدیل می‌شوند، اعطا می‌گردد. برای متقاضیان جدید، باید آزمون کتبی دربارهٔ نظریه الکترونیک و روش‌های رادیو‑تلگرافی و همچنین آزمون‌های گروه کد ۱۶ WPM و متن ۲۰ WPM را پاس کنند. با این حال، آزمون‌های کد برای دارندگان مجوزهای Amateur Extra که تحت شرط قبلی ۲۰ WPM دریافت کرده‌اند، معاف است.

کد مورس بین‌المللی
کدهای مورس در یک یا چند نسخه بیش از ۱۶۰ سال استفاده شده‌اند — طولانی‌ترین سیستم رمزگذاری پیام الکتریکی. آنچه امروز به‌عنوان کد مورس شناخته می‌شود، کمی متفاوت از آنچه وییل و مورس اولیه توسعه دادند. کد مورس بین‌المللی مدرن یا کد قاره‌ای توسط فریدریش کلمنس گرکه در سال ۱۸۴۸ ایجاد شد و ابتدا برای تلگرافی بین هامبورگ و کوکس‌هاون در آلمان به‌کار رفت. گرکه تقریباً نیمی از الفبا و تمام اعداد را تغییر داد و پایهٔ شکل مدرن کد را فراهم کرد. پس از برخی تغییرات جزئی در حروف و بازنگری کامل اعداد، کد مورس بین‌المللی در کنگره بین‌المللی تلگرافی در سال ۱۸۶۵ در پاریس استاندارد شد و بعدها توسط اتحادیه بین‌المللی مخابرات (ITU) پذیرفته شد. مشخصات نهایی مورس و وییل در اصل فقط برای تلگرافی خطی در ایالات متحده و کانادا به‌کار می‌رفت؛ در حالی که کد بین‌المللی در سایر نقاط، از جمله تمام کشتی‌های دریا و ناوبری در آب‌های شمال آمریکا، استفاده می‌شد. نسخه مورس مورس به‌عنوان کد مورس آمریکایی یا کد راه‌آهن شناخته شد و امروزه تقریباً هرگز استفاده نمی‌شود، به‌جز شاید در بازسازی‌های تاریخی.

هوانوردی

VOR‑DME در Cayo Largo del Sur.
در هوانوردی، خلبانان از کمک‌ناوبری‌های رادیویی استفاده می‌کنند. برای اطمینان از سرویس‌پذیری ایستگاه‌ها، ایستگاه‌ها مجموعه‌ای از حروف شناسایی (معمولاً دو تا پنج حرف از نام ایستگاه) را به‌صورت کد مورس پخش می‌کنند. حروف شناسایی ایستگاه‌ها بر روی نقشه‌های ناوبری هوایی نشان داده می‌شود. برای مثال، VOR‑DME مستقر در فرودگاه Vilo Acuña در Cayo Largo del Sur، کوبا با «UCL» شناخته می‌شود و کد مورس UCL به‌صورت مداوم بر روی فرکانس رادیویی آن پخش می‌شود.

در برخی کشورها، در دوره‌های تعمیر و نگهداری، ایستگاه ممکن است به‌جای حروف شناسایی، سیگنال TEST (  ▄▄▄    ▄   ▄ ▄ ▄   ▄▄▄ ) یا حذف شناسایی را ارسال کند که به خلبانان و ناوبری‌گران می‌گوید ایستگاه قابل‌اعتماد نیست. در کانادا، حذف شناسایی به‌طور کامل نشان می‌دهد که کمک‌ناوبری نباید استفاده شود.[36][37]

در خدمات هوانوردی، مورس معمولاً با سرعت بسیار کم حدود ۵ کلمه در دقیقه ارسال می‌شود. در ایالات متحده، خلبانان نیازی به دانستن مورس برای شناسایی فرستنده ندارند چون توالی نقطه/خط در کنار نماد فرستنده بر روی نقشه‌های ناوبری نوشته شده است. برخی گیرنده‌های ناوبری مدرن به‌صورت خودکار کد را به حروف نمایش داده تبدیل می‌کنند.

صدای بیکن غیرجهت‌دار WG، بر روی ۲۴۸ kHz، موقعیت ۴۹.۸۹۹۲ N، ۹۷.۳۴۹۱۹۷ W، نزدیک فرودگاه اصلی وینیکِگ.

رادیو آماتور

کلید نیمه‌خودکار برند Vibroplex[d] (به‌طور غیررسمی «بگ» نامیده می‌شود چون شبیه حشرهٔ چوبی است).
کد مورس بین‌المللی امروز در میان اپراتورهای رادیو آماتور، به‌ویژه در حالت «موج پیوسته» یا «CW»، محبوب‌ترین است.[e] روش‌های کلیدینگ سریع‌تر دیگری نیز در رادیو‑تلگرافی موجود است، مانند کلیدینگ تغییر فرکانس (FSK).

اپراتورهای رادیو آماتور اولیه تا حدود ۱۹۲۰ فقط از کد مورس استفاده می‌کردند چون فرستنده‌های صوتی به‌طور عمومی در دسترس نبودند. تا سال ۲۰۰۳، اتحادیه بین‌المللی مخابرات (ITU) مهارت کد مورس را به‌عنوان بخشی از فرآیند صدور مجوز رادیو آماتور در سراسر جهان الزامی می‌دانست. اما کنفرانس جهانی رادیوکمیونیکیشن ۲۰۰۳ این الزام را اختیاری کرد.[39] بسیاری از کشورها پس از آن الزامات مورس را از مجوزهای خود حذف کردند.[40]

کد مورس ضبط‌شده بر باند ۴۰ متر (۳۱ ثانیه).

تا سال ۱۹۹۱، برای دریافت مجوز رادیو آماتور در ایالات متحده از کمیسیون ارتباطات فدرال (FCC) نیاز به نمایش توانایی ارسال و دریافت کد مورس با حداقل پنج کلمه در دقیقه (WPM) بود. این توانایی همچنان برای استفاده از باندهای کوتاه‌موج لازم بود. تا سال ۲۰۰۰، برای دریافت بالاترین سطح مجوز آماتور (Amateur Extra Class) نیاز به مهارت ۲۰ WPM بود؛ از ۱۵ آوریل ۲۰۰۰، FCC این الزام را به ۵ WPM کاهش داد.[41] سرانجام، در ۲۳ فوریه ۲۰۰۷، FCC تمام الزامات مهارت کد مورس را از تمام مجوزهای رادیو آماتور حذف کرد.

در حالی که انتقال صدا و داده در باندهای خاص رادیو آماتور تحت قوانین ایالات متحده محدود است، کد مورس در تمام باندهای آماتور مجاز است: LF، MF پایین، MF بالا، HF، VHF و UHF. در برخی کشورها، بخش‌هایی از باندهای آماتور فقط برای ارسال سیگنال‌های مورس اختصاص یافته‌اند.

چون انتقال مورس با سیگنال روشن‑خاموش انجام می‌شود، به‌دلیل سادگی تجهیزات نسبت به سایر حالت‌های انتقال رادیویی، نیاز به تجهیزات پیچیده کمتری دارد. مورس همچنین پهنای باند کمتری (معمولاً فقط ۱۰۰‑۱۵۰ Hz) نسبت به ارتباط صوتی (حدود ۲۴۰۰‑۲۸۰۰۰ Hz برای صدای SSB) استفاده می‌کند.

کد مورس معمولاً به‌صورت یک لحن صوتی با فرکانس بالا دریافت می‌شود، بنابراین انتقال‌ها نسبت به صدا در محیط‌های پرنویز راحت‌تر کپی می‌شوند و می‌توان در محیط‌های بسیار پرنویز/سیگنال کم استفاده کرد. تمرکز توان ارسال در یک پهنای باند بسیار محدود امکان استفاده از فیلترهای گیرنده باریک را فراهم می‌کند که تداخل در فرکانس‌های نزدیک را سرکوب یا حذف می‌کند. پهنای باند باریک همچنین از انتخاب طبیعی شنوایی مغز انسان بهره می‌برد و خوانایی سیگنال‌های ضعیف را بیشتر می‌کند. این کارایی باعث می‌شود CW برای ارسال‌های DX (فاصله‌دور) و همچنین برای ارسال‌های کم‌توان (معمولاً «عملیات QRP» از کد Q برای «کاهش توان») بسیار مفید باشد. چندین باشگاه آماتور وجود دارد که توانایی کپی با سرعت بالا را می‌طلبند؛ بالاترین استاندارد ۶۰ WPM است. American Radio Relay League برنامه گواهینامه مهارت کد را دارد که از ۱۰ WPM شروع می‌شود و تا ۴۰ WPM ادامه می‌یابد و برای هر کسی که بتواند متن ارسالی را کپی کند، در دسترس است. اعضای Boy Scouts of America می‌توانند نوار مترجم مورس را بر روی یونیفرم خود بگذارند اگر معیارهای ترجمه کد با ۵ WPM را برآورده کنند.

یک سیگنال‌دار نیروی دریایی ایالات متحده در سال ۲۰۰۵ کد مورس می‌فرستد.
تا مه ۲۰۱۳، مجوزهای رادیو‑تلگرافی تجاری کلاس اول، دوم و سوم (تجاری) که بر پایه آزمون‌های کد بر اساس کلمه استاندارد CODEX بودند، هنوز توسط کمیسیون ارتباطات فدرال ایالات متحده صادر می‌شد. مجوز کلاس اول نیاز به گروه کد ۲۰ WPM و مهارت متن ۲۵ WPM داشت؛ سایرین آزمون گروه کد ۱۶ WPM (پنج بلوک حروف به‌صورت شبیه‌سازی متن رمزگذاری‌شده) و آزمون متن ۲۰ WPM (زبان ساده) داشتند. همچنین باید آزمون‌های کتبی دربارهٔ روش‌های عملیاتی و نظریه الکترونیک را پاس می‌کردند. یک شرط ویژه برای کلاس اول، یک سال تجربه برای اپراتورهای ایستگاه‌های کشتی و ساحل بود؛ این اجازه می‌داد دارنده به‌عنوان اپراتور ارشد بر روی کشتی مسافربری خدمت کند. اما از سال ۱۹۹۹، استفاده از سیستم‌های ارتباطی ماهواره‌ای و HF بسیار بالا (GMDSS) این مجوزها را منسوخ کرد. (در آن زمان، برآورده کردن شرط تجربه برای کلاس اول بسیار دشوار بود.)

در حال حاضر، تنها یک کلاس مجوز، مجوز اپراتور رادیو‑تلگرافی، صادر می‌شود. این مجوز یا با پاس کردن آزمون‌ها یا به‌عنوان تجدید مجوزهای دوم و اول که به این مجوز دائمی تبدیل می‌شوند، اعطا می‌گردد. برای متقاضیان جدید، باید آزمون کتبی دربارهٔ نظریه الکترونیک و روش‌های رادیو‑تلگرافی و همچنین آزمون‌های گروه کد ۱۶ WPM و متن ۲۰ WPM را پاس کنند. با این حال، آزمون‌های کد برای دارندگان مجوزهای Amateur Extra که تحت شرط قبلی ۲۰ WPM دریافت کرده‌اند، معاف است.

کد مورس بین‌المللی
کدهای مورس در یک یا چند نسخه بیش از ۱۶۰ سال استفاده شده‌اند — طولانی‌ترین سیستم رمزگذاری پیام الکتریکی. آنچه امروز به‌عنوان کد مورس شناخته می‌شود، کمی متفاوت از آنچه وییل و مورس اولیه توسعه دادند. کد مورس بین‌المللی مدرن یا کد قاره‌ای توسط فریدریش کلمنس گرکه در سال ۱۸۴۸ ایجاد شد و ابتدا برای تلگرافی بین هامبورگ و کوکس‌هاون در آلمان به‌کار رفت. گرکه تقریباً نیمی از الفبا و تمام اعداد را تغییر داد و پایهٔ شکل مدرن کد را فراهم کرد. پس از برخی تغییرات جزئی در حروف و بازنگری کامل اعداد، کد مورس بین‌المللی در کنگره بین‌المللی تلگرافی در سال ۱۸۶۵ در پاریس استاندارد شد و بعدها توسط اتحادیه بین‌المللی مخابرات (ITU) پذیرفته شد. مشخصات نهایی مورس و وییل در اصل فقط برای تلگرافی خطی در ایالات متحده و کانادا به‌کار می‌رفت؛ در حالی که کد بین‌المللی در سایر نقاط، از جمله تمام کشتی‌های دریا و ناوبری در آب‌های شمال آمریکا، استفاده می‌شد. نسخه مورس مورس به‌عنوان کد مورس آمریکایی یا کد راه‌آهن شناخته شد و امروزه تقریباً هرگز استفاده نمی‌شود، به‌جز شاید در بازسازی‌های تاریخی.

هوانوردی

VOR‑DME در Cayo Largo del Sur.
در هوانوردی، خلبانان از کمک‌ناوبری‌های رادیویی استفاده می‌کنند. برای اطمینان از سرویس‌پذیری ایستگاه‌ها، ایستگاه‌ها مجموعه‌ای از حروف شناسایی (معمولاً دو تا پنج حرف از نام ایستگاه) را به‌صورت کد مورس پخش می‌کنند. حروف شناسایی ایستگاه‌ها بر روی نقشه‌های ناوبری هوایی نشان داده می‌شود. برای مثال، VOR‑DME مستقر در فرودگاه Vilo Acuña در Cayo Largo del Sur، کوبا با «UCL» شناخته می‌شود و کد مورس UCL به‌صورت مداوم بر روی فرکانس رادیویی آن پخش می‌شود.

در برخی کشورها، در دوره‌های تعمیر و نگهداری، ایستگاه ممکن است به‌جای حروف شناسایی، سیگنال TEST (  ▄▄▄    ▄   ▄ ▄ ▄   ▄▄▄ ) یا حذف شناسایی را ارسال کند که به خلبانان و ناوبری‌گران می‌گوید ایستگاه قابل‌اعتماد نیست. در کانادا، حذف شناسایی به‌طور کامل نشان می‌دهد که کمک‌ناوبری نباید استفاده شود.[36][37]

در خدمات هوانوردی، مورس معمولاً با سرعت بسیار کم حدود ۵ کلمه در دقیقه ارسال می‌شود. در ایالات متحده، خلبانان نیازی به دانستن مورس برای شناسایی فرستنده ندارند چون توالی نقطه/خط در کنار نماد فرستنده بر روی نقشه‌های ناوبری نوشته شده است. برخی گیرنده‌های ناوبری مدرن به‌صورت خودکار کد را به حروف نمایش داده تبدیل می‌کنند.

صدای بیکن غیرجهت‌دار WG، بر روی ۲۴۸ kHz، موقعیت ۴۹.۸۹۹۲ N، ۹۷.۳۴۹۱۹۷ W، نزدیک فرودگاه اصلی وینیکِگ.

رادیو آماتور

کلید نیمه‌خودکار برند Vibroplex[d] (به‌طور غیررسمی «بگ» نامیده می‌شود چون شبیه حشرهٔ چوبی است).
کد مورس بین‌المللی امروز در میان اپراتورهای رادیو آماتور، به‌ویژه در حالت «موج پیوسته» یا «CW»، محبوب‌ترین است.[e] روش‌های کلیدینگ سریع‌تر دیگری نیز در رادیو‑تلگرافی موجود است، مانند کلیدینگ تغییر فرکانس (FSK).

اپراتورهای رادیو آماتور اولیه تا حدود ۱۹۲۰ فقط از کد مورس استفاده می‌کردند چون فرستنده‌های صوتی به‌طور عمومی در دسترس نبودند. تا سال ۲۰۰۳، اتحادیه بین‌المللی مخابرات (ITU) مهارت کد مورس را به‌عنوان بخشی از فرآیند صدور مجوز رادیو آماتور در سراسر جهان الزامی می‌دانست. اما کنفرانس جهانی رادیوکمیونیکیشن ۲۰۰۳ این الزام را اختیاری کرد.[39] بسیاری از کشورها پس از آن الزامات مورس را از مجوزهای خود حذف کردند.[40]

کد مورس ضبط‌شده بر باند ۴۰ متر (۳۱ ثانیه).

تا سال ۱۹۹۱، برای دریافت مجوز رادیو آماتور در ایالات متحده از کمیسیون ارتباطات فدرال (FCC) نیاز به نمایش توانایی ارسال و دریافت کد مورس با حداقل پنج کلمه در دقیقه (WPM) بود. این توانایی همچنان برای استفاده از باندهای کوتاه‌موج لازم بود. تا سال ۲۰۰۰، برای دریافت بالاترین سطح مجوز آماتور (Amateur Extra Class) نیاز به مهارت ۲۰ WPM بود؛ از ۱۵ آوریل ۲۰۰۰، FCC این الزام را به ۵ WPM کاهش داد.[41] سرانجام، در ۲۳ فوریه ۲۰۰۷، FCC تمام الزامات مهارت کد مورس را از تمام مجوزهای رادیو آماتور حذف کرد.

در حالی که انتقال صدا و داده در باندهای خاص رادیو آماتور تحت قوانین ایالات متحده محدود است، کد مورس در تمام باندهای آماتور مجاز است: LF، MF پایین، MF بالا، HF، VHF و UHF. در برخی کشورها، بخش‌هایی از باندهای آماتور فقط برای ارسال سیگنال‌های مورس اختصاص یافته‌اند.

چون انتقال مورس با سیگنال روشن‑خاموش انجام می‌شود، به‌دلیل سادگی تجهیزات نسبت به سایر حالت‌های انتقال رادیویی، نیاز به تجهیزات پیچیده کمتری دارد. مورس همچنین پهنای باند کمتری (معمولاً فقط ۱۰۰‑۱۵۰ Hz) نسبت به ارتباط صوتی (حدود ۲۴۰۰‑۲۸۰۰۰ Hz برای صدای SSB) استفاده می‌کند.

کد مورس معمولاً به‌صورت یک لحن صوتی با فرکانس بالا دریافت می‌شود، بنابراین انتقال‌ها نسبت به صدا در محیط‌های پرنویز راحت‌تر کپی می‌شوند و می‌توان در محیط‌های بسیار پرنویز/سیگنال کم استفاده کرد. تمرکز توان ارسال در یک پهنای باند بسیار محدود امکان استفاده از فیلترهای گیرنده باریک را فراهم می‌کند که تداخل در فرکانس‌های نزدیک را سرکوب یا حذف می‌کند. پهنای باند باریک همچنین از انتخاب طبیعی شنوایی مغز انسان بهره می‌برد و خوانایی سیگنال‌های ضعیف را بیشتر می‌کند. این کارایی باعث می‌شود CW برای ارسال‌های DX (فاصله‌دور) و همچنین برای ارسال‌های کم‌توان (معمولاً «عملیات QRP» از کد Q برای «کاهش توان») بسیار مفید باشد. چندین باشگاه آماتور وجود دارد که توانایی کپی با سرعت بالا را می‌طلبند؛ بالاترین استاندارد ۶۰ WPM است. American Radio Relay League برنامه گواهینامه مهارت کد را دارد که از ۱۰ WPM شروع می‌شود و تا ۴۰ WPM ادامه می‌یابد و برای هر کسی که بتواند متن ارسالی را کپی کند، در دسترس است. اعضای Boy Scouts of America می‌توانند نوار مترجم مورس را بر روی یونیفرم خود بگذارند اگر معیارهای ترجمه کد با ۵ WPM را برآورده کنند.

یک سیگنال‌دار نیروی دریایی ایالات متحده در سال ۲۰۰۵ کد مورس می‌فرستد.
تا مه ۲۰۱۳، مجوزهای رادیو‑تلگرافی تجاری کلاس اول، دوم و سوم (تجاری) که بر پایه آزمون‌های کد بر اساس کلمه استاندارد CODEX بودند، هنوز توسط کمیسیون ارتباطات فدرال ایالات متحده صادر می‌شد. مجوز کلاس اول نیاز به گروه کد ۲۰ WPM و مهارت متن ۲۵ WPM داشت؛ سایرین آزمون گروه کد ۱۶ WPM (پنج بلوک حروف به‌صورت شبیه‌سازی متن رمزگذاری‌شده) و آزمون متن ۲۰ WPM (زبان ساده) داشتند. همچنین باید آزمون‌های کتبی دربارهٔ روش‌های عملیاتی و نظریه الکترونیک را پاس می‌کردند. یک شرط ویژه برای کلاس اول، یک سال تجربه برای اپراتورهای ایستگاه‌های کشتی و ساحل بود؛ این اجازه می‌داد دارنده به‌عنوان اپراتور ارشد بر روی کشتی مسافربری خدمت کند. اما از سال ۱۹۹۹، استفاده از سیستم‌های ارتباطی ماهواره‌ای و HF بسیار بالا (GMDSS) این مجوزها را منسوخ کرد. (در آن زمان، برآورده کردن شرط تجربه برای کلاس اول بسیار دشوار بود.)

در حال حاضر، تنها یک کلاس مجوز، مجوز اپراتور رادیو‑تلگرافی، صادر می‌شود. این مجوز یا با پاس کردن آزمون‌ها یا به‌عنوان تجدید مجوزهای دوم و اول که به این مجوز دائمی تبدیل می‌شوند، اعطا می‌گردد. برای متقاضیان جدید، باید آزمون کتبی دربارهٔ نظریه الکترونیک و روش‌های رادیو‑تلگرافی و همچنین آزمون‌های گروه کد ۱۶ WPM و متن ۲۰ WPM را پاس کنند. با این حال، آزمون‌های کد برای دارندگان مجوزهای Amateur Extra که تحت شرط قبلی ۲۰ WPM دریافت کرده‌اند، معاف است.

کد مورس بین‌المللی
کدهای مورس در یک یا چند نسخه بیش از ۱۶۰ سال استفاده شده‌اند — طولانی‌ترین سیستم رمزگذاری پیام الکتریکی. آنچه امروز به‌عنوان کد مورس شناخته می‌شود، کمی متفاوت از آنچه وییل و مورس اولیه توسعه دادند. کد مورس بین‌المللی مدرن یا کد قاره‌ای توسط فریدریش کلمنس گرکه در سال ۱۸۴۸ ایجاد شد و ابتدا برای تلگرافی بین هامبورگ و کوکس‌هاون در آلمان به‌کار رفت. گرکه تقریباً نیمی از الفبا و تمام اعداد را تغییر داد و پایهٔ شکل مدرن کد را فراهم کرد. پس از برخی تغییرات جزئی در حروف و بازنگری کامل اعداد، کد مورس بین‌المللی در کنگره بین‌المللی تلگرافی در سال ۱۸۶۵ در پاریس استاندارد شد و بعدها توسط اتحادیه بین‌المللی مخابرات (ITU) پذیرفته شد. مشخصات نهایی مورس و وییل در اصل فقط برای تلگرافی خطی در ایالات متحده و کانادا به‌کار می‌رفت؛ در حالی که کد بین‌المللی در سایر نقاط، از جمله تمام کشتی‌های دریا و ناوبری در آب‌های شمال آمریکا، استفاده می‌شد. نسخه مورس مورس به‌عنوان کد مورس آمریکایی یا کد راه‌آهن شناخته شد و امروزه تقریباً هرگز استفاده نمی‌شود، به‌جز شاید در بازسازی‌های تاریخی.

هوانوردی

VOR‑DME در Cayo Largo del Sur.
در هوانوردی، خلبانان از کمک‌ناوبری‌های رادیویی استفاده می‌کنند. برای اطمینان از سرویس‌پذیری ایستگاه‌ها، ایستگاه‌ها مجموعه‌ای از حروف شناسایی (معمولاً دو تا پنج حرف از نام ایستگاه) را به‌صورت کد مورس پخش می‌کنند. حروف شناسایی ایستگاه‌ها بر روی نقشه‌های ناوبری هوایی نشان داده می‌شود. برای مثال، VOR‑DME مستقر در فرودگاه Vilo Acuña در Cayo Largo del Sur، کوبا با «UCL» شناخته می‌شود و کد مورس UCL به‌صورت مداوم بر روی فرکانس رادیویی آن پخش می‌شود.

در برخی کشورها، در دوره‌های تعمیر و نگهداری، ایستگاه ممکن است به‌جای حروف شناسایی، سیگنال TEST (  ▄▄▄    ▄   ▄ ▄ ▄   ▄▄▄ ) یا حذف شناسایی را ارسال کند که به خلبانان و ناوبری‌گران می‌گوید ایستگاه قابل‌اعتماد نیست. در کانادا، حذف شناسایی به‌طور کامل نشان می‌دهد که کمک‌ناوبری نباید استفاده شود.[36][37]

در خدمات هوانوردی، مورس معمولاً با سرعت بسیار کم حدود ۵ کلمه در دقیقه ارسال می‌شود. در ایالات متحده، خلبانان نیازی به دانستن مورس برای شناسایی فرستنده ندارند چون توالی نقطه/خط در کنار نماد فرستنده بر روی نقشه‌های ناوبری نوشته شده است. برخی گیرنده‌های ناوبری مدرن به‌صورت خودکار کد را به حروف نمایش داده تبدیل می‌کنند.

صدای بیکن غیرجهت‌دار WG، بر روی ۲۴۸ kHz، موقعیت ۴۹.۸۹۹۲ N، ۹۷.۳۴۹۱۹۷ W، نزدیک فرودگاه اصلی وینیکِگ.

رادیو آماتور

کلید نیمه‌خودکار برند Vibroplex[d] (به‌طور غیررسمی «بگ» نامیده می‌شود چون شبیه حشرهٔ چوبی است).
کد مورس بین‌المللی امروز در میان اپراتورهای رادیو آماتور، به‌ویژه در حالت «موج پیوسته» یا «CW»، محبوب‌ترین است.[e] روش‌های کلیدینگ سریع‌تر دیگری نیز در رادیو‑تلگرافی موجود است، مانند کلیدینگ تغییر فرکانس (FSK).

اپراتورهای رادیو آماتور اولیه تا حدود ۱۹۲۰ فقط از کد مورس استفاده می‌کردند چون فرستنده‌های صوتی به‌طور عمومی در دسترس نبودند. تا سال ۲۰۰۳، اتحادیه بین‌المللی مخابرات (ITU) مهارت کد مورس را به‌عنوان بخشی از فرآیند صدور مجوز رادیو آماتور در سراسر جهان الزامی می‌دانست. اما کنفرانس جهانی رادیوکمیونیکیشن ۲۰۰۳ این الزام را اختیاری کرد.[39] بسیاری از کشورها پس از آن الزامات مورس را از مجوزهای خود حذف کردند.[40]

کد مورس ضبط‌شده بر باند ۴۰ متر (۳۱ ثانیه).

تا سال ۱۹۹۱، برای دریافت مجوز رادیو آماتور در ایالات متحده از کمیسیون ارتباطات فدرال (FCC) نیاز به نمایش توانایی ارسال و دریافت کد مورس با حداقل پنج کلمه در دقیقه (WPM) بود. این توانایی همچنان برای استفاده از باندهای کوتاه‌موج لازم بود. تا سال ۲۰۰۰، برای دریافت بالاترین سطح مجوز آماتور (Amateur Extra Class) نیاز به مهارت ۲۰ WPM بود؛ از ۱۵ آوریل ۲۰۰۰، FCC این الزام را به ۵ WPM کاهش داد.[41] سرانجام، در ۲۳ فوریه ۲۰۰۷، FCC تمام الزامات مهارت کد مورس را از تمام مجوزهای رادیو آماتور حذف کرد.

در حالی که انتقال صدا و داده در باندهای خاص رادیو آماتور تحت قوانین ایالات متحده محدود است، کد مورس در تمام باندهای آماتور مجاز است: LF، MF پایین، MF بالا، HF، VHF و UHF. در برخی کشورها، بخش‌هایی از باندهای آماتور فقط برای ارسال سیگنال‌های مورس اختصاص یافته‌اند.

چون انتقال مورس با سیگنال روشن‑خاموش انجام می‌شود، به‌دلیل سادگی تجهیزات نسبت به سایر حالت‌های انتقال رادیویی، نیاز به تجهیزات پیچیده کمتری دارد. مورس همچنین پهنای باند کمتری (معمولاً فقط ۱۰۰‑۱۵۰ Hz) نسبت به ارتباط صوتی (حدود ۲۴۰۰‑۲۸۰۰۰ Hz برای صدای SSB) استفاده می‌کند.

کد مورس معمولاً به‌صورت یک لحن صوتی با فرکانس بالا دریافت می‌شود، بنابراین انتقال‌ها نسبت به صدا در محیط‌های پرنویز راحت‌تر کپی می‌شوند و می‌توان در محیط‌های بسیار پرنویز/سیگنال کم استفاده کرد. تمرکز توان ارسال در یک پهنای باند بسیار محدود امکان استفاده از فیلترهای گیرنده باریک را فراهم می‌کند که تداخل در فرکانس‌های نزدیک را سرکوب یا حذف می‌کند. پهنای باند باریک همچنین از انتخاب طبیعی شنوایی مغز انسان بهره می‌برد و خوانایی سیگنال‌های ضعیف را بیشتر می‌کند. این کارایی باعث می‌شود CW برای ارسال‌های DX (فاصله‌دور) و همچنین برای ارسال‌های کم‌توان (معمولاً «عملیات QRP» از کد Q برای «کاهش توان») بسیار مفید باشد. چندین باشگاه آماتور وجود دارد که توانایی کپی با سرعت بالا را می‌طلبند؛ بالاترین استاندارد ۶۰ WPM است. American Radio Relay League برنامه گواهینامه مهارت کد را دارد که از ۱۰ WPM شروع می‌شود و تا ۴۰ WPM ادامه می‌یابد و برای هر کسی که بتواند متن ارسالی را کپی کند، در دسترس است. اعضای Boy Scouts of America می‌توانند نوار مترجم مورس را بر روی یونیفرم خود بگذارند اگر معیارهای ترجمه کد با ۵ WPM را برآورده کنند.

یک سیگنال‌دار نیروی دریایی ایالات متحده در سال ۲۰۰۵ کد مورس می‌فرستد.
تا مه ۲۰۱۳، مجوزهای رادیو‑تلگرافی تجاری کلاس اول، دوم و سوم (تجاری) که بر پایه آزمون‌های کد بر اساس کلمه استاندارد CODEX بودند، هنوز توسط کمیسیون ارتباطات فدرال ایالات متحده صادر می‌شد. مجوز کلاس اول نیاز به گروه کد ۲۰ WPM و مهارت متن ۲۵ WPM داشت؛ سایرین آزمون گروه کد ۱۶ WPM (پنج بلوک حروف به‌صورت شبیه‌سازی متن رمزگذاری‌شده) و آزمون متن ۲۰ WPM (زبان ساده) داشتند. همچنین باید آزمون‌های کتبی دربارهٔ روش‌های عملیاتی و نظریه الکترونیک را پاس می‌کردند. یک شرط ویژه برای کلاس اول، یک سال تجربه برای اپراتورهای ایستگاه‌های کشتی و ساحل بود؛ این اجازه می‌داد دارنده به‌عنوان اپراتور ارشد بر روی کشتی مسافربری خدمت کند. اما از سال ۱۹۹۹، استفاده از سیستم‌های ارتباطی ماهواره‌ای و HF بسیار بالا (GMDSS) این مجوزها را منسوخ کرد. (در آن زمان، برآورده کردن شرط تجربه برای کلاس اول بسیار دشوار بود.)

در حال حاضر، تنها یک کلاس مجوز، مجوز اپراتور رادیو‑تلگرافی، صادر می‌شود. این مجوز یا با پاس کردن آزمون‌ها یا به‌عنوان تجدید مجوزهای دوم و اول که به این مجوز دائمی تبدیل می‌شوند، اعطا می‌گردد. برای متقاضیان جدید، باید آزمون کتبی دربارهٔ نظریه الکترونیک و روش‌های رادیو‑تلگرافی و همچنین آزمون‌های گروه کد ۱۶ WPM و متن ۲۰ WPM را پاس کنند. با این حال، آزمون‌های کد برای دارندگان مجوزهای Amateur Extra که تحت شرط قبلی ۲۰ WPM دریافت کرده‌اند، معاف است.