কনস্ট পয়েন্টার পয়েন্ট কি?


149

আমি বিন্দু মানগুলি পয়েন্টার সম্পর্কে কথা বলছি না, তবে তারা নিজেরাই কনস্ট পয়েন্টার।

আমি খুব বেসিক স্টাফ ছাড়িয়ে সি এবং সি ++ শিখছি এবং ঠিক আজ অবধি আমি বুঝতে পেরেছি যে পয়েন্টারগুলি ফাংশনগুলিতে মান দ্বারা প্রেরণ করা হয়, যা বোঝা যায়। এর অর্থ হ'ল কোনও ফাংশনের অভ্যন্তরে আমি কলার থেকে মূল পয়েন্টারকে প্রভাবিত না করে অনুলিপি পয়েন্টারটিকে অন্য কোনও মান হিসাবে চিহ্নিত করতে পারি।

সুতরাং একটি ফাংশন শিরোনাম থাকার বিন্দু কি বলে যে:

void foo(int* const ptr);

এই জাতীয় ফাংশনের অভ্যন্তরে আপনি অন্য কিছুতে পিটিআর পয়েন্ট করতে পারবেন না কারণ এটি দৃ const় এবং আপনি এটি পরিবর্তন করতে চান না, তবে এই জাতীয় ফাংশন:

void foo(int* ptr);

কাজটি ঠিক তেমনি করে! কারণ পয়েন্টারটি যেভাবেই অনুলিপি করা হয়েছে এবং কলারের মধ্যে পয়েন্টারটি আপনি অনুলিপি পরিবর্তন করেও প্রভাবিত হয় না। তাহলে কনস্টের সুবিধা কী?


29
সংকলনকালে আপনি যদি গ্যারান্টি দিতে চান যে পয়েন্টারটি অন্য কোনও কিছুর দিকে নির্দেশ করতে পারে না এবং সংশোধন করা উচিত নয়?
প্ল্যাটিনাম আজুর

25
কোনও constপরামিতি হিসাবে ঠিক একই পয়েন্ট ।
ডেভিড হেফারনন

2
@ প্ল্যাটিনাম আজুর, আমার কয়েক বছরের অভিজ্ঞতা প্রোগ্রামিং রয়েছে, তবে আমার সফ্টওয়্যার অনুশীলনের অভাব রয়েছে। আমি আনন্দিত আমি এই প্রশ্নটি করেছি কারণ আমি আমার নিজের যুক্তি ত্রুটিগুলি সংকলকটি করার প্রয়োজনটি অনুভব করি নি। আমি প্রশ্নটি জমা দেওয়ার মুহুর্তে আমার প্রাথমিক প্রতিক্রিয়াটি ছিল "পয়েন্টারটি সংশোধন করা হলে আমার কেন যত্ন করা উচিত ?, এটি কলারকে প্রভাবিত করবে না"। যতক্ষণ না আমি সমস্ত উত্তর পড়েছি আমি বুঝতে পেরেছি আমার যত্ন নেওয়া উচিত কারণ আমি যদি এটি সংশোধন করার চেষ্টা করি তবে আমার এবং আমার কোডিংয়ের যুক্তিটি ভুল (বা নক্ষত্রটি নিখোঁজের মতো টাইপ ছিল) এবং সংকলকটি না করায় আমি বুঝতে পারি না ' আমাকে বলুন না
আর রুইজ

3
@ R.Ruiz। সন্দেহ নেই, এমনকি আমাদের মধ্যে সবচেয়ে অভিজ্ঞ ব্যক্তিও নির্ভুলতার অতিরিক্ত গ্যারান্টি সহ করতে পারেন। সফ্টওয়্যার ইঞ্জিনিয়ারিং ইঞ্জিনিয়ারিংয়ের একটি ফর্ম যেখানে আরও কিছুটা প্রাসঙ্গিকভাবে গ্রহণযোগ্য হতে পারে (এলোমেলো HTTP 502s, ধীরে সংযোগ, কখনও কখনও লোড করতে ব্যর্থ ইমেজটি অসাধারণ ঘটনা নয়, তবে একটি বিমানের ক্ষেত্রে ইঞ্জিন ব্যর্থ হওয়া অগ্রহণযোগ্য এবং সম্ভবত গুরুতর হয়), কখনও কখনও অযৌক্তিক তাড়াতাড়ি লোকদের প্রোগ্রাম। ইউনিট পরীক্ষাগুলি লেখার ন্যায্যতা দেয় একই যুক্তি- constসঠিকতা গ্যারান্টি ব্যবহারের ব্যাখ্যা করবে । এটি কেবল আমাদের কোডটি indubitably সঠিক কিনা তা আরও নিশ্চিত করে তোলে।
প্ল্যাটিনাম আউজুর

3
একজন সংশ্লিষ্ট প্রশ্ন: stackoverflow.com/questions/219914/...
Raedwald

উত্তর:


207

const এমন একটি সরঞ্জাম যা আপনার খুব গুরুত্বপূর্ণ সি ++ ধারণা অনুসরণে ব্যবহার করা উচিত:

আপনি যা বলতে চান তা প্রয়োগ করার জন্য সংকলক পেয়ে রান-টাইমের পরিবর্তে সংকলন-সময় বাগগুলি সন্ধান করুন।

যদিও এটি কার্যকারিতা পরিবর্তন করে না, constযখন আপনি যে কাজগুলি করতে চান না এমন করছেন তখন সংযোজনকারী ত্রুটি তৈরি করে। নিম্নলিখিত টাইপ কল্পনা করুন:

void foo(int* ptr)
{
    ptr = 0;// oops, I meant *ptr = 0
}

আপনি যদি ব্যবহার করেন int* constতবে এটি একটি সংকলক ত্রুটি তৈরি করবে কারণ আপনি মানটি পরিবর্তন করছেন ptr। সিনট্যাক্সের মাধ্যমে সীমাবদ্ধতা যুক্ত করা সাধারণভাবে ভাল thing কেবল এটিকে খুব বেশি দূরে নিয়ে যাবেন না - আপনি যে উদাহরণটি দিয়েছেন তা হল এমন একটি ঘটনা যেখানে বেশিরভাগ লোকেরা ব্যবহার করা বিরত করে না const


