تفاوت ورودی و خروجی در C
و C++
مثل بسیاری از تفاوتهای دیگهی این دو زبان برنامهنویسی برمی گرده به ساختیافته بودن C
و شیگرا بودن C++
.
در C
توابع ورودی و خروجی (مشخصاً scanf
و printf
) فاصلهی بسیار کمی با دستورات ورودی و خروجی ماشین داره و تقریباً بدون فاصله این توابع دستورات ورودی و خروجی ماشین رو فراخوانی میکنن.
int x = 0;
scanf("%d", &x);
این دستور مستقیماً جریان (stream
) ها رو مورد دسترسی قرار میده. یا به صورت مشابه
char c = 'a';
printf("sala%c", c);
در صورتی که با دستورات ماشین آشنایی داشته باشین متوجه میشین که شکل ورود و خروج مقادیر به جریان بسیار نزدیک به زبان ماشین هست.
در ورودی و خروجی استاندارد C++
این روند به صورت مستقیم وجود نداره. مثلاً
int x = 10;
cout<<x;
در اینجا ما از شی (objetc
) ای به نام cout
استفاده میکنیم تا مقادیر رو به جریان خروجی بفرستیم. cout
شیای از کلاس ostream
هست که وظیفهش برقراری ارتباط با خروجی استاندارده. به صورت پیشفرض cout
وظیفهی برقراری ارتباط با مانیتور رو داره.
میتونین این طور در نظر بگیرین که کلاسی به نام ostream
داریم که عملگری به نام <<
در اون پیادهسازی شده که یکی از سربارگذاریهای این عملگر برای نوع دادهی int
هست.
class ostream
{
public:
...
return_type operator<<(int x)
{
...
}
};
int main()
{
int x = 10;
ostream cout;
cout<<x;
return 0;
}
در این صورت یه سربارگذاری باید برای یک نوع دادهی دیگه هم انجام بشه. مثلاً برای char
class ostream
{
public:
...
return_type operator<<(char c)
{
...
}
};
ولی موضوع به این سادگی نیست. خود کلاس ostream
یک کلاس مشتق شده از کلاس ios
هست که ورودی و خروجیهای استاندارد رو پیادهسازی میکنه. همهی کلاسهای ورودی و خروجی استاندارد از این کلاس مشتق میشن
class ostream : public ios ...
اما باز هم یک گام دیگه مونده. همهی ورودی و خروجیها که استاندارد نیستن. بنابراین یک کلاس عمومیتر ios_base
هم وجود داره.
class ios : public ios_base ...
در حقیقت جریان به صورت دقیق جریان اصلی در این کلاس قرار میگیره و به کلاسهای بعدی به ارث میرسه.
بنابراین با استفاده از روش شیگرایی یک مکانیزم برای ورودی و خروجی پیادهسازی شده که مزایا و معایب خودش را داره.
این اصل و ریشهی تفاوت ورودی و خروجی C
و C++
اما پاسخ به سوال دوم هم مشخص شد. به این دلیل استفاده از ورودی و خروجی C
در C++
ممکنه که شیگرایی میتونه از شکل تابعی ساختیافته بودن C
استفاده کنه و برعکسش به این دلیل ممکن نیست که در C
شیگرایی نداریم تا بتونه از ورودی و خروجی استاندارد C++
استفاده کنه.
هیچ پژوهش انسانی نمیتواند ادعای علمی بودن داشته باشد، مگر اینکه از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)