SlideShare a Scribd company logo
1 of 13
 Modularity
 Namespace
 Error handling
Declaration‫و‬Definition‫باهم‬ ‫همراه‬
Declaration‫از‬ ‫جدا‬Definition
Declaration‫معادل‬Interface‫است‬
Definition‫معادل‬Implementation‫است‬
1. // The square root function takes a double and returns a double
2. double sqrt(double);
3.
4. class Vector
5. {
6. public:
7. Vector(int s);
8. double& operator[](int i);
9. int size();
10.
11. private:
12. double* elem; // elem points to an array of sz doubles
13. int sz;
14. };
1. double sqrt(double d) // Definition of sqrt()
2. {
3. // ... algorithm as found in math textbook ...
4. }
5.
6. Vector::Vector(int s) //Definition of the constructor
7. : elem(new double[s]), sz(s) // Initialize members
8. {
9. }
10.
11. double& Vector::operator[](int i)// Definition of subscripting
12. {
13. return elem[i];
14. }
15.
16. int Vector::size() // Definition of size()
17. {
18. return sz;
19. }
1. class Vector
2. {
3. public:
4. Vector(int s);
5. double& operator[](int i);
6. int size();
7.
8. private:
9. double* elem;
10. int sz;
11. };
1. Vector::Vector(int s)
2. : elem(new double[s]), sz(s)
3. {
4. }
5.
6. double& Vector::operator[](int i)
7. {
8. return elem[i];
9. }
10.
11. int Vector::size()
12. {
13. return sz;
14. }
1. #include "Vector.h"
2. #include <cmath>
3. using namespace std;
4.
5. double sqrt_sum(Vector& v)
6. {
7. double sum = 0;
8. for (int i=0; i!=v.size(); ++i)
9. sum += sqrt(v[i]);
10. return sum;
11. }
Vector.h Vector.cpp User.cpp
1. namespace My_code
2. {
3. class complex { /* ... */ };
4. complex sqrt(complex);
5. // ...
6. int main();
7. }
8.
9. int My_code::main()
10. {
11. complex z(1, 2);
12. complex z2 = sqrt(z);
13. std::cout << '{' << z2.real() << ',' << z2.imag() << "}n";
14. // ...
15. }
16.
17. int main()
18. {
19. return My_code::main();
20. }
1. #include <exception>
2. using namespace std;
3.
3. double& Vector::operator[](int i)
4. {
5. if (i<0 || size()<=i)
6. throw out_of_range("Vector::operator[]");
7.
8. return elem[i];
9. }
1. void f(Vector& v)
2. {
3. // ...
4. // Exceptions here are handled by the handler defined below
5. try
6. {
7. v[v.size()] = 7;// Try to access beyond the end of v
8. }
9. catch (out_of_range) // OOPS: out_or_range error
10. {
11. // ... handle range error ...
12. }
13. // ...
14. }
1. Vector v(-27);
2.
3. Vector::Vector(int s)
4. {
5. if (s<0) throw length_error();
6. elem = new double[s];
7. sz = s;
8. }
1. void test()
2. {
3. try {
4. Vector v(-27);
5. }
6. catch (std::length_error) {
7. // Handle negative size
8. }
9. catch (std::bad_alloc) {
10. // Handle memory exhaustion
11. }
12. }
‫مقدمه‬
Type‫منطقی‬ ‫و‬ ‫ریاضی‬ ‫عملیاتهای‬ ‫و‬ ‫ثابتها‬ ‫و‬ ‫متغییرها‬ ‫و‬ ‫ها‬
‫ها‬ ‫حلقه‬ ‫و‬ ‫ها‬ ‫شرط‬
‫گر‬ ‫اشاره‬ ‫و‬ ‫آرایه‬
User-Defined Types
Modularity‫خطاها‬ ‫کردن‬ ‫اراره‬ ‫و‬ ‫نام‬ ‫فضای‬ ‫و‬