8
ধন্যবাদ, এটি একটি উত্তর যা আমাকে বিশ্বাস করে। আপনি দৃ const়তা স্থাপন করেছেন যাতে সংকলকটি আপনাকে নিজের দায়িত্বের ত্রুটি সম্পর্কে সতর্ক করে। আপনার উদাহরণটি এই ধারণাটি চিত্রিত করার জন্য উপযুক্ত কারণ এটি পয়েন্টারগুলির সাথে একটি সাধারণ ভুল। আপনার চেয়ে!
আর রুইজ

25
"সংকলক আপনাকে সহায়তা করতে সহায়তা করুন" এই মন্ত্রটি আমি সাধারণত এর জন্য জপ করি।
ফ্লেক্সো

1
: +1 টি, কিন্তু এখানে একটা মজার কেস যেখানে এটি argueable হয় stackoverflow.com/questions/6305906/...
Raedwald

3
সুতরাং আপনি একই উত্তরটি দিতে পারেন "কেন ভেরিয়েবলগুলিকে ব্যক্তিগত করা, যখন আপনি কেবল শ্রেণীর বাইরে ব্যবহার করতে পারবেন না can"
লি লুভিয়ের

এটি সামান্য অফ টপিক হতে পারে তবে এই দৃ const় পয়েন্টারটি মেমোরিতে কোথায় বসে? আমি জানি সমস্ত কনস্ট মেমোরির গ্লোবাল অংশে বসে, তবে আপনি কোন কনস্টের বিষয়ে 100% নিশ্চিত নন যে আপনি একটি ফানক ভার হিসাবে পাস করেছেন। ধন্যবাদ এবং দুঃখিত যদি বিষয়টি বন্ধ থাকে
টোমর

77

আমি কেবল const যুক্তি ব্যবহার করার বিষয়বস্তু তৈরি করি কারণ এটি আরও সংকলক পরীক্ষাগুলি সক্ষম করে: যদি আমি ঘটনাক্রমে ফাংশনের অভ্যন্তরে কোনও যুক্তি মানটি পুনরায় বরাদ্দ করি তবে সংকলক আমাকে কামড় দেয়।

আমি খুব কমই ভেরিয়েবলগুলি পুনরায় ব্যবহার করি, নতুন মানগুলি ধরে রাখার জন্য এটি নতুন ভেরিয়েবল তৈরি করা পরিষ্কার, সুতরাং মূলত আমার সমস্ত ভেরিয়েবলের ঘোষণা const(লুপ ভেরিয়েবলের মতো কিছু ক্ষেত্রে বাদে constকোডটি কাজ করা থেকে বিরত থাকবে) except

নোট করুন যে এটি কোনও ফাংশনের সংজ্ঞাতে কেবল অর্থবোধ করে। এটি ঘোষণার অন্তর্ভুক্ত নয় , যা ব্যবহারকারী দেখেন। এবং আমি constফাংশনের ভিতরে প্যারামিটারগুলির জন্য ব্যবহার করি কিনা তা ব্যবহারকারীর যত্ন নেই ।

উদাহরণ:

// foo.h
int frob(int x);
// foo.cpp
int frob(int const x) {
   MyConfigType const config = get_the_config();
   return x * config.scaling;
}

আর্গুমেন্ট এবং স্থানীয় ভেরিয়েবল উভয়ই লক্ষ্য করুন const। আমরাও হয় প্রয়োজনীয় কিন্তু ফাংশন যে এমনকি সামান্য বড় সঙ্গে, এই বারবার আমাকে ভুল করার হাত থেকে রক্ষা করেছে।


17
+1অন্য থেকে const-obsessed গোঁড়া। যাইহোক, আমি আমার সংমিশ্রণকারীদের আমার দিকে ছোঁড়া পছন্দ করি। আমি অনেকগুলি ত্রুটি করি এবং তারা কামড়ায় খারাপভাবে ভুগতে হবে।
sbi

2
+1, আমি অত্যন্ত পরামর্শ দিচ্ছি " constযদি ভাল কারণ না থাকে" কৌশলটি unless যদিও কিছু ভাল ব্যতিক্রম রয়েছে, যেমন অনুলিপি করুন এবং অদলবদল করুন
ফ্লেক্সো

2
যদি আমি একটি নতুন ভাষা ডিজাইন করতাম তবে ঘোষিত অবজেক্টগুলি ডিফল্টরূপে কেবল পঠনযোগ্য ("কনস্ট") হবে। কোনও অবজেক্টকে লিখনযোগ্য করার জন্য আপনার কিছু বিশেষ বাক্য গঠন, সম্ভবত একটি "ভার" কীওয়ার্ড প্রয়োজন।
কিথ থম্পসন

@ কিথ আমি "অবশ্যই" বলতে প্রলোভিত। এই মুহূর্তে অন্য সমস্ত কিছু বোকা। তবে দুর্ভাগ্যক্রমে বেশিরভাগ ভাষা ডিজাইনাররা আমাদের সাথে একমত নন বলে মনে হচ্ছে ... আসলে, আমি ইতিমধ্যে অনেকটা পোস্ট করেছি (এখন মুছে ফেলা প্রশ্নে, "আপনার সবচেয়ে বিতর্কিত প্রোগ্রামিং মতটি কী?")।
কনরাড রুডল্ফ

1
@ কুবা ওবার আমি দেখতে পাচ্ছি না যে এটি মোটেই হতাশাব্যঞ্জক। আপনি যদি পরে দেখতে পান যে ফাংশনটির মূল অংশের মধ্যে যা যা ঘটেছিল তা আপনাকে সংশোধন করতে হবে, তবে কেবল constযুক্তিটি থেকে বাদ দিন , এবং কেন সম্ভবত তা মন্তব্য করুন। এই ক্ষুদ্র অতিরিক্ত বিটটি সমস্ত যুক্তি অ- constডিফল্ট হিসাবে চিহ্নিত করা এবং তৈরি হওয়া সমস্ত সম্ভাব্য ত্রুটিগুলির মধ্যে নিজেকে খোলার পক্ষে ন্যায্যতা দেয় না ।
আন্ডারস্কোর_ডে

20

আপনার প্রশ্ন আরও সাধারণ কিছু স্পর্শ করে: ফাংশন যুক্তি স্থির হওয়া উচিত?

মান আর্গুমেন্টের স্থায়িত্ব (আপনার পয়েন্টারের মতো) একটি বাস্তবায়ন বিশদ এবং এটি ফাংশন ঘোষণার অংশ হয় না । এর অর্থ হ'ল আপনার ফাংশনটি সর্বদা এটি থাকে:

void foo(T);

