عدم دادن ارور زمان نوشتن داخل شی const - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

عدم دادن ارور زمان نوشتن داخل شی const

+1 امتیاز

داخل کد زیر

#include <iostream>
#include <string>

using namespace std;

class PrintString {
public:
    PrintString(ostream &o = cout, char c = ' '): os(o), sep(c) {}
    void operator() (const string &s) const { os << s << sep; }
private:
    ostream &os;
    char sep;
};


int main() {
    const PrintString printer;

    printer("ABC");

    return 0;
}

operator()  و همین طور Printer بصورت Const تعریف شده .  

پس os << s << sep نباید کار کنه .

ولی کد بالا کامپایل میشه ! دلیل چیه ؟

سوال شده آبان 19, 1393  بوسیله ی Max (امتیاز 10)   1 1
دوباره تگ گذاری شد آبان 20, 1393 بوسیله ی BlueBlade
کد بالا مشکلی ندارد.

1 پاسخ

+1 امتیاز

دلیل کامپایل شدن با وجود const بودن operator() این هست که operator << مقدار  داخل os را تغییر نمیده و فقط چیزی که os بهش اشاره می کنه رو عوض می کنه .

برای روشن تر شدن موضوع این مثال رو در نظر بگیرید :

#include <iostream>

class A
{
public:
	A() :a(new int(5)){}

	void foo() const 
	{
		//khat zir error mide chon mikhahim meghdar a ro avz konim
		//va chon function const hast in emkan vojood nadare
		// a =new int(7); 
		std::cout << *a<<'\n';//5 chap mishe

		*a = 7;//ba vojood const boodan error  dade nemishe

		std::cout << *a;//7 chap mish
	}

private: 
	int *a;
};
int main()
{
	const A a;
	a.foo();
}

در مثال بالا a=new int(7 چون تابع const هست و می خواهیم مقدار a رو عوض کنیم ارور میده ولی 7=a* ارور نمیده چون مقداری که پوینتر به اون اشاره می کنه فقط عوض میشه و کاری به آدرسی که در a ذخیره شده نداریم .

داخل >> هم همین اتفاق میفته شاید به نظر برسه >> در حال نوشتن داخل کلاس هست و چون تابع const هست باید ارور بده ولی این اتفاق نمیفته چون >> فقط مقداری که پوینتر درون ostream هست رو عوض می کنه و کاری به  خود متغیر های عضو کلاس در ostream نداره .

پاسخ داده شده آبان 20, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
...