More Related Content

What's hot

Clang-tidy: путешествие внутрь AST C++
Clang-tidy: путешествие внутрь AST C++Clang-tidy: путешествие внутрь AST C++
Clang-tidy: путешествие внутрь AST C++corehard_by
 
C++14 reflections
C++14 reflections C++14 reflections
C++14 reflections corehard_by
 
modern javascript, unobtrusive javascript, jquery
modern javascript, unobtrusive javascript, jquerymodern javascript, unobtrusive javascript, jquery
modern javascript, unobtrusive javascript, jqueryAdam Zygadlewicz
 
c ++ informe Nº5 ucsm
c ++ informe Nº5 ucsmc ++ informe Nº5 ucsm
c ++ informe Nº5 ucsmIsaac Aquino
 
Создание новых объектов
Создание новых объектовСоздание новых объектов
Создание новых объектовConstantin Kichinsky
 
Prof.js
Prof.jsProf.js
Prof.jsuupaa
 
Verilog coding of mux 8 x1
Verilog coding of mux  8 x1Verilog coding of mux  8 x1
Verilog coding of mux 8 x1Rakesh kumar jha
 
Verilog coding of demux 8 x1
Verilog coding of demux  8 x1Verilog coding of demux  8 x1
Verilog coding of demux 8 x1Rakesh kumar jha
 
EJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOSEJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOSDarwin Durand
 
4.2. trasformers-filters-y-adapters
4.2. trasformers-filters-y-adapters4.2. trasformers-filters-y-adapters
4.2. trasformers-filters-y-adaptersxavazque2
 
Most Common JavaScript Mistakes
Most Common JavaScript MistakesMost Common JavaScript Mistakes
Most Common JavaScript MistakesYoann Gotthilf
 
203lab3
203lab3203lab3
203lab3BPurev
 

What's hot (20)

Clang-tidy: путешествие внутрь AST C++
Clang-tidy: путешествие внутрь AST C++Clang-tidy: путешествие внутрь AST C++
Clang-tidy: путешествие внутрь AST C++
 
C++14 reflections
C++14 reflections C++14 reflections
C++14 reflections
 
modern javascript, unobtrusive javascript, jquery
modern javascript, unobtrusive javascript, jquerymodern javascript, unobtrusive javascript, jquery
modern javascript, unobtrusive javascript, jquery
 
c ++ informe Nº5 ucsm
c ++ informe Nº5 ucsmc ++ informe Nº5 ucsm
c ++ informe Nº5 ucsm
 
Создание новых объектов
Создание новых объектовСоздание новых объектов
Создание новых объектов
 
Most
MostMost
Most
 
Php Meets Messagepack
Php Meets MessagepackPhp Meets Messagepack
Php Meets Messagepack
 
es6.concurrency()
es6.concurrency()es6.concurrency()
es6.concurrency()
 
Kruskal algorithm
Kruskal algorithmKruskal algorithm
Kruskal algorithm
 
Testování prakticky
Testování praktickyTestování prakticky
Testování prakticky
 
Prof.js
Prof.jsProf.js
Prof.js
 
Verilog coding of mux 8 x1
Verilog coding of mux  8 x1Verilog coding of mux  8 x1
Verilog coding of mux 8 x1
 
Verilog coding of demux 8 x1
Verilog coding of demux  8 x1Verilog coding of demux  8 x1
Verilog coding of demux 8 x1
 
Monads
MonadsMonads
Monads
 
Lenguaje de programación
Lenguaje de programaciónLenguaje de programación
Lenguaje de programación
 
Lenguaje de programación
Lenguaje de programaciónLenguaje de programación
Lenguaje de programación
 
EJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOSEJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOS
 
4.2. trasformers-filters-y-adapters
4.2. trasformers-filters-y-adapters4.2. trasformers-filters-y-adapters
4.2. trasformers-filters-y-adapters
 