এটি সম্পূর্ণরূপে ফাংশনের প্রয়োগকারীর উপর নির্ভর করে যে তিনি কোনও পরিবর্তনযোগ্য বা স্থিরভাবে ফাংশন-স্কোপ যুক্তি ভেরিয়েবলটি ব্যবহার করতে চান কিনা:

// implementation 1
void foo(T const x)
{
  // I won't touch x
  T y = x;
  // ...
}

// implementation 2
void foo(T x)
{
  // l33t coding skillz
  while (*x-- = zap()) { /* ... */ }
}

সুতরাং, constঘোষণা (শিরোলেখ) এ কখনও না রাখার সহজ নিয়মটি অনুসরণ করুন এবং যদি আপনি ভেরিয়েবলটি পরিবর্তন করতে না চান বা এটি সংজ্ঞা (প্রয়োগকরণ) এ রাখুন।


5
আমি এটির সাথে একমত - তবে ঘোষণা এবং সংজ্ঞাটি আলাদা করার ধারণা নিয়ে আমি কিছুটা অস্বস্তি বোধ করছি। অন্যান্য বিষয়গুলির জন্য const, ঘোষণা এবং (সংজ্ঞাটির মূল অংশ) সাধারণত অভিন্ন হতে চলেছে।
কিথ থম্পসন

@ কিথথম্পসন: আচ্ছা, আপনি না চাইলে আপনাকে এটি করতে হবে না। শুধু constঘোষণায় রাখবেন না। আপনি যদি বাস্তবায়নে যোগ্যতা যোগ করতে চান তবে এটি সম্পূর্ণরূপে আপনার।
কেরেক এসবি

1
যেমনটি আমি বলেছি, আমি সম্মত হই যে constঘোষণাটি দেওয়া কিন্তু সংজ্ঞাটি বোঝায় না। এটি কেবল ভাষার এক গণ্ডগোলের মতো অনুভব করে যে এটিই একমাত্র ক্ষেত্রে যেখানে ঘোষণা এবং সংজ্ঞাটিকে অ-অভিন্ন করে তোলে তা বোঝায়। (অবশ্যই এটি সি এর একমাত্র গতিবাচক))
কিথ থম্পসন

16

শীর্ষ স্তরের কনস্ট কোয়ালিফায়ারকে ঘোষণাগুলিতে বাতিল করা হয়, সুতরাং প্রশ্নের ঘোষণাগুলি ঠিক একই ফাংশনটি ঘোষণা করে। অন্যদিকে, সংজ্ঞাতে (বাস্তবায়ন) সংকলকটি যাচাই করবে যে আপনি যদি পয়েন্টারটিকে কনস্ট হিসাবে চিহ্নিত করেন তবে এটি ফাংশনের মূল অংশের অভ্যন্তরে পরিবর্তিত হয় না।


আমি এটা জানতাম না। তাই আমি যদি শূন্য ফু (ওভারট * কনস পিটিআর) অকার্যকর foo (int * t পিটিআর) দিয়ে ওভারলোড করার চেষ্টা করি তবে আমি একটি সংকলক ত্রুটি পেয়ে যাব। ধন্যবাদ!
আর রুইজ

@ R.Ruiz। আপনার হ্রাস যদি অকার্যকর foo (int * t ptr) হয় এবং আপনার সংজ্ঞাটি শূন্য foo (int * const ptr) হয় তবে আপনি একটি সংকলক ত্রুটি পাবেন না।
ট্রেভর হিকি

1
@ ট্র্যাভের হিক্কি তারা ... তবে তারা ভাবেন এমন কারণে নয়। int* t ptrএকটি সিনট্যাক্স ত্রুটি। তা ছাড়া, ওভারলোডিংয়ের জন্য দু'টি একরকম।
আন্ডারস্কোর_

14

আপনি ঠিক বলেছেন, কলারের পক্ষে একেবারেই কোনও পার্থক্য নেই। তবে ফাংশনটির লেখকের জন্য এটি একটি সুরক্ষা জাল হতে পারে "ঠিক আছে, আমার নিশ্চিত হওয়া দরকার যে আমি এই বিষয়টিকে ভুল জিনিসটির দিকে না ফেলে"। খুব দরকারী না তবে অকেজোও নয়।

এটি মূলত int const the_answer = 42আপনার প্রোগ্রামে থাকার মতোই ।


1
তারা যেখানে এটি নির্দেশ করে তাতে কী আসে যায়, এটি স্ট্যাকের উপর বরাদ্দকৃত একটি পয়েন্টার? ফাংশন যে গোলযোগ করতে পারে না। পয়েন্টার-টু-পয়েন্টারগুলির সাথে ডিল করার সময় কেবল পঠনযোগ্য পয়েন্টারগুলি ব্যবহার করতে এটি আরও বেশি জ্ঞান অর্জন করে। এটি ইন্ট কনস্টের মতো জিনিস নয় ! আমি কেবল সেই বিভ্রান্তিমূলক বক্তব্যের জন্য এটিকে হ্রাস করব। const intএবং int constহয় সমতুল্য, যখন const int*এবং int* constদুটি ভিন্ন অর্থ আছে!
লুন্ডিন

1
@ লুন্ডিন ধরুন ফাংশনটি বড় এবং এতে অন্যান্য জিনিস রয়েছে। দুর্ভাগ্যক্রমে কেউ এটিকে অন্য কোনও কিছুতে (ফাংশনের স্ট্যাকের উপরে) নির্দেশ করতে পারে। এটি কলারের জন্য সমস্যাযুক্ত নয় তবে অবশ্যই কলির পক্ষে হতে পারে। আমি আমার বক্তব্যগুলিতে বিভ্রান্তিকর কিছুই দেখতে পাচ্ছি না: " ফাংশনের লেখকের পক্ষে এটি একটি সুরক্ষার জাল হতে পারে"।
cnicutar

1
@ লন্ডিন int constঅংশ সম্পর্কে ; আমি কনস্টের আগে টাইপটি রাখছি (এটি অস্বাভাবিক মনে হয়) কিছুক্ষণের জন্য এবং আমি পার্থক্য সম্পর্কে অবগত। এই নিবন্ধটি দরকারী প্রমাণ হতে পারে। আমি অবশ্য এই স্টাইলে স্যুইচ করার জন্য কিছুটা আলাদা কারণ ছিল।
cnicutar

