SlideShare a Scribd company logo
1 of 58
The C++ Language
The C++ Language
• Bjarne Stroupstrup, the language’s creator
C++ was designed to provide Simula’s facilities for
program organization together with C’s efficiency and
flexibility for systems programming.
C++ Features
• Classes
– User-defined types
• Operator overloading
– Attach different meaning to expressions such as a + b
• References
– Pass-by-reference function arguments
• Virtual Functions
– Dispatched depending on type at run time
• Templates
– Macro-like polymorphism for containers (e.g., arrays)
• Exceptions
Example: A stack in C
typedef struct {
char s[SIZE];
int sp;
} Stack;
stack *create() {
Stack *s;
s = (Stack *)malloc(sizeof(Stack));
s->sp = 0;
return s;
}
Creator function ensures
stack is created properly.
Does not help for stack that
is automatic variable.
Programmer could
inadvertently create
uninitialized stack.
Example: A stack in C
char pop(Stack *s) {
if (sp = 0) error(“Underflow”);
return s->s[--sp];
}
void push(Stack *s, char v) {
if (sp == SIZE) error(“Overflow”);
s->s[sp++] = v;
}
Not clear these are the only stack-related
functions.
Another part of program can modify any stack
any way it wants to, destroying invariants.
Temptation to inline these computations, not use
functions.
C++ Solution: Class
class Stack {
char s[SIZE];
int sp;
public:
Stack() { sp = 0; }
void push(char v) {
if (sp == SIZE) error(“overflow”);
s[sp++] = v;
}
char pop() {
if (sp == 0) error(“underflow”);
return s[--sp];
}
};
Definition of both
representation and
operations
Constructor: initializes
Public: visible outside the class
Member functions see object
fields like local variables
C++ Stack Class
• Natural to use
Stack st;
st.push(‘a’); st.push(‘b’);
char d = st.pop();
Stack *stk = new Stack;
stk->push(‘a’); stk->push(‘b’);
char d = stk->pop();
C++ Stack Class
• Members (functions, data) can be public, protected, or private
class Stack {
char s[SIZE];
public:
char pop();
};
Stack st;
st.s[0] = ‘a’; // Error: sp is private
st.pop(); // OK
Class Implementation
• C++ compiler translates to C-style implementation
C++
class Stack {
char s[SIZE];
int sp;
public:
Stack()
void push(char);
char pop();
};
Equivalent C implementation
struct Stack {
char s[SIZE];
int sp;
};
void st_Stack(Stack*);
void st_push(Stack*, char);
char st_pop(Stack*);
Operator Overloading
• For manipulating user-defined “numeric” types
Complex c1(1,5.3), c2(5);
Complex c3 = c1 + c2;
c3 = c3 + 2.3;
Creating objects of the
user-defined type
Want + to mean
something different in
this context
Promote 2.3 to a
complex number here
Example: Complex number type
• C++’s operator overloading makes it elegant
Class Complex {
double re, im;
public:
complex(double);
complex(double, double);
complex& operator+=(const complex&);
};
Pass-by-reference
reduces copying
Operator overloading
defines arithmetic
operators for the
complex type
References
• Designed to avoid copying in overloaded operators
• A mechanism for calling functions pass-by-reference
• C only has pass-by-value
void swap(int x, int y) { /* Doesn’t work */
int tmp = x; x = y; y = tmp;
}
void swap(int &x, int &y) { /* Works with references
*/
int tmp = x; x = y; y = tmp;
}
Complex Number Type
• Member functions including operators can be defined
inside or outside the class definition
Complex&
Complex::operator+=(const complex &a)
{
re += a.re;
im += a.im;
return *this;
}
Complex Number Class
• Operators can also be defined outside classes
Complex operator+(const Complex a,
const Complex b) {
Complex sum = a; // Copy constructor
a += b; // invoke Complex::operator
+=
return sum;
}
Function Overloading
• Overloaded operators a specific case of overloading
• General: select specific method/operator based on
name, number, and type of arguments
void foo(int);
void foo(int, int); // OK
void foo(char *); // OK
int foo(char *); // BAD: return type not in signature
Const
• Access control over variables, arguments.
• Provides safety
const double pi = 3.14159265; // Compile-time constant
int foo(const char* a) { // Constant argument
*a = ‘a’; // Illegal: a is const
}
class bar { // “object not modified”
int get_field() const { return field; }
}
Templates
• Our stack type is nice, but hard-wired for a single type
of object
• Using array of “void *” or a union might help, but
breaks type safety
• C++ solution: a template class
• Macro-processor-like way of specializing a class to
specific types
• Mostly intended for container classes
• Standard Template Library has templates for
– strings, lists, vectors, hash tables, trees, etc.
Template Stack Class
template <class T> class Stack {
T s[SIZE];
int sp;
public:
Stack() { sp = 0; }
void push(T v) {
if (sp == SIZE) error(“overflow”);
s[sp++] = v;
}
T pop() {
if (sp == 0) error(“underflow”);
return s[--sp];
}
};
T is a type argument
Used like a type within
the body
Using a template
Stack<char> cs; // Instantiates the specialized code
cs.push(‘a’);
char c = cs.pop();
Stack<double *> dps;
double d;
dps.push(&d);
Display-list example
• Say you want to draw a graphical scene
• List of objects
– lines, arcs, circles, squares, etc.
• How do you store them all in a single array?
void *list[10]; // Ugly: type-unsafe
• How do you draw them all?
switch (object->type) { // Hard to add new object
case LINE: /* … */ break;
case ARC: /* … */ break;
}
Inheritance
• Inheritance lets you build derived classes from base
classes
class Shape { /* … */ };
class Line : public Shape { /* … */ }; // Also a Shape
class Arc : public Shape { /* … */ }; // Also a Shape
Shape *dlist[10];
Inheritance
class Shape {
double x, y; // Base coordinates of shape
public:
void translate(double dx, double dy) {
x += dx; y += dy;
}
};
class Line : public Shape {
};
Line l;
l.translate(1,3); // Invoke Shape::translate()
Line inherits both the
representation and
member functions of the
Shape class
Implementing Inheritance
• Add new fields to the end of the object
• Fields in base class at same offset in derived class
C++
class Shape {
double x, y;
};
class Box : Shape {
double h, w;
};
Equivalent C implementation
struct Shape {
double x, y
};
struct Box {
double x, y;
double h, w;
};
Virtual Functions
class Shape {
virtual void draw();
};
class Line : public Shape {
void draw();
};
class Arc : public Shape {
void draw();
};
Shape *dl[10];
dl[0] = new Line;
dl[1] = new Arc;
dl[0]->draw(); // invoke Line::draw()
dl[1]->draw(); // invoke Arc::draw()
draw() is a virtual
function invoked based
on the actual type of the
object, not the type of
the pointer
New classes can be
added without having to
change “draw
everything” code
Implementing Virtual Functions
• Involves some overhead
class Virt {
int a, b;
virtual void foo();
virtual void bar();
};
a
b
vptr
&Virt::foo
&Virt::bar
Object of
type Virt
Virtual table
for class Virt
C++
void f(Virt *v)
{
v->bar();
}
Equivalent C implementation
void f(Virt *v)
{
(*(v->vptr.bar))(v);
}
Cfront
• How the language was first compiled
• Full compiler that produced C as output
• C++ semantics therefore expressible in C
• C++ model of computation ultimately the same
• C++ syntax substantial extension of C
• C++ semantics refer to the same model as C
• So why use C++?
– Specifications are clearer, easier to write and
maintain
Default arguments
• Another way to simplify function calls
• Especially useful for constructors
void foo(int a, int b = 3, int c = 4) { /* … */ }
C++ Expands to
foo(3) foo(3,3,4)
foo(4,5) foo(4,5,4)
foo(4,5,6) foo(4,5,6)
Declarations may appear anywhere
• Convenient way to avoid uninitialized variables
void f(int i, const char *p)
{
if (i<=0) error();
const int len = strlen(p);
char c = 0;
for (int j = i ; j<len ; j++)
c += p[j];
}
Multiple Inheritance
• Rocket Science
• Inherit from two or more classes:
class Window { … };
class Border { … };
class BWindow : public Window, public Border { … };
Multiple Inheritance Ambiguities
• What happens with duplicate methods?
class Window { void draw(); };
class Border { void draw() };
class BWindow : public Window, public Border { };
BWindow bw;
bw.draw(); // Error: ambiguous
Multiple Inheritance Ambiguities
• Ambiguity can be resolved explicitly
class Window { void draw(); };
class Border { void draw() };
class BWindow : public Window, public Border {
void draw() { Window::draw(); }
};
BWindow bw;
bw.draw(); // BWindow::draw() calls Window::draw()
Duplicate Base Classes
• A class may be inherited more than once
class Drawable { … };
class Window : public Drawable { … };
class Border : public Drawable { … };
class BWindow : public Window, public Border { … };
• BWindow gets two copies of the Drawable base class
Duplicate Base Classes
• Virtual base classes are inherited at most once
class Drawable { … };
class Window : public virtual Drawable { … };
class Border : public virtual Drawable { … };
class BWindow : public Window, public Border { … };
• BWindow gets one copy of the Drawable base class
Implementing Multiple Inheritance
• A virtual function expects a pointer to its object
struct A { virtual void f(); }
struct B { virtual void f(); }
struct C : A, B { void f(); }
• E.g., C::f() expects “this” to be a C*
• But this could be called with “this” being a B*
B
A
C
B *b
C *c or A *a
In-memory representation
of a C
Implementation Using VT Offsets
struct A { int x; virtual void f(); }
struct B { int y; virtual void f(); virtual void g(); }
struct C : A, B { int z; void f(); }
C c;
B *b = &c;
b->f(); // C::f()
1. b is a B*: vptr has f(), g()
2. Call C::f( this – 2 )
3. First argument now points to a C
x
y
vptr
&C::f 0
&C::f –2
c
C’s vtbl
vptr
z
&B::g 0
B in C’s vtbl
b
Implementation Using Thunks
• Create little “helper functions” that adjust this
• Advantage: Only pay extra cost for virtual functions
with multiple inheritance
x
y
vptr
&C::f
&C::f_in_B
c C’s vtbl
vptr
z
&B::g
B in C’s vtbl
b
void C::f_in_B(void* this) {
return C::f(this – 2);
}
Namespaces
• Namespace pollution
– Occurs when building large systems from pieces
– Identical globally-visible names clash
– How many programs have a “print” function?
– Very difficult to fix
• Classes suggest a solution
class A { void f(); };
class B { void f(); };
• Two f’s are separate
Namespaces
• Scope for enclosing otherwise global declarations
namespace Mine {
void print(int);
const float pi = 3.1415925635;
class Shape { };
}
void bar(float y) {
float x = y + Mine::pi;
Mine::print(5);
}
Namespaces
• using directive brings namespaces or objects into
scope
namespace Mine {
const float pi = 3.1415926535;
void print(int);
}
using Mine::print;
void foo() { print(5); } // invoke Mine::print
using namespace Mine;
float twopi = 2*pi; // Mine::pi
Namespaces
• Namespaces are open: declarations can be added
namespace Mine {
void f(int);
}
namespace Mine {
void g(int); // Add Mine::g() to Mine
}
Namespaces
• Declarations and definitions can be separated
namespace Mine {
void f(int);
}
void Mine::f(int a) {
/* … */
}
Exceptions
• A high-level replacement for C’s setjmp/longjmp
struct Except {};
void bar() { throw Except; }
void foo() {
try {
bar();
catch (Except e) {
printf(“oops”);
}
}
Standard Template Library
• I/O Facilities: iostream
• Garbage-collected String class
• Containers
– vector, list, queue, stack, map, set
• Numerical
– complex, valarray
• General algorithms
– search, sort
C++ IO Facilities
• C’s printing facility is clever but unsafe
char *s; int d; double g;
printf(“%s %d %g”, s, d, g);
• Hard for compiler to typecheck argument types
against format string
• C++ IO overloads the << and >> operators
cout << s << ‘ ‘ << d << ‘ ‘ << g;
• Type safe
C++ IO Facilities
• Printing user-defined types
ostream &operator<<(ostream &o, MyType &m) {
o << “An Object of MyType”;
return o;
}
• Input overloads the >> operator
int read_integer;
cin >> read_integer;
C++ string class
• Reference-counted for automatic garbage collection
string s1, s2;
s1 = “Hello”;
s2 = “There”;
s1 += “ goodbye”;
s1 = “”; // Frees memory occupied by “Hello goodbye”
C++ STL Containers
• Vector
– Dynamically growing, shrinking array of elements
vector<int> v;
v.push_back(3); // vector can behave as a stack
v.push_back(2);
int j = v[0]; // operator[] defined for vector
Iterators
• Mechanism for stepping through containers
vector<int> v;
for ( vector<int>::iterator i = v.begin();
i != v.end() ; i++ ) {
int entry = *i;
} …
v.begin() v.end()
Other Containers
Insert/Delete from
front mid. end random access
vectorO(n) O(n) O(1) O(1)
list O(1) O(1) O(1) O(n)
deque O(1) O(n) O(1) O(n)
Associative Containers
• Keys must be totally ordered
• Implemented with trees
• set
– Set of objects
set<int, less<int> > s;
s.insert(5);
set<int, less<int> >::iterator i = s.find(3);
• map
– Associative Array
map<int, char*> m;
m[3] = “example”;
C++ in Embedded Systems
• Dangers of using C++
– No or bad compiler for your particular processor
– Increased code size
– Slower program execution
• Much harder language to compile
– Unoptimized C++ code often much larger, slower
than equivalent C
C++ Features With No Impact
• Classes
– Fancy way to describe functions and structs
– Equivalent to writing object-oriented C code
• Single inheritance
– More compact way to write larger structures
• Function name overloading
– Completely resolved at compile time
• Namespaces
– Completely resolved at compile time
Inexpensive C++ Features
• Default arguments
– Compiler adds code at call site to set default
arguments
– Long argument lists costly in C and C++ anyway
• Constructors and destructors
– Function call overhead when an object comes into
scope (normal case)
– Extra code inserted when object comes into scope
(inlined case)
Medium-cost Features
• Virtual functions
– Extra level of indirection for each virtual function call
– Each object contains an extra pointer
• References
– Often implemented with pointers
– Extra level of indirection in accessing data
– Can disappear with inline functions
• Inline functions
– Can greatly increase code size for large functions
– Usually speeds execution
High-cost Features
• Multiple inheritance
– Makes objects much larger (multiple virtual
pointers)
– Virtual tables larger, more complicated
– Calling virtual functions even slower
• Templates
– Compiler generates separate code for each copy
– Can greatly increase code sizes
– No performance penalty
High-cost Features
• Exceptions
– Typical implementation:
– When exception is thrown, look up stack until handler is
found and destroy automatic objects on the way
– Mere presence of exceptions does not slow program
– Often requires extra tables or code to direct clean-up
– Throwing and exception often very slow
High-cost Features
• Much of the standard template library
– Uses templates: often generates lots of code
– Very dynamic data structures have high memory-
management overhead
– Easy to inadvertently copy large datastructures
Conclusion
• C still generates better code
• Easy to generate larger C++ executables
• Harder to generate slower C++ executables
• Exceptions most worrisome feature
– Consumes space without you asking
– GCC compiler has a flag to enable/disable
exception support –fexceptions and –fno-
exceptions

More Related Content

What's hot

Contravariant functors in scala
Contravariant functors in scalaContravariant functors in scala
Contravariant functors in scalaPiotr Paradziński
 
麻省理工C++公开教学课程(二)
麻省理工C++公开教学课程(二)麻省理工C++公开教学课程(二)
麻省理工C++公开教学课程(二)ProCharm
 
Presentation on C++ Programming Language
Presentation on C++ Programming LanguagePresentation on C++ Programming Language
Presentation on C++ Programming Languagesatvirsandhu9
 
First-Class Patterns
First-Class PatternsFirst-Class Patterns
First-Class PatternsJohn De Goes
 
Monoids - Part 2 - with examples using Scalaz and Cats
Monoids - Part 2 - with examples using Scalaz and CatsMonoids - Part 2 - with examples using Scalaz and Cats
Monoids - Part 2 - with examples using Scalaz and CatsPhilip Schwarz
 
Testing for share
Testing for share Testing for share
Testing for share Rajeev Mehta
 
Why functional programming and category theory strongly matters
Why functional programming and category theory strongly mattersWhy functional programming and category theory strongly matters
Why functional programming and category theory strongly mattersPiotr Paradziński
 
Declare Your Language: Virtual Machines & Code Generation
Declare Your Language: Virtual Machines & Code GenerationDeclare Your Language: Virtual Machines & Code Generation
Declare Your Language: Virtual Machines & Code GenerationEelco Visser
 
Monad Transformers - Part 1
Monad Transformers - Part 1Monad Transformers - Part 1
Monad Transformers - Part 1Philip Schwarz
 
Abstracting over the Monad yielded by a for comprehension and its generators
Abstracting over the Monad yielded by a for comprehension and its generatorsAbstracting over the Monad yielded by a for comprehension and its generators
Abstracting over the Monad yielded by a for comprehension and its generatorsPhilip Schwarz
 
C++11 Idioms @ Silicon Valley Code Camp 2012
C++11 Idioms @ Silicon Valley Code Camp 2012 C++11 Idioms @ Silicon Valley Code Camp 2012
C++11 Idioms @ Silicon Valley Code Camp 2012 Sumant Tambe
 
talk at Virginia Bioinformatics Institute, December 5, 2013
talk at Virginia Bioinformatics Institute, December 5, 2013talk at Virginia Bioinformatics Institute, December 5, 2013
talk at Virginia Bioinformatics Institute, December 5, 2013ericupnorth
 
16 strings-and-text-processing-120712074956-phpapp02
16 strings-and-text-processing-120712074956-phpapp0216 strings-and-text-processing-120712074956-phpapp02
16 strings-and-text-processing-120712074956-phpapp02Abdul Samee
 
Monoids - Part 1 - with examples using Scalaz and Cats
Monoids - Part 1 - with examples using Scalaz and CatsMonoids - Part 1 - with examples using Scalaz and Cats
Monoids - Part 1 - with examples using Scalaz and CatsPhilip Schwarz
 

What's hot (20)

Contravariant functors in scala
Contravariant functors in scalaContravariant functors in scala
Contravariant functors in scala
 
麻省理工C++公开教学课程(二)
麻省理工C++公开教学课程(二)麻省理工C++公开教学课程(二)
麻省理工C++公开教学课程(二)
 
Presentation on C++ Programming Language
Presentation on C++ Programming LanguagePresentation on C++ Programming Language
Presentation on C++ Programming Language
 
C# programming
C# programming C# programming
C# programming
 
147301 nol
147301 nol147301 nol
147301 nol
 
First-Class Patterns
First-Class PatternsFirst-Class Patterns
First-Class Patterns
 
Functors
FunctorsFunctors
Functors
 
Monoids - Part 2 - with examples using Scalaz and Cats
Monoids - Part 2 - with examples using Scalaz and CatsMonoids - Part 2 - with examples using Scalaz and Cats
Monoids - Part 2 - with examples using Scalaz and Cats
 
Testing for share
Testing for share Testing for share
Testing for share
 
Why functional programming and category theory strongly matters
Why functional programming and category theory strongly mattersWhy functional programming and category theory strongly matters
Why functional programming and category theory strongly matters
 
Declare Your Language: Virtual Machines & Code Generation
Declare Your Language: Virtual Machines & Code GenerationDeclare Your Language: Virtual Machines & Code Generation
Declare Your Language: Virtual Machines & Code Generation
 
Templates2
Templates2Templates2
Templates2
 
Monad Transformers - Part 1
Monad Transformers - Part 1Monad Transformers - Part 1
Monad Transformers - Part 1
 
Abstracting over the Monad yielded by a for comprehension and its generators
Abstracting over the Monad yielded by a for comprehension and its generatorsAbstracting over the Monad yielded by a for comprehension and its generators
Abstracting over the Monad yielded by a for comprehension and its generators
 
Java inheritance
Java inheritanceJava inheritance
Java inheritance
 
C++11 Idioms @ Silicon Valley Code Camp 2012
C++11 Idioms @ Silicon Valley Code Camp 2012 C++11 Idioms @ Silicon Valley Code Camp 2012
C++11 Idioms @ Silicon Valley Code Camp 2012
 
talk at Virginia Bioinformatics Institute, December 5, 2013
talk at Virginia Bioinformatics Institute, December 5, 2013talk at Virginia Bioinformatics Institute, December 5, 2013
talk at Virginia Bioinformatics Institute, December 5, 2013
 
16 strings-and-text-processing-120712074956-phpapp02
16 strings-and-text-processing-120712074956-phpapp0216 strings-and-text-processing-120712074956-phpapp02
16 strings-and-text-processing-120712074956-phpapp02
 
Core C#
Core C#Core C#
Core C#
 
Monoids - Part 1 - with examples using Scalaz and Cats
Monoids - Part 1 - with examples using Scalaz and CatsMonoids - Part 1 - with examples using Scalaz and Cats
Monoids - Part 1 - with examples using Scalaz and Cats
 

Similar to Basics of objective c

Chapter27 polymorphism-virtual-function-abstract-class
Chapter27 polymorphism-virtual-function-abstract-classChapter27 polymorphism-virtual-function-abstract-class
Chapter27 polymorphism-virtual-function-abstract-classDeepak Singh
 
Chapter i(introduction to java)
Chapter i(introduction to java)Chapter i(introduction to java)
Chapter i(introduction to java)Chhom Karath
 
Review constdestr
Review constdestrReview constdestr
Review constdestrrajudasraju
 
lecture02-cpp.ppt
lecture02-cpp.pptlecture02-cpp.ppt
lecture02-cpp.pptDevliNeeraj
 
Introduction to C#
Introduction to C#Introduction to C#
Introduction to C#ANURAG SINGH
 
C++ 11 Features
C++ 11 FeaturesC++ 11 Features
C++ 11 FeaturesJan Rüegg
 
Multiple file programs, inheritance, templates
Multiple file programs, inheritance, templatesMultiple file programs, inheritance, templates
Multiple file programs, inheritance, templatesSyed Zaid Irshad
 
C cheat sheet for varsity (extreme edition)
C cheat sheet for varsity (extreme edition)C cheat sheet for varsity (extreme edition)
C cheat sheet for varsity (extreme edition)Saifur Rahman
 
Functions And Header Files In C++ | Bjarne stroustrup
Functions And Header Files In C++ | Bjarne stroustrupFunctions And Header Files In C++ | Bjarne stroustrup
Functions And Header Files In C++ | Bjarne stroustrupSyedHaroonShah4
 

Similar to Basics of objective c (20)

Chapter27 polymorphism-virtual-function-abstract-class
Chapter27 polymorphism-virtual-function-abstract-classChapter27 polymorphism-virtual-function-abstract-class
Chapter27 polymorphism-virtual-function-abstract-class
 
Csharp_mahesh
Csharp_maheshCsharp_mahesh
Csharp_mahesh
 
Chapter i(introduction to java)
Chapter i(introduction to java)Chapter i(introduction to java)
Chapter i(introduction to java)
 
Oops lecture 1
Oops lecture 1Oops lecture 1
Oops lecture 1
 
Synapseindia dot net development
Synapseindia dot net developmentSynapseindia dot net development
Synapseindia dot net development
 
Review constdestr
Review constdestrReview constdestr
Review constdestr
 
Review constdestr
Review constdestrReview constdestr
Review constdestr
 
lecture02-cpp.ppt
lecture02-cpp.pptlecture02-cpp.ppt
lecture02-cpp.ppt
 
lecture02-cpp.ppt
lecture02-cpp.pptlecture02-cpp.ppt
lecture02-cpp.ppt
 
lecture02-cpp.ppt
lecture02-cpp.pptlecture02-cpp.ppt
lecture02-cpp.ppt
 
lecture02-cpp.ppt
lecture02-cpp.pptlecture02-cpp.ppt
lecture02-cpp.ppt
 
c++ ppt.ppt
c++ ppt.pptc++ ppt.ppt
c++ ppt.ppt
 
Introduction to C#
Introduction to C#Introduction to C#
Introduction to C#
 
lecture02-cpp.ppt
lecture02-cpp.pptlecture02-cpp.ppt
lecture02-cpp.ppt
 
C++ language
C++ languageC++ language
C++ language
 
C++ 11 Features
C++ 11 FeaturesC++ 11 Features
C++ 11 Features
 
Multiple file programs, inheritance, templates
Multiple file programs, inheritance, templatesMultiple file programs, inheritance, templates
Multiple file programs, inheritance, templates
 
C cheat sheet for varsity (extreme edition)
C cheat sheet for varsity (extreme edition)C cheat sheet for varsity (extreme edition)
C cheat sheet for varsity (extreme edition)
 
Functions And Header Files In C++ | Bjarne stroustrup
Functions And Header Files In C++ | Bjarne stroustrupFunctions And Header Files In C++ | Bjarne stroustrup
Functions And Header Files In C++ | Bjarne stroustrup
 
C++ language
C++ languageC++ language
C++ language
 

More from sagaroceanic11

Module 21 investigative reports
Module 21 investigative reportsModule 21 investigative reports
Module 21 investigative reportssagaroceanic11
 
Module 20 mobile forensics
Module 20 mobile forensicsModule 20 mobile forensics
Module 20 mobile forensicssagaroceanic11
 
Module 19 tracking emails and investigating email crimes
Module 19 tracking emails and investigating email crimesModule 19 tracking emails and investigating email crimes
Module 19 tracking emails and investigating email crimessagaroceanic11
 
Module 18 investigating web attacks
Module 18 investigating web attacksModule 18 investigating web attacks
Module 18 investigating web attackssagaroceanic11
 
Module 17 investigating wireless attacks
Module 17 investigating wireless attacksModule 17 investigating wireless attacks
Module 17 investigating wireless attackssagaroceanic11
 
Module 04 digital evidence
Module 04 digital evidenceModule 04 digital evidence
Module 04 digital evidencesagaroceanic11
 
Module 03 searching and seizing computers
Module 03 searching and seizing computersModule 03 searching and seizing computers
Module 03 searching and seizing computerssagaroceanic11
 
Module 01 computer forensics in todays world
Module 01 computer forensics in todays worldModule 01 computer forensics in todays world
Module 01 computer forensics in todays worldsagaroceanic11
 
Virtualisation with v mware
Virtualisation with v mwareVirtualisation with v mware
Virtualisation with v mwaresagaroceanic11
 
Virtualisation overview
Virtualisation overviewVirtualisation overview
Virtualisation overviewsagaroceanic11
 
Introduction to virtualisation
Introduction to virtualisationIntroduction to virtualisation
Introduction to virtualisationsagaroceanic11
 
2 the service lifecycle
2 the service lifecycle2 the service lifecycle
2 the service lifecyclesagaroceanic11
 
1 introduction to itil v[1].3
1 introduction to itil v[1].31 introduction to itil v[1].3
1 introduction to itil v[1].3sagaroceanic11
 
Visual studio 2008 overview
Visual studio 2008 overviewVisual studio 2008 overview
Visual studio 2008 overviewsagaroceanic11
 

More from sagaroceanic11 (20)

Module 21 investigative reports
Module 21 investigative reportsModule 21 investigative reports
Module 21 investigative reports
 
Module 20 mobile forensics
Module 20 mobile forensicsModule 20 mobile forensics
Module 20 mobile forensics
 
Module 19 tracking emails and investigating email crimes
Module 19 tracking emails and investigating email crimesModule 19 tracking emails and investigating email crimes
Module 19 tracking emails and investigating email crimes
 
Module 18 investigating web attacks
Module 18 investigating web attacksModule 18 investigating web attacks
Module 18 investigating web attacks
 
Module 17 investigating wireless attacks
Module 17 investigating wireless attacksModule 17 investigating wireless attacks
Module 17 investigating wireless attacks
 
Module 04 digital evidence
Module 04 digital evidenceModule 04 digital evidence
Module 04 digital evidence
 
Module 03 searching and seizing computers
Module 03 searching and seizing computersModule 03 searching and seizing computers
Module 03 searching and seizing computers
 
Module 01 computer forensics in todays world
Module 01 computer forensics in todays worldModule 01 computer forensics in todays world
Module 01 computer forensics in todays world
 
Virtualisation with v mware
Virtualisation with v mwareVirtualisation with v mware
Virtualisation with v mware
 
Virtualisation overview
Virtualisation overviewVirtualisation overview
Virtualisation overview
 
Virtualisation basics
Virtualisation basicsVirtualisation basics
Virtualisation basics
 
Introduction to virtualisation
Introduction to virtualisationIntroduction to virtualisation
Introduction to virtualisation
 
6 service operation
6 service operation6 service operation
6 service operation
 
5 service transition
5 service transition5 service transition
5 service transition
 
4 service design
4 service design4 service design
4 service design
 
3 service strategy
3 service strategy3 service strategy
3 service strategy
 
2 the service lifecycle
2 the service lifecycle2 the service lifecycle
2 the service lifecycle
 
1 introduction to itil v[1].3
1 introduction to itil v[1].31 introduction to itil v[1].3
1 introduction to itil v[1].3
 
Visual studio 2008 overview
Visual studio 2008 overviewVisual studio 2008 overview
Visual studio 2008 overview
 
Vb introduction.
Vb introduction.Vb introduction.
Vb introduction.
 

Recently uploaded

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Victor Rentea
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...apidays
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024The Digital Insurer
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...apidays
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistandanishmna97
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKJago de Vreede
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...apidays
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfOverkill Security
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 

Recently uploaded (20)

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdf
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 

Basics of objective c

  • 2. The C++ Language • Bjarne Stroupstrup, the language’s creator C++ was designed to provide Simula’s facilities for program organization together with C’s efficiency and flexibility for systems programming.
  • 3. C++ Features • Classes – User-defined types • Operator overloading – Attach different meaning to expressions such as a + b • References – Pass-by-reference function arguments • Virtual Functions – Dispatched depending on type at run time • Templates – Macro-like polymorphism for containers (e.g., arrays) • Exceptions
  • 4. Example: A stack in C typedef struct { char s[SIZE]; int sp; } Stack; stack *create() { Stack *s; s = (Stack *)malloc(sizeof(Stack)); s->sp = 0; return s; } Creator function ensures stack is created properly. Does not help for stack that is automatic variable. Programmer could inadvertently create uninitialized stack.
  • 5. Example: A stack in C char pop(Stack *s) { if (sp = 0) error(“Underflow”); return s->s[--sp]; } void push(Stack *s, char v) { if (sp == SIZE) error(“Overflow”); s->s[sp++] = v; } Not clear these are the only stack-related functions. Another part of program can modify any stack any way it wants to, destroying invariants. Temptation to inline these computations, not use functions.
  • 6. C++ Solution: Class class Stack { char s[SIZE]; int sp; public: Stack() { sp = 0; } void push(char v) { if (sp == SIZE) error(“overflow”); s[sp++] = v; } char pop() { if (sp == 0) error(“underflow”); return s[--sp]; } }; Definition of both representation and operations Constructor: initializes Public: visible outside the class Member functions see object fields like local variables
  • 7. C++ Stack Class • Natural to use Stack st; st.push(‘a’); st.push(‘b’); char d = st.pop(); Stack *stk = new Stack; stk->push(‘a’); stk->push(‘b’); char d = stk->pop();
  • 8. C++ Stack Class • Members (functions, data) can be public, protected, or private class Stack { char s[SIZE]; public: char pop(); }; Stack st; st.s[0] = ‘a’; // Error: sp is private st.pop(); // OK
  • 9. Class Implementation • C++ compiler translates to C-style implementation C++ class Stack { char s[SIZE]; int sp; public: Stack() void push(char); char pop(); }; Equivalent C implementation struct Stack { char s[SIZE]; int sp; }; void st_Stack(Stack*); void st_push(Stack*, char); char st_pop(Stack*);
  • 10. Operator Overloading • For manipulating user-defined “numeric” types Complex c1(1,5.3), c2(5); Complex c3 = c1 + c2; c3 = c3 + 2.3; Creating objects of the user-defined type Want + to mean something different in this context Promote 2.3 to a complex number here
  • 11. Example: Complex number type • C++’s operator overloading makes it elegant Class Complex { double re, im; public: complex(double); complex(double, double); complex& operator+=(const complex&); }; Pass-by-reference reduces copying Operator overloading defines arithmetic operators for the complex type
  • 12. References • Designed to avoid copying in overloaded operators • A mechanism for calling functions pass-by-reference • C only has pass-by-value void swap(int x, int y) { /* Doesn’t work */ int tmp = x; x = y; y = tmp; } void swap(int &x, int &y) { /* Works with references */ int tmp = x; x = y; y = tmp; }
  • 13. Complex Number Type • Member functions including operators can be defined inside or outside the class definition Complex& Complex::operator+=(const complex &a) { re += a.re; im += a.im; return *this; }
  • 14. Complex Number Class • Operators can also be defined outside classes Complex operator+(const Complex a, const Complex b) { Complex sum = a; // Copy constructor a += b; // invoke Complex::operator += return sum; }
  • 15. Function Overloading • Overloaded operators a specific case of overloading • General: select specific method/operator based on name, number, and type of arguments void foo(int); void foo(int, int); // OK void foo(char *); // OK int foo(char *); // BAD: return type not in signature
  • 16. Const • Access control over variables, arguments. • Provides safety const double pi = 3.14159265; // Compile-time constant int foo(const char* a) { // Constant argument *a = ‘a’; // Illegal: a is const } class bar { // “object not modified” int get_field() const { return field; } }
  • 17. Templates • Our stack type is nice, but hard-wired for a single type of object • Using array of “void *” or a union might help, but breaks type safety • C++ solution: a template class • Macro-processor-like way of specializing a class to specific types • Mostly intended for container classes • Standard Template Library has templates for – strings, lists, vectors, hash tables, trees, etc.
  • 18. Template Stack Class template <class T> class Stack { T s[SIZE]; int sp; public: Stack() { sp = 0; } void push(T v) { if (sp == SIZE) error(“overflow”); s[sp++] = v; } T pop() { if (sp == 0) error(“underflow”); return s[--sp]; } }; T is a type argument Used like a type within the body
  • 19. Using a template Stack<char> cs; // Instantiates the specialized code cs.push(‘a’); char c = cs.pop(); Stack<double *> dps; double d; dps.push(&d);
  • 20. Display-list example • Say you want to draw a graphical scene • List of objects – lines, arcs, circles, squares, etc. • How do you store them all in a single array? void *list[10]; // Ugly: type-unsafe • How do you draw them all? switch (object->type) { // Hard to add new object case LINE: /* … */ break; case ARC: /* … */ break; }
  • 21. Inheritance • Inheritance lets you build derived classes from base classes class Shape { /* … */ }; class Line : public Shape { /* … */ }; // Also a Shape class Arc : public Shape { /* … */ }; // Also a Shape Shape *dlist[10];
  • 22. Inheritance class Shape { double x, y; // Base coordinates of shape public: void translate(double dx, double dy) { x += dx; y += dy; } }; class Line : public Shape { }; Line l; l.translate(1,3); // Invoke Shape::translate() Line inherits both the representation and member functions of the Shape class
  • 23. Implementing Inheritance • Add new fields to the end of the object • Fields in base class at same offset in derived class C++ class Shape { double x, y; }; class Box : Shape { double h, w; }; Equivalent C implementation struct Shape { double x, y }; struct Box { double x, y; double h, w; };
  • 24. Virtual Functions class Shape { virtual void draw(); }; class Line : public Shape { void draw(); }; class Arc : public Shape { void draw(); }; Shape *dl[10]; dl[0] = new Line; dl[1] = new Arc; dl[0]->draw(); // invoke Line::draw() dl[1]->draw(); // invoke Arc::draw() draw() is a virtual function invoked based on the actual type of the object, not the type of the pointer New classes can be added without having to change “draw everything” code
  • 25. Implementing Virtual Functions • Involves some overhead class Virt { int a, b; virtual void foo(); virtual void bar(); }; a b vptr &Virt::foo &Virt::bar Object of type Virt Virtual table for class Virt C++ void f(Virt *v) { v->bar(); } Equivalent C implementation void f(Virt *v) { (*(v->vptr.bar))(v); }
  • 26. Cfront • How the language was first compiled • Full compiler that produced C as output • C++ semantics therefore expressible in C • C++ model of computation ultimately the same • C++ syntax substantial extension of C • C++ semantics refer to the same model as C • So why use C++? – Specifications are clearer, easier to write and maintain
  • 27. Default arguments • Another way to simplify function calls • Especially useful for constructors void foo(int a, int b = 3, int c = 4) { /* … */ } C++ Expands to foo(3) foo(3,3,4) foo(4,5) foo(4,5,4) foo(4,5,6) foo(4,5,6)
  • 28. Declarations may appear anywhere • Convenient way to avoid uninitialized variables void f(int i, const char *p) { if (i<=0) error(); const int len = strlen(p); char c = 0; for (int j = i ; j<len ; j++) c += p[j]; }
  • 29. Multiple Inheritance • Rocket Science • Inherit from two or more classes: class Window { … }; class Border { … }; class BWindow : public Window, public Border { … };
  • 30. Multiple Inheritance Ambiguities • What happens with duplicate methods? class Window { void draw(); }; class Border { void draw() }; class BWindow : public Window, public Border { }; BWindow bw; bw.draw(); // Error: ambiguous
  • 31. Multiple Inheritance Ambiguities • Ambiguity can be resolved explicitly class Window { void draw(); }; class Border { void draw() }; class BWindow : public Window, public Border { void draw() { Window::draw(); } }; BWindow bw; bw.draw(); // BWindow::draw() calls Window::draw()
  • 32. Duplicate Base Classes • A class may be inherited more than once class Drawable { … }; class Window : public Drawable { … }; class Border : public Drawable { … }; class BWindow : public Window, public Border { … }; • BWindow gets two copies of the Drawable base class
  • 33. Duplicate Base Classes • Virtual base classes are inherited at most once class Drawable { … }; class Window : public virtual Drawable { … }; class Border : public virtual Drawable { … }; class BWindow : public Window, public Border { … }; • BWindow gets one copy of the Drawable base class
  • 34. Implementing Multiple Inheritance • A virtual function expects a pointer to its object struct A { virtual void f(); } struct B { virtual void f(); } struct C : A, B { void f(); } • E.g., C::f() expects “this” to be a C* • But this could be called with “this” being a B* B A C B *b C *c or A *a In-memory representation of a C
  • 35. Implementation Using VT Offsets struct A { int x; virtual void f(); } struct B { int y; virtual void f(); virtual void g(); } struct C : A, B { int z; void f(); } C c; B *b = &c; b->f(); // C::f() 1. b is a B*: vptr has f(), g() 2. Call C::f( this – 2 ) 3. First argument now points to a C x y vptr &C::f 0 &C::f –2 c C’s vtbl vptr z &B::g 0 B in C’s vtbl b
  • 36. Implementation Using Thunks • Create little “helper functions” that adjust this • Advantage: Only pay extra cost for virtual functions with multiple inheritance x y vptr &C::f &C::f_in_B c C’s vtbl vptr z &B::g B in C’s vtbl b void C::f_in_B(void* this) { return C::f(this – 2); }
  • 37. Namespaces • Namespace pollution – Occurs when building large systems from pieces – Identical globally-visible names clash – How many programs have a “print” function? – Very difficult to fix • Classes suggest a solution class A { void f(); }; class B { void f(); }; • Two f’s are separate
  • 38. Namespaces • Scope for enclosing otherwise global declarations namespace Mine { void print(int); const float pi = 3.1415925635; class Shape { }; } void bar(float y) { float x = y + Mine::pi; Mine::print(5); }
  • 39. Namespaces • using directive brings namespaces or objects into scope namespace Mine { const float pi = 3.1415926535; void print(int); } using Mine::print; void foo() { print(5); } // invoke Mine::print using namespace Mine; float twopi = 2*pi; // Mine::pi
  • 40. Namespaces • Namespaces are open: declarations can be added namespace Mine { void f(int); } namespace Mine { void g(int); // Add Mine::g() to Mine }
  • 41. Namespaces • Declarations and definitions can be separated namespace Mine { void f(int); } void Mine::f(int a) { /* … */ }
  • 42. Exceptions • A high-level replacement for C’s setjmp/longjmp struct Except {}; void bar() { throw Except; } void foo() { try { bar(); catch (Except e) { printf(“oops”); } }
  • 43. Standard Template Library • I/O Facilities: iostream • Garbage-collected String class • Containers – vector, list, queue, stack, map, set • Numerical – complex, valarray • General algorithms – search, sort
  • 44. C++ IO Facilities • C’s printing facility is clever but unsafe char *s; int d; double g; printf(“%s %d %g”, s, d, g); • Hard for compiler to typecheck argument types against format string • C++ IO overloads the << and >> operators cout << s << ‘ ‘ << d << ‘ ‘ << g; • Type safe
  • 45. C++ IO Facilities • Printing user-defined types ostream &operator<<(ostream &o, MyType &m) { o << “An Object of MyType”; return o; } • Input overloads the >> operator int read_integer; cin >> read_integer;
  • 46. C++ string class • Reference-counted for automatic garbage collection string s1, s2; s1 = “Hello”; s2 = “There”; s1 += “ goodbye”; s1 = “”; // Frees memory occupied by “Hello goodbye”
  • 47. C++ STL Containers • Vector – Dynamically growing, shrinking array of elements vector<int> v; v.push_back(3); // vector can behave as a stack v.push_back(2); int j = v[0]; // operator[] defined for vector
  • 48. Iterators • Mechanism for stepping through containers vector<int> v; for ( vector<int>::iterator i = v.begin(); i != v.end() ; i++ ) { int entry = *i; } … v.begin() v.end()
  • 49. Other Containers Insert/Delete from front mid. end random access vectorO(n) O(n) O(1) O(1) list O(1) O(1) O(1) O(n) deque O(1) O(n) O(1) O(n)
  • 50. Associative Containers • Keys must be totally ordered • Implemented with trees • set – Set of objects set<int, less<int> > s; s.insert(5); set<int, less<int> >::iterator i = s.find(3); • map – Associative Array map<int, char*> m; m[3] = “example”;
  • 51. C++ in Embedded Systems • Dangers of using C++ – No or bad compiler for your particular processor – Increased code size – Slower program execution • Much harder language to compile – Unoptimized C++ code often much larger, slower than equivalent C
  • 52. C++ Features With No Impact • Classes – Fancy way to describe functions and structs – Equivalent to writing object-oriented C code • Single inheritance – More compact way to write larger structures • Function name overloading – Completely resolved at compile time • Namespaces – Completely resolved at compile time
  • 53. Inexpensive C++ Features • Default arguments – Compiler adds code at call site to set default arguments – Long argument lists costly in C and C++ anyway • Constructors and destructors – Function call overhead when an object comes into scope (normal case) – Extra code inserted when object comes into scope (inlined case)
  • 54. Medium-cost Features • Virtual functions – Extra level of indirection for each virtual function call – Each object contains an extra pointer • References – Often implemented with pointers – Extra level of indirection in accessing data – Can disappear with inline functions • Inline functions – Can greatly increase code size for large functions – Usually speeds execution
  • 55. High-cost Features • Multiple inheritance – Makes objects much larger (multiple virtual pointers) – Virtual tables larger, more complicated – Calling virtual functions even slower • Templates – Compiler generates separate code for each copy – Can greatly increase code sizes – No performance penalty
  • 56. High-cost Features • Exceptions – Typical implementation: – When exception is thrown, look up stack until handler is found and destroy automatic objects on the way – Mere presence of exceptions does not slow program – Often requires extra tables or code to direct clean-up – Throwing and exception often very slow
  • 57. High-cost Features • Much of the standard template library – Uses templates: often generates lots of code – Very dynamic data structures have high memory- management overhead – Easy to inadvertently copy large datastructures
  • 58. Conclusion • C still generates better code • Easy to generate larger C++ executables • Harder to generate slower C++ executables • Exceptions most worrisome feature – Consumes space without you asking – GCC compiler has a flag to enable/disable exception support –fexceptions and –fno- exceptions