Most Common JavaScript Mistakes
Most Common JavaScript MistakesMost Common JavaScript Mistakes
Most Common JavaScript Mistakes
 
203lab3
203lab3203lab3
203lab3
 

More from Vahid Heidari

17. thread and deadlock
17. thread and deadlock17. thread and deadlock
17. thread and deadlockVahid Heidari
 
15. map, unordered map, algorithms
15. map, unordered map, algorithms15. map, unordered map, algorithms
15. map, unordered map, algorithmsVahid Heidari
 
14. containers, vector, list
14. containers, vector, list14. containers, vector, list
14. containers, vector, listVahid Heidari
 
13. string, io streams
13. string, io streams13. string, io streams
13. string, io streamsVahid Heidari
 
12. standard library introduction
12. standard library introduction12. standard library introduction
12. standard library introductionVahid Heidari
 
9. class hierarchies
9. class hierarchies9. class hierarchies
9. class hierarchiesVahid Heidari
 
5. struct, class, enum
5. struct, class, enum5. struct, class, enum
5. struct, class, enumVahid Heidari
 
2. types, vars, arith, consts
2. types, vars, arith, consts2. types, vars, arith, consts
2. types, vars, arith, constsVahid Heidari
 
1. preface, hello world
1. preface, hello world1. preface, hello world
1. preface, hello worldVahid Heidari
 

More from Vahid Heidari (16)

18. utilities
18. utilities18. utilities
18. utilities
 
17. thread and deadlock
17. thread and deadlock17. thread and deadlock
17. thread and deadlock
 
16. smart pointers
16. smart pointers16. smart pointers
16. smart pointers
 
15. map, unordered map, algorithms
15. map, unordered map, algorithms15. map, unordered map, algorithms
15. map, unordered map, algorithms
 
14. containers, vector, list
14. containers, vector, list14. containers, vector, list
14. containers, vector, list
 
13. string, io streams
13. string, io streams13. string, io streams
13. string, io streams
 
12. standard library introduction
12. standard library introduction12. standard library introduction
12. standard library introduction
 
11. template
11. template11. template
11. template
 
10. copy and move
10. copy and move10. copy and move
10. copy and move
 
9. class hierarchies
9. class hierarchies9. class hierarchies
9. class hierarchies
 
8. abstract types
8. abstract types8. abstract types
8. abstract types
 
5. struct, class, enum
5. struct, class, enum5. struct, class, enum
5. struct, class, enum
 
4. pointers, arrays
4. pointers, arrays4. pointers, arrays
4. pointers, arrays
 
3. tests, loops
3. tests, loops3. tests, loops
3. tests, loops
 
2. types, vars, arith, consts
2. types, vars, arith, consts2. types, vars, arith, consts
2. types, vars, arith, consts
 
1. preface, hello world
1. preface, hello world1. preface, hello world
1. preface, hello world
 