1
ঠিক আছে. আমি অন্য কারও ক্ষেত্রে আমার নিজের একটি দীর্ঘ উত্তর-উত্তর লিখেছিলাম তবে আপনি এবং আমি এই পোস্টটি পড়ছি। আমি একটি যুক্তিও অন্তর্ভুক্ত করেছি কেন ইন্ট কনস্টটি খারাপ স্টাইল এবং কনস্ট ইন্ট ভাল স্টাইল।
লন্ডিন

লন্ডিন, আমিও পড়ছি! আমি সম্মত কনট int যদিও ভাল শৈলী। @ কনিকুতার, লন্ডিনের প্রতি আপনার প্রথম প্রতিক্রিয়া হ'ল আমি যখন এই প্রশ্নটি জমা দিয়েছিলাম তখন আমি যা খুঁজছিলাম। সুতরাং সমস্যাটি কলারের মধ্যে নেই (যেমন আমি নির্বোধভাবে ভেবেছিলাম), তবে কনস্টটি কলির জন্য একটি আশ্বাস। আমি এই ধারণাটি পছন্দ করি, আপনাকে ধন্যবাদ।
আর রুইজ

14

মূলশব্দটিতে অনেক কিছুই রয়েছে const, এটি একটি জটিল বিষয়। সাধারণত, আপনার প্রোগ্রামে প্রচুর কনস্ট যুক্ত করা ভাল প্রোগ্রামিং অনুশীলন হিসাবে বিবেচিত হয়, "কনস্ট সংশোধন" জন্য ওয়েব অনুসন্ধান করুন এবং আপনি সে সম্পর্কে প্রচুর তথ্য পাবেন।

কনস্ট কীওয়ার্ডটি তথাকথিত "টাইপ কোয়ালিফায়ার", অন্যরা হ'ল volatileএবং restrict। কমপক্ষে অস্থিরতা কনস্টের হিসাবে একই (বিভ্রান্তিকর) বিধি অনুসরণ করে।


প্রথমত, কনস্ট কিওয়ার্ড দুটি উদ্দেশ্য করে। সর্বাধিক সুস্পষ্ট একটি হ'ল ডেটা (এবং পয়েন্টার) কেবলমাত্র পঠনযোগ্য করে তাদের উদ্দেশ্যমূলক বা দুর্ঘটনাজনিত অপব্যবহার থেকে রক্ষা করা। কোনও কনট কনটেবল পরিবর্তন করার কোনও প্রচেষ্টা সংকলক দ্বারা সংকলন সময়ে স্পট করা হবে।

তবে কেবল পঠনযোগ্য মেমরি সহ যে কোনও সিস্টেমে আরও একটি উদ্দেশ্য রয়েছে, যথা এই ধরণের মেমরির ভিতরে একটি নির্দিষ্ট পরিবর্তনশীল বরাদ্দ করা হয় তা নিশ্চিত করা - এটি EEPROM বা উদাহরণস্বরূপ ফ্ল্যাশ হতে পারে। এগুলি অ-উদ্বায়ী স্মৃতি, এনভিএম হিসাবে পরিচিত। এনভিএম-তে বরাদ্দকৃত একটি ভেরিয়েবল অবশ্যই অবশ্যই কনস্টেবল ভেরিয়েবলের সমস্ত নিয়ম অনুসরণ করবে।

constকীওয়ার্ডটি ব্যবহারের বিভিন্ন উপায় রয়েছে :

ধ্রুব পরিবর্তনশীল ঘোষণা করুন।

এটি হয় হিসাবে করা যেতে পারে

const int X=1; or
int const X=1;

এই দুটি রূপ সম্পূর্ণ সমতুল্য । পরবর্তী শৈলীটি খারাপ শৈলী হিসাবে বিবেচিত হয় এবং এটি ব্যবহার করা উচিত নয়।

দ্বিতীয় সারিকে খারাপ শৈলী হিসাবে বিবেচনা করার কারণ সম্ভবত স্ট্যাটিক এবং এক্সটার্নের মতো "স্টোরেজ-ক্লাস স্পেসিফায়ারস" হিসাবেও ঘোষণা করা যেতে পারে প্রকৃত প্রকারের পরেও করাint static But সি কমিটি দ্বারা (আইএসও 9899 এন 1539 খসড়া, 6.11.5)। সুতরাং, ধারাবাহিকতার জন্য যে কোনও একটির জন্য টাইপ কোয়ালিফায়ার লেখা উচিত নয়। এটি পাঠককে যেভাবেই বিভ্রান্ত করা ছাড়া অন্য কোনও উদ্দেশ্যে কাজ করে না।

একটি ধ্রুবক পরিবর্তনশীল একটি পয়েন্টার ঘোষণা।

const int* ptr = &X;

এর অর্থ হল যে 'এক্স' এর সামগ্রীগুলি পরিবর্তন করা যায় না cannot এটি সাধারণত আপনি "পয়েন্ট সংশোধন" জন্য ফাংশন প্যারামিটার অংশ হিসাবে এই জাতীয় পয়েন্টার হিসাবে ঘোষণা। কারণ 'এক্স' কে আসলে কনস্ট হিসাবে ঘোষণা করতে হবে না, এটি কোনও পরিবর্তনশীল হতে পারে। অন্য কথায় আপনি সর্বদা কনস্টে পরিবর্তনশীল "আপগ্রেড" করতে পারেন। প্রযুক্তিগতভাবে, সি স্পষ্টত টাইপকাস্ট দ্বারা স্থির পরিবর্তনযোগ্য থেকে কমকেও ডাউনগ্রেড করার অনুমতি দেয় তবে এটি করা খারাপ প্রোগ্রাম হিসাবে বিবেচিত হয় এবং সংকলকরা সাধারণত এর বিরুদ্ধে সতর্কতা দেয়।

ধ্রুবক পয়েন্টার ঘোষণা করুন

int* const ptr = &X;

এর অর্থ পয়েন্টারটি নিজেই ধ্রুবক। এটি কী নির্দেশ করে তা আপনি সংশোধন করতে পারেন তবে পয়েন্টারটি নিজেই সংশোধন করতে পারবেন না। এটির অনেকগুলি ব্যবহার নেই, কয়েকটি রয়েছে যেমন একটি পয়েন্টার-পয়েন্ট-এ (পয়েন্টার-টু-পয়েন্টার) কোনও ফাংশনের প্যারামিটার হিসাবে পাস করার সময় এটির ঠিকানা পরিবর্তন করা হয় না তা নিশ্চিত করে। আপনাকে এর মতো খুব বেশি পঠনযোগ্য কিছু লিখতে হবে:

void func (int*const* ptrptr)

আমি সন্দেহ করি অনেক সি প্রোগ্রামাররা সেখানে কনস্ট এবং * পেতে পারেন। আমি জানি আমি না - আমাকে জিসিসির সাথে চেক করতে হয়েছিল। আমি মনে করি সে কারণেই আপনি পয়েন্টার-টু-পয়েন্টারের জন্য সিনট্যাক্সটি খুব কমই দেখতে পান, যদিও এটি ভাল প্রোগ্রামিং অনুশীলন হিসাবে বিবেচিত হয়।

পয়েন্টার ভেরিয়েবল নিজেই কেবল পঠনযোগ্য মেমরিতে ঘোষিত হয়েছে তা নিশ্চিত করতে কনস্ট্যান্ট পয়েন্টারগুলিও ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ আপনি পয়েন্টার ভিত্তিক কিছু সারণী ঘোষণা করতে এবং এটি এনভিএমে বরাদ্দ করতে চাইতে পারেন।

এবং অবশ্যই, অন্যান্য উত্তর দ্বারা নির্দেশিত হিসাবে, ধ্রুবক পয়েন্টারগুলি "কনস্ট সংশোধন" প্রয়োগ করতেও ব্যবহার করা যেতে পারে।

ধ্রুব ডেটাতে একটি ধ্রুবক পয়েন্টার ঘোষণা করুন

const int* const ptr=&X;

এটি উভয়রই সমস্ত বৈশিষ্ট্যের সাথে সম্মিলিতভাবে বর্ণিত দুটি নির্দেশক প্রকার।

কেবল পঠনযোগ্য সদস্য ফাংশন ঘোষণা করুন (সি ++)

যেহেতু এটি সি ++ ট্যাগ করা হয়েছে, আমার এটিও উল্লেখ করা উচিত যে আপনি কোনও শ্রেণীর সদস্য ফাংশন কনস্ট হিসাবে ঘোষণা করতে পারেন। এর অর্থ এই যে ফাংশনটি ক্লাসের অন্য কোনও সদস্যকে যখন ডাকা হয় তখন তাকে সংশোধন করার অনুমতি দেওয়া হয় না, যা উভয়ই ক্লাসের প্রোগ্রামারটিকে দুর্ঘটনাজনিত ত্রুটি থেকে বাধা দেয় তবে সদস্য ফাংশনটির কলারকে জানিয়ে দেয় যে তারা কোনও গোলমাল করবে না won't এটি কল করে আপ। বাক্য গঠনটি হ'ল:

void MyClass::func (void) const;

8

... আজ আমি বুঝতে পেরেছি যে পয়েন্টারগুলি ফাংশনগুলিতে মান দ্বারা প্রেরণ করা হয়, যা উপলব্ধি করে।

(imo) এটি ডিফল্ট হিসাবে সত্যই বোঝায় না। আরও বুদ্ধিমান ডিফল্ট হ'ল নন-পুনঃসাইনযোগ্য পয়েন্টার ( int* const arg) হিসাবে পাস করা । এটি হ'ল, আমি পছন্দ করতাম যে যুক্তিগুলি সুস্পষ্টভাবে কনস্ট হিসাবে ঘোষিত হওয়ায় পয়েন্টারগুলি পাস হয়েছিল।

তাহলে কনস্টের সুবিধা কী?

সুবিধাটি হ'ল এটি যথেষ্ট সহজ এবং কখনও কখনও অস্পষ্ট আপনি যখন যুক্তিটির নির্দেশিত ঠিকানাটি সংশোধন করেন, যখন আপনি কোনও বাগটি প্রবর্তন করতে পারেন যখন এটি সহজেই স্থির হয় না। ঠিকানা পরিবর্তন করা atypical হয়। আপনার উদ্দেশ্যটি যদি ঠিকানাটি পরিবর্তন করতে হয় তবে একটি স্থানীয় ভেরিয়েবল তৈরি করা আরও পরিষ্কার। পাশাপাশি, কাঁচা পয়েন্টার ম্যানিপুলেশন বাগগুলি প্রবর্তন করার একটি সহজ উপায়।

সুতরাং স্থির ঠিকানা দিয়ে পাস করা এবং আপনি যখন যুক্তিটির দিকে ইঙ্গিতটি নির্দেশ করে ঠিকানাটি পরিবর্তন করতে চান তখন একটি অনুলিপি তৈরি করা (সেইসব কল্পিত ক্ষেত্রে) অনুলিপি করা আরও স্পষ্ট:

void func(int* const arg) {
    int* a(arg);
    ...
    *a++ = value;
}

স্থানীয় যোগ করা ভার্চুয়ালি মুক্ত, এবং এটি ত্রুটিগুলির সুযোগ হ্রাস করে, পাঠযোগ্যতার উন্নতি করার সময়।

উচ্চতর স্তরে: আপনি যদি অ্যারে হিসাবে আর্গুমেন্টটি চালাচ্ছেন তবে এটি সাধারণত পরিষ্কার হয়ে যায় এবং ক্লায়েন্টের পক্ষে কম ত্রুটিযুক্ত যুক্তিটি একটি ধারক / সংগ্রহ হিসাবে ঘোষণা করে।

সাধারণভাবে, মান, যুক্তি এবং ঠিকানাগুলিতে সংযোজন করা একটি ভাল ধারণা কারণ আপনি সর্বদা পার্শ্ব প্রতিক্রিয়াগুলি উপলব্ধি করতে পারেন না, যা সংকলকটি সুখে প্রয়োগ করে। অতএব, এটি অন্যান্য বেশ কয়েকটি ক্ষেত্রে যেমন কনস্টের মতো দরকারী তেমনি (যেমন প্রশ্নটি 'কেন আমি মানগুলি কেন ঘোষণা করব?') এর অনুরূপ। ভাগ্যক্রমে, আমাদের রেফারেন্সও রয়েছে, যা পুনরায় নিয়োগ দেওয়া যায় না।


4
এটি ডিফল্ট হওয়ার জন্য +1। বেশিরভাগ ভাষার মতো সি ++ এরও ভুল উপায়ে রয়েছে। কোনও constকীওয়ার্ড না রাখার পরিবর্তে এর একটি কীওয়ার্ড থাকা উচিত mutable(ভাল, এটির রয়েছে, তবে ভুল শব্দার্থক সহ)।
কনরাড রুডলফ

2
ডিফল্ট হিসাবে আকর্ষণীয় ধারণা কনস্ট। আপনার উত্তরের জন্য ধন্যবাদ!
আর রুইজ