6. separation, namespace, error

  • 1.
  • 4. 1. // The square root function takes a double and returns a double 2. double sqrt(double); 3. 4. class Vector 5. { 6. public: 7. Vector(int s); 8. double& operator[](int i); 9. int size(); 10. 11. private: 12. double* elem; // elem points to an array of sz doubles 13. int sz; 14. };
  • 5. 1. double sqrt(double d) // Definition of sqrt() 2. { 3. // ... algorithm as found in math textbook ... 4. } 5. 6. Vector::Vector(int s) //Definition of the constructor 7. : elem(new double[s]), sz(s) // Initialize members 8. { 9. } 10. 11. double& Vector::operator[](int i)// Definition of subscripting 12. { 13. return elem[i]; 14. } 15. 16. int Vector::size() // Definition of size() 17. { 18. return sz; 19. }
  • 6. 1. class Vector 2. { 3. public: 4. Vector(int s); 5. double& operator[](int i); 6. int size(); 7. 8. private: 9. double* elem; 10. int sz; 11. }; 1. Vector::Vector(int s) 2. : elem(new double[s]), sz(s) 3. { 4. } 5. 6. double& Vector::operator[](int i) 7. { 8. return elem[i]; 9. } 10. 11. int Vector::size() 12. { 13. return sz; 14. } 1. #include "Vector.h" 2. #include <cmath> 3. using namespace std; 4. 5. double sqrt_sum(Vector& v) 6. { 7. double sum = 0; 8. for (int i=0; i!=v.size(); ++i) 9. sum += sqrt(v[i]); 10. return sum; 11. } Vector.h Vector.cpp User.cpp
  • 7.
  • 8. 1. namespace My_code 2. { 3. class complex { /* ... */ }; 4. complex sqrt(complex); 5. // ... 6. int main(); 7. } 8. 9. int My_code::main() 10. { 11. complex z(1, 2); 12. complex z2 = sqrt(z); 13. std::cout << '{' << z2.real() << ',' << z2.imag() << "}n"; 14. // ... 15. } 16. 17. int main() 18. { 19. return My_code::main(); 20. }
  • 9. 1. #include <exception> 2. using namespace std; 3. 3. double& Vector::operator[](int i) 4. { 5. if (i<0 || size()<=i) 6. throw out_of_range("Vector::operator[]"); 7. 8. return elem[i]; 9. }
  • 10. 1. void f(Vector& v) 2. { 3. // ... 4. // Exceptions here are handled by the handler defined below 5. try 6. { 7. v[v.size()] = 7;// Try to access beyond the end of v 8. } 9. catch (out_of_range) // OOPS: out_or_range error 10. { 11. // ... handle range error ... 12. } 13. // ... 14. }
  • 11. 1. Vector v(-27); 2. 3. Vector::Vector(int s) 4. { 5. if (s<0) throw length_error(); 6. elem = new double[s]; 7. sz = s; 8. }
  • 12. 1. void test() 2. { 3. try { 4. Vector v(-27); 5. } 6. catch (std::length_error) { 7. // Handle negative size 8. } 9. catch (std::bad_alloc) { 10. // Handle memory exhaustion 11. } 12. }
  • 13. ‫مقدمه‬ Type‫منطقی‬ ‫و‬ ‫ریاضی‬ ‫عملیاتهای‬ ‫و‬ ‫ثابتها‬ ‫و‬ ‫متغییرها‬ ‫و‬ ‫ها‬ ‫ها‬ ‫حلقه‬ ‫و‬ ‫ها‬ ‫شرط‬ ‫گر‬ ‫اشاره‬ ‫و‬ ‫آرایه‬ User-Defined Types Modularity‫خطاها‬ ‫کردن‬ ‫اراره‬ ‫و‬ ‫نام‬ ‫فضای‬ ‫و‬

Editor's Notes

  1. در این ویدیو در مورد ماژولاریتی صحبت می کنیم و راههایی که C++ برای این کار در اختیار ما میذاره رو شرح میدم. فضای نام یک از راههای ایجاد ماژولاریتی رو توضیح میدم و مدل اداره کردن خطا در C++ رو می گم.
  2. تا اینجا هر مثالی از تابع ها متغییر ها و کلاسها دیدیم Declaration و Definition همراه هم بودند. این مدل شبیه مدل زبانهای Java و C# هست. اما C++ اجازه میده Declaration و Definition رو از هم جدا کنیم. در واقع Declaration یا تعریف تابع؛ متغییر و یا کلاس رو بهش Interface یا واسط میگیم. و Definition رو Implementation یا پیاده سازی می گیم. ماژولار کردن برنامه ها با جدا کردن Declaration از Definition انجام میشه.
  3. مدلی که C++ برای توسعه برنامه ها ارائه میده به این صورته که برنامه ها رو به قسمتهای جدا جدا تقسیم کنیم و هر قسمت رو جداگانه توسعه بدیم. کلید اصلی برای این کار اینه که روابط بین این قسمتها رو دقیق مشخص کنیم. یک راه اینه که با استفاده از declarationها interface تعریف کنیم. Interface همون رابط یا واسطی هست که امکان میده برنامه ها رو به قسمت های مختلف تقسیم کنیم. یه مثال از declaration ببینیم. خط 2 یک declaration از تابع sqrt میبینیم. تفاوتش با توابعی که قبلا دیدیم اینه که بدنه نداره و یک سمی کلون تهش گذاشتیم. خط 4 تا 14 هم یک declaration از کلاس vector می بینید. تمام متدهای کلاس بدون بدنه هستند و فقط تعریفشون هست. به اصطلاح به این نوع declaration میگیم امضای تابع. در امضای تابع فقط اسم تابع , نوع ورودیهاش و نوع خروجی رو مشخص می کنیم و بدنه ی تابع رو اینجا تعریف نمی کنیم و یه جای دیگه اون رو نوشتیم.
  4. بدنه ی تابع sqrt و متد های کلاس رو در این مثال می بینیم. به بدنه ی تابع ها و متد ها که یه جای دیگه تعریف شدن definition یا پیاده سازی می گیم. برای مشخص کردن پیاده سازی تابع باید اسم اون تابع رو بنویسیم و ورودی خروجی هاش رو دقیقا مثل declaration اون بنویسیم و بدنه ی اون تابع رو بنویسیم و داخل اون عملیاتی که تابع انجام میده رو بنویسیم. برای متدهای کلاس هم مشابه تابع عمل می کنیم با این فرق که باید نام کلاس رو هم مشخص کنیم و با یک :: به اسم متد وصل کنیم. این :: یک اپراتور هست به نام resolution و مشخص می کنه که اسکوپ ما چیه. این اپراتور رو قبلا دیده بودیم و برای cout ازش استفاده کرده بودیم.
  5. قدم بعدی بعد از جدا کردن Declaration از Definition ؛ برای ماژولار سازی برنامه ها اینه که کامپایل شدن قسمتهای مختلف برنامه رو هم از هم جدا کنیم. برای این کار باید Declarationها رو در Source fileهای جدا بذاریم و Definitionها رو هم در source file های جدا بنویسیم. در شکل می بینید که Decleration کلاس Vector رو در Vector.h گذاشتیم. به فایلهایی که پسوند .h دارن Header file میگیم و هر کسی که میخواد از Vector استفاده کنه باید Vector.h رو در ابتدای برنامش اونو Include کنه تا بتونه به Interface کلاس Vector دسترسی داشته باشه. Definition متدهای Vector رو در Vector.cpp گذاشتیم. و جایی که از کلاس Vector استفاده می شه رو هم در یک فایل جدا به نام User.cpp گذاشتیم.
  6. در این اسلاید هم رابطه ی بین این فایلها یا همون Interface رو می بینید. فایل های User.cpp و Vector.cpp فایل Vector.h رو با Include به خودشون اضافه کردن. در واقع Interface کلاس Vector با Includeبین 2 تا فایل Vector.cpp و User.cpp به اشتراک گذاشته شده. و چون فایل های User.cpp و Vector.cpp از هم مستقل هستند پس میتونیم اونا رو جدا گانه کامپایل کنیم.
  7. فضای نام یا namespace یک راه برای اینکه؛ مشخص کنیم یکسری declaration مربوط به هم هستند و جلوی ایجاد مشکل برای نامهای تکراری رو میگیره. برای مثال فرض کنید که بخوایم اعداد مختلط رو پیاده سازی کنیم. برای اینکه با اعداد مختلط که جاهای دیگه نوشته شده قاطی نشه از namespace استفاده کردیم . تمامی declarationهای خودم رو در فضای نام My_code گذاشتم برای پیاده سازی هم مشابه قبل؛ با استفاده از اپراتور resolutionیا همون :: مشخص کریم که پیاده سازی مربوط به کدوم declaration هست. و برای فراخوان هم باید Namespace اون تابع رو مشخص کنیم
  8. یک از امکاناتی که زبان C++ برای پی بردن به خطاها در زمان اجرای برنامه در اختیار ما میذاره Exception یا استثناهاست. وقتی برنامه ها بزرگتر می شن اداره کردن خطاها هم مهمتر میشه، برای مثال ما از کلاس Vector که با هم دیده بودیم استفاده میکنیم. اگه یادتون باشه ما یک اپراتور Subscritp نوشته بودیم که به ما امکان می داد با استفاده از index به عنصر آرایه دسترسی پیدا کنیم. حالا فرض کنید که ما یک index غیر معتبر بدیم مثلا یک عدد منفی بدیم یا بخوایم به یک عنصری دسترسی پیدا کنیم که در آرایه نسیت. برای اینکه جلوی این کار رو بگیریم می تونیم از Exception استفاده کنیم اول اونو باید include کنیم. با استفاده از using می تونیم مختصر نویسی کنیم. بجای اینکه همه جا بنویسیم std:: و بعد بنویسیم مثلا COUT یک راست مینویسیم cout و از std:: فاکتور میگیریمusing namespace به کامپایلر میگه وقتی داری دنبال نام یک کلاس یا متغییر می گردی توی namespace ؛ std رو هم بگرد. داخل شرط if چک میکنیم که index معتبره یانه؟ اگه منفی باشه یا از اندازه عناصر بزرگتر باشه با استفاده از throw یک خطا از نوع out_of_range یا دسترسی خارج از محدوده بر میگردونیم. در واقع throw مثل retrun عمل میکنه با این تفاوت که یک خطا برمیگردونه ولی return مقدار خروجی برمی گردونه.
  9. حالا برای اینکه بتونیم از اتفاق افتادن یک exception در برنامه مطلع بشیم باید از try catch استفاده کنیم. به این صورت که هر جایی که داریم از subscriptاستفاده می کنیم بین یک بلاک try قرار میگیره و بعد از try یک بلاک catch میذاریم اگه در بدنه ی try یک خطا رخ بده برنامه میپره به بدنه ی catch و دستورات اونو اجرا میکنه.
  10. یک مورد دیگه که ممکن ورودی نادرست مشکل ساز باشه زمان ساختن vector هست. ممکنه توی constructor یک عدد منفی بدیم. میشه جلوی اون رو هم با یک exception به نام length_error گرفت تا درصورتی که کسی خواست یک vector با طول منفی بسازه یک exception تولید بشه و جلوی اونو بگیره
  11. در این مثال میبینید که میشه یک بلاک try تعریف کرد و چند تا بلاک catch از انواع مختلف براش گذاشت. در اولین catch ما میتونیم exceptionهای از نوع length_error رو اداره کنیم و در دومین catch هم خطاهای bad_alloc رو اداره کنیم یعنی زمانی دیگه که حافظه در اختیار نداشته باشیم و نتونیم با new یک متغییر جدید بسازیم.
  12. یک جمع بندی از این سری از ویدیو ها بکنیم که در مورد چه مباحثی صحبت کردیم: ما در اولین ویدیو یک مقدمه و روند تکامل C++ رو گفتیم و یک برنامه Hello world نوشتیم در ویدیو دوم در مورد Typeها و متغییر ها و عملیاتهای ریاضی و منطقی گفتیم در ویدیوی سوم در مورد شرط ها و حلقه ها صحبت کردیم در ویدیوی چهارم در مورد آرایه ها و اشاره گرها صحبت کردیم و reference رو هم معرفی کردیم در ویدیوی پنجم در مورد استراکت و کلاس و enum صحبت کردیم و در ویدیوی آخر هم در مورد ماژولار کردن برنامه ها و exception بحث کردیم امید وارم مفید بوده باشه با تشکر