6

আপনি যদি এম্বেড থাকা সিস্টেম বা ডিভাইস ড্রাইভার প্রোগ্রামিং করেন যেখানে মেমোরি ম্যাপযুক্ত ডিভাইস রয়েছে তবে 'কনস্ট' উভয় ফর্মই প্রায়শই ব্যবহৃত হয়, পয়েন্টারটিকে পুনরায় নিয়োগ করা থেকে বিরত রাখতে একটি (যেহেতু এটি একটি নির্দিষ্ট হার্ডওয়্যার ঠিকানার দিকে নির্দেশ করে) এবং পেরিফেরিয়াল এটি রেজিস্টার্ড এটি কেবল পঠনযোগ্য হার্ডওয়্যার রেজিস্ট্রেশন যা অন্য একটি কনস্টাল রানটাইম পরিবর্তে সংকলন সময়ে অনেক ত্রুটি সনাক্ত করবে।

একটি পঠনযোগ্য 16 বিট পেরিফেরিয়াল চিপ রেজিস্টার এর মতো দেখতে দেখতে কিছু হতে পারে:

static const unsigned short *const peripheral = (unsigned short *)0xfe0000UL;

তারপরে আপনি সমাবেশের ভাষাটি ব্যবহার না করেই সহজেই হার্ডওয়্যার রেজিস্টারটি পড়তে পারেন:

input_word = *peripheral;


5

int iVal = 10; int * const ipPtr = & iVal;

একটি সাধারণ কনস্ট ভেরিয়েবলের মতো, কনস্ট পয়েন্টারটি অবশ্যই ঘোষণার পরে একটি মানকে আরম্ভ করতে হবে, এবং এর মান পরিবর্তন করা যায় না।

এর অর্থ একটি কনস্টেন্ট পয়েন্টার সর্বদা একই মানের দিকে নির্দেশ করবে। উপরের ক্ষেত্রে, আইপিপিআরটি সর্বদা আইভালের ঠিকানার দিকে নির্দেশ করবে। তবে, যে মানটি নির্দেশ করা হচ্ছে তা এখনও নিরপেক্ষ, তাই পয়েন্টারটিকে অবনমিত করার মাধ্যমে মানটি চিহ্নিত করা সম্ভব:

* আইপিপিআর = 6; // অনুমোদিত, যেহেতু পিএনপিআরটি একটি নন-কনস্ট্যান্ট ইন্টিকে নির্দেশ করে


5

অন্য যে কোনও ধরণের সম্পর্কে একই প্রশ্ন জিজ্ঞাসা করা যেতে পারে (কেবল পয়েন্টার নয়):

/* Why is n const? */
const char *expand(const int n) {
    if (n == 1) return "one";
    if (n == 2) return "two";
    if (n == 3) return "three";
    return "many";
}

LOL, আপনি ঠিক বলেছেন। পয়েন্টারগুলির কেসটি আমার মনে আগে আসল কারণ আমি ভেবেছিলাম তারা বিশেষ, তবে এগুলি ঠিক অন্যান্য মান হিসাবে পাসওয়ার্ডের মতো।
আর রুইজ

5

আপনার প্রশ্নটি কেন কোনও ভেরিয়েবলকে কেবল কোনও ফাংশনে কনস্ট পয়েন্টার প্যারামিটার হিসাবে কনস্ট হিসাবে হিসাবে সংজ্ঞায়িত করে না সে সম্পর্কে আরও সত্য। আপনি যখন কোনও পরিবর্তনশীলকে ধ্রুবক হিসাবে সংজ্ঞায়িত করেন ঠিক একই নিয়মগুলি এখানে প্রয়োগ হয়, যদি এটির কার্যকারিতা বা সদস্য ভেরিয়েবল বা স্থানীয় ভেরিয়েবলের প্যারামিটার থাকে।

আপনার নির্দিষ্ট ক্ষেত্রে, কার্যকরীভাবে এটি অনেকগুলি ক্ষেত্রে যেমন পার্থক্য করে না যখন আপনি কোনও স্থানীয় ভেরিয়েবলকে কনস্ট হিসাবে ঘোষণা করেন তবে এটি কোনও বিধিনিষেধ তৈরি করে যে আপনি এই পরিবর্তনশীলটি পরিবর্তন করতে পারবেন না।


আপনার মন্তব্যটি বুঝতে পেরে আমার প্রশ্নটি কতটা নিরর্থক কারণ আপনি ঠিক বলেছেন: কনস্টের মতো অন্য কোনও পরামিতি থাকার মতোই এটি। এটি অকেজো মনে হতে পারে তবে প্রোগ্রামারকে এই সীমাবদ্ধতা রাখতে এবং বাগগুলি এড়াতে সহায়তা করার জন্য এটি রয়েছে
আর রুইজ।

4

কোনও ফাংশনে কনস্ট পয়েন্টারটি পাস করা কিছুটা অর্থবোধ করে না কারণ এটি যেভাবে মান দ্বারা পাস হবে। এটি কেবলমাত্র সেই জিনিসগুলির মধ্যে একটি যা সাধারণ ভাষার নকশা দ্বারা অনুমোদিত। এটি বোধগম্য নয় কারণ এটি নিষিদ্ধ করা কেবলমাত্র ভাষাটি নির্দিষ্ট করে তোলে। বড় করা হয়েছে।

আপনি যদি কোনও ফাংশনের ভিতরে থাকেন তবে এটি অবশ্যই অন্য একটি ক্ষেত্রে। একটি পয়েন্টার থাকা যা এটি নির্দেশ করে তা পরিবর্তন করতে পারে না এমন একটি জোর দেওয়া কোডটি পরিষ্কার করে তোলে।


4

আমার ধারণা একটি সুবিধা হ'ল এই পয়েন্টারটি পরিবর্তন করতে পারে না জেনে এই সংকলকটি ফাংশনের অভ্যন্তরে আরও আক্রমণাত্মক অপটিমাইজেশন করতে পারে।

এটি যেমন এড়ানো। এই পয়েন্টারটিকে একটি সাব-ফাংশনে পাস করা যা অ-কনস্ট্যান্ট পয়েন্টার রেফারেন্স গ্রহণ করে (এবং তাই পয়েন্টারটির মতো পরিবর্তন করতে পারে)void f(int *&p) ) তবে আমি সম্মত হই যে, এই ক্ষেত্রে দরকারীতা কিছুটা সীমাবদ্ধ।


অপ্টিমাইজেশনের জন্য +1। অন্তত বইগুলি সত্য বলেছে। আমি যা চাই তা হ'ল এই অপটিমাইজেশনগুলি হ'ল
আর রুইজ

4

যেখানে কনস্টেন্ট পয়েন্টার অত্যন্ত প্রযোজ্য তার উদাহরণ এইভাবে প্রদর্শিত হতে পারে। এটির ভিতরে ডায়নামিক অ্যারে সহ আপনার একটি শ্রেণি রয়েছে তা বিবেচনা করুন এবং আপনি অ্যারেতে ব্যবহারকারীর অ্যাক্সেসটি পাস করতে চান তবে পয়েন্টারটি পরিবর্তনের অধিকার না দিয়ে তাদের ছাড় দিন। বিবেচনা:

#include <new>
#include <string.h>

class TestA
{
    private:
        char *Array;
    public:
        TestA(){Array = NULL; Array = new (std::nothrow) char[20]; if(Array != NULL){ strcpy(Array,"Input data"); } }
        ~TestA(){if(Array != NULL){ delete [] Array;} }

        char * const GetArray(){ return Array; }
};

int main()
{
    TestA Temp;
    printf("%s\n",Temp.GetArray());
    Temp.GetArray()[0] = ' '; //You can still modify the chars in the array, user has access
    Temp.GetArray()[1] = ' '; 
    printf("%s\n",Temp.GetArray());
}

যা উত্পাদন করে:

ইনপুট ডেটা
ডেটা রাখে

তবে আমরা যদি এটি চেষ্টা করি:

int main()
{
    TestA Temp;
    printf("%s\n",Temp.GetArray());
    Temp.GetArray()[0] = ' ';
    Temp.GetArray()[1] = ' ';
    printf("%s\n",Temp.GetArray());
    Temp.GetArray() = NULL; //Bwuahahahaa attempt to set it to null
}

আমরা পেতে:

ত্রুটি: অ্যাসাইনমেন্টের বাম অপারেন্ড হিসাবে লভ্যালু প্রয়োজন // ড্র্যাট আবার বানচাল!

সুতরাং পরিষ্কারভাবে আমরা অ্যারের সামগ্রীগুলি সংশোধন করতে পারি, তবে অ্যারের পয়েন্টারটি নয়। আপনি যদি ব্যবহারকারীকে ফেরত দেওয়ার সময় পয়েন্টারটির একটি সামঞ্জস্যপূর্ণ অবস্থা থাকে তা নিশ্চিত করতে চান তবে ভাল। একটি ধরা আছে, যদিও:

int main()
{
    TestA Temp;
    printf("%s\n",Temp.GetArray());
    Temp.GetArray()[0] = ' ';
    Temp.GetArray()[1] = ' ';
    printf("%s\n",Temp.GetArray());
    delete [] Temp.GetArray(); //Bwuahaha this actually works!
}

আমরা এখনও পয়েন্টারের মেমরি রেফারেন্স মুছতে পারি, এমনকি যদি আমরা পয়েন্টারটি নিজেই পরিবর্তন করতে না পারি।

সুতরাং আপনি যদি মেমরির রেফারেন্সটি সর্বদা কোনও কিছুর দিকে নির্দেশ করতে চান (IE কখনই পরিবর্তিত হবে না, বর্তমানে কোনও রেফারেন্স কীভাবে কাজ করে তার অনুরূপ), তবে এটি অত্যন্ত প্রযোজ্য। আপনি যদি চান যে ব্যবহারকারীর সম্পূর্ণ অ্যাক্সেস রয়েছে এবং এটি সংশোধন করতে পারে তবে অ-কনস্ট্যান্ট আপনার জন্য।

সম্পাদনা:

রাইট-ভ্যালু অপারেন্ড হওয়ার কারণে গেটআর ()) নির্ধারণ করতে সক্ষম না হওয়ায় Okorz001 মন্তব্যটি উল্লেখ করার পরে, তার মন্তব্য সম্পূর্ণ সঠিক, তবে উপরেরটি এখনও প্রযোজ্য যদি আপনি পয়েন্টারের কোনও রেফারেন্স ফিরিয়ে দেন (আমি মনে করি আমি গেটআরিকে ধরেছিলাম একটি রেফারেন্স উল্লেখ করে), উদাহরণস্বরূপ:

class TestA
{
    private:
        char *Array;
    public:
        TestA(){Array = NULL; Array = new (std::nothrow) char[20]; if(Array != NULL){ strcpy(Array,"Input data"); } }
        ~TestA(){if(Array != NULL){ delete [] Array;} }

        char * const &GetArray(){ return Array; } //Note & reference operator
        char * &GetNonConstArray(){ return Array; } //Note non-const
};

int main()
{
    TestA Temp;
    Temp.GetArray() = NULL; //Returns error
    Temp.GetNonConstArray() = NULL; //Returns no error
}

প্রথমটিতে কোনও ত্রুটির ফলে ফিরে আসবে:

ত্রুটি: কেবলমাত্র পঠনযোগ্য স্থান 'টেম্প.টেষ্টা :: গেটআরে ()' এর কার্যভার

তবে দ্বিতীয়টি নীচে সম্ভাব্য পরিণতি সত্ত্বেও আনন্দের সাথে ঘটবে।

স্পষ্টতই, প্রশ্ন উত্থাপিত হবে 'আপনি কেন কোনও পয়েন্টারের কোনও রেফারেন্স ফিরিয়ে দিতে চান'? এমন বিরল উদাহরণ রয়েছে যেখানে আপনাকে প্রশ্নটির মূল পয়েন্টারে সরাসরি মেমরি (বা ডেটা) অর্পণ করতে হবে (উদাহরণস্বরূপ, আপনার নিজের মালেক / ফ্রি বা নতুন / ফ্রি ফ্রন্ট-এন্ড তৈরি করা), তবে সেই দৃষ্টান্তে এটি একটি অবিসংবাদী রেফারেন্স reference । কনস্টেন্ট পয়েন্টারের একটি রেফারেন্স আমি এমন পরিস্থিতিটি পাইনি যা এটির ওয়ারেন্ট দেয় (যদি না প্রত্যাবর্তনের ধরণের পরিবর্তে কনস্ট রেফারেন্স ভেরিয়েবল হিসাবে ঘোষণা করা যায়)?

আমাদের যদি কোনও ফাংশন থাকে যা কনস্ট পয়েন্টার গ্রহণ করে (বনাম একটি যা না করে) বিবেচনা করুন:

class TestA
{
    private:
        char *Array;
    public:
        TestA(){Array = NULL; Array = new (std::nothrow) char[20]; if(Array != NULL){ strcpy(Array,"Input data"); } }
        ~TestA(){if(Array != NULL){ delete [] Array;} }

        char * const &GetArray(){ return Array; }

        void ModifyArrayConst(char * const Data)
        {
            Data[1]; //This is okay, this refers to Data[1]
            Data--; //Produces an error. Don't want to Decrement that.
            printf("Const: %c\n",Data[1]);
        }

        void ModifyArrayNonConst(char * Data)
        {
            Data--; //Argh noo what are you doing?!
            Data[1]; //This is actually the same as 'Data[0]' because it's relative to Data's position
            printf("NonConst: %c\n",Data[1]);
        }
};

int main()
{
    TestA Temp;
    Temp.ModifyArrayNonConst("ABCD");
    Temp.ModifyArrayConst("ABCD");
}

কনস্টের ত্রুটিটি এইভাবে বার্তা দেয়:

ত্রুটি: কেবলমাত্র পঠনযোগ্য পরামিতি 'ডেটা' হ্রাস

যা আমরা সম্ভবত এটি করতে চাই না হিসাবে এটি ভাল, যদি না আমরা মন্তব্যগুলিতে চিহ্নিত সমস্যাগুলি তৈরি করতে চাই। যদি আমরা কনস্ট ফাংশনটির হ্রাস সম্পাদনা করি তবে নিম্নলিখিতটি ঘটে:

ননকনস্ট: এ কনস্ট্যান্ট:
বি

স্পষ্টতই, যদিও এ 'ডেটা [1]' হলেও এটি 'ডেটা [0]' হিসাবে বিবেচিত হচ্ছে কারণ ননকনস্ট পয়েন্টার হ্রাস ক্রিয়াকলাপের অনুমতি দিয়েছে। কনস্টের বাস্তবায়ন হওয়ার সাথে সাথে অন্য একজন লিখেছেন, সম্ভাব্য ত্রুটিটি হওয়ার আগে আমরা এটি ধরি।

অন্য একটি প্রধান বিবেচনা, হ'ল একটি কনস্ট পয়েন্টারটি সিউডো রেফারেন্স হিসাবে ব্যবহার করা যেতে পারে, এতে যে বিষয়টিকে রেফারেন্স নির্দেশ করে সেটি পরিবর্তন করা যায় না (এক আশ্চর্য, সম্ভবত এটি যদি এটি বাস্তবায়ন করা হত)। বিবেচনা:

int main()
{
    int A = 10;
    int * const B = &A;
    *B = 20; //This is permitted
    printf("%d\n",A);
    B = NULL; //This produces an error
}

সংকলনের চেষ্টা করার সময়, নিম্নলিখিত ত্রুটিটি উত্পাদন করে:

ত্রুটি: কেবলমাত্র পঠনযোগ্য 'বি' এর অ্যাসাইনমেন্ট

এ সম্পর্কিত একটি ধ্রুবক রেফারেন্স চাইলে কোনটি সম্ভবত খারাপ জিনিস। যদি B = NULLমন্তব্য করা হয়, সংকলকটি আনন্দের সাথে আমাদের সংশোধন করতে দেবে *Bএবং এ কারণেই এগুলি কৌতুকগুলির সাথে কার্যকর বলে মনে হচ্ছে না, তবে বিবেচনা করুন যে আপনি যদি এমন কোনও গ্রাফিকাল অ্যাপ্লিকেশনটির একক অবস্থান নিয়েছিলেন যেখানে আপনি অমার্জনযোগ্য পয়েন্টার চেয়েছিলেন যা আপনি পাশ করতে পারতেন কাছাকাছি.

এটির ব্যবহার পরিবর্তনশীল (অনিচ্ছাকৃত শ্লেষকে ক্ষমা করুন), তবে সঠিকভাবে ব্যবহৃত হয়েছে, প্রোগ্রামিংয়ে সহায়তা করার জন্য এটি বাক্সের অন্য একটি সরঞ্জাম।


2
Temp.GetArray() = NULLব্যর্থ হয় কারণ Temp.GetArray()এটি একটি নিয়ম, কারণ এটি কনস্ট্যান্ড-যোগ্য নয়। অতিরিক্ত হিসাবে, আমি বিশ্বাস করি কনস্ট-কোয়ালিফায়ার সমস্ত রিটার্নের ধরণ থেকে বাদ পড়ে।
অস্কার কর্জ

@ Okorz001: পরীক্ষার পরে, আপনি সত্যই সঠিক। যাইহোক, আপনি যদি পয়েন্টারের নিজেই কোনও রেফারেন্স ফিরিয়ে দেন তবে উপরেরটি প্রযোজ্য। আমি সেই অনুযায়ী আমার পোস্ট সম্পাদনা করব।
এসএসাইট 3

3

পয়েন্টারগুলির বিষয়ে বিশেষ কিছু নেই যেখানে আপনি কখনই সেগুলিকে কনস্ট্যান্ড করতে চান না। আপনার যেমন ক্লাস সদস্যের ধ্রুবক intমান থাকতে পারে তেমনি একই কারণে আপনার ধ্রুবক পয়েন্টারও থাকতে পারে: আপনি নিশ্চিত করতে চান যে কেউ কখনই ইঙ্গিত করা হচ্ছে তা পরিবর্তন করে না। সি ++ রেফারেন্সগুলি কিছুটা এটিকে সম্বোধন করে তবে পয়েন্টার আচরণটি সি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত is



3

যে কোনও ভেরিয়েবল ঘোষণার প্রকার যেমন-
(১) ধ্রুবক ভেরিয়েবল ঘোষণা করা।
DataType const varibleName;

 int const x;
    x=4; //you can assign its value only One time
(2) একটি ধ্রুবক ভেরিয়েবলের জন্য একটি পয়েন্টার ঘোষণা করুন
const dataType* PointerVaribleName=&X;
 const int* ptr = &X;
     //Here pointer variable refer contents of 'X' that is const Such that its cannot be modified
dataType* const PointerVaribleName=&X;
 int* const ptr = &X;
     //Here pointer variable itself is constant  Such that value of 'X'  can be modified But pointer can't be modified


আমরা যখন তার আসল মান পরিবর্তন করতে চাই না তখন আমরা একটি যুক্তি হিসাবে একটি ফাংশনে
কনস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.