SlideShare ist ein Scribd-Unternehmen logo
1 von 69
INTRO TO C & C++
ECE 417/617:
Elements of Software Engineering
Mzgeen .T .F
UOD University
RECOMMENDED C++
RESOURCES
• Bjarne Stroustrup,
The C++ Programming
Language
• Scott Meyers,
Effective C++
WHY C++?
• Popular and relevant (used in nearly every application domain):
• end-user applications (Word, Excel, PowerPoint, Photoshop, Acrobat,
Quicken, games)
• operating systems (Windows 9x, NT, XP; IBM’s K42; some Apple OS X)
• large-scale web servers/apps (Amazon, Google)
• central database control (Israel’s census bureau; Amadeus; Morgan-
Stanley financial modeling)
• communications (Alcatel; Nokia; 800 telephone numbers; major
transmission nodes in Germany and France)
• numerical computation / graphics (Maya)
• device drivers under real-time constraints
• Stable, compatible, scalable
C VS. C++
• C++ is C incremented
(orig., “C with classes”)
• C++ is more expressive
(fewer C++ source lines needed than C source lines for same program)
• C++ is just as permissive
(anything you can do in C can also be done in C++)
• C++ can be just as efficient
(most C++ expressions need no run-time support;
C++ allows you to
• manipulate bits directly and interface with hardware without regard for safety or
ease of comprehension, BUT
• hide these details behind a safe, clean, elegant interface)
• C++ is more maintainable
(1000 lines of code – even brute force, spaghetti code will work;
100,000 lines of code – need good structure, or new errors will be
introduced as quickly as old errors are removed)
EFFICIENCY AND
MAINTAINABILITY
90/10 rule: 10% of your program will take 90% of the
processor time to run
optimize what needs to be optimized, but no more
focus on design
DESIGN GOALS OF C++
• Backward compatibility with C
(almost completely – every program in K&R is a C++ program –
but additional keywords can cause problems)
• Simplicity, elegance
(few built-in data types, e.g., no matrices)
• Support for user-defined data types
(act like built-in types; N.B. Standard Template Library (STL))
• No compromise in efficiency, run-time or memory
(unless “advanced features” used)
• Compilation analysis to prevent accidental corruption
of data
(type-checking and data hiding)
• Support object-oriented style of programming
COMPATIBILITY WITH C
C++ does not allow
• old-style C function declarations
void f(a) int a; {}
• generic function declarations
void f();
void g() { f(2); }
• setting enum to int
enum Dir {Up, Down}; Dir
d=1;
• multiple declarations
int i; int i;
• assigning to void *
int* p = malloc(10);
• “implicit int”
signed a = 7;
Other differences:
• const global variables have
internal linkage in C++,
external in C
• extra keywords in C++
void main()
{ int catch = 5; }
• bizarre comments
int f(int a, int b)
{
return a//**/b
;
}
How is C++ not backward compatible with C (C89)?
(For these, C++ is backward
compatible with C99)
PURPOSE OF A
PROGRAMMING LANGUAGE
• Programming languages serve two purposes:
• vehicle for specifying actions to be executed
“close to the machine”
• set of concepts for thinking about what can be done
“close to the problem being solved”
• Object-oriented C++ excels at both
LEARNING C++
• Goal: Don’t just learn new syntax, but become a
better programmer and designer; learn new and
better ways of building systems
• Be willing to learn C++’s style; don’t force
another style into it
• C++ supports gradual learning
• Use what you know
• As you learn new features and techniques, add those
tools to your toolbox
• C++ supports variety of programming
paradigms
PROGRAMMING
PARADIGMS
• procedural – implement algorithms via
functions (variables, functions, etc.)
• modular – partition program into modules
(separate compilation)
• object-oriented – divide problem into classes
(data hiding, inheritance)
• abstract – separate interface from
implementation (abstract classes)
• generic – manipulate arbitrary data types (STL:
containers, algorithms)
WHAT IS OBJECT-
ORIENTED?
• Encapsulation
“black box” – internal data hidden
• Inheritance
related classes share implementation
and/or interface
• Polymorphism
ability to use a class without knowing its type
© SDC
“C++ is an object-oriented language” =
C++ provides mechanisms that support object-oriented style of programming
SOME C++ CONCEPTS
• constructor / destructor / copy constructor
• initialization list
• inheritance
• exceptions
• overloading operators (e.g., assignment operator)
• namespace
• const
• virtual function
• pure virtual (abstract) function
• friend
• template
• standard template library (STL)
• pass by value, pass by reference
• composition versus derivation
A SIMPLE C++ PROGRAM
#include <iostream> // std::cout
#include <cstdio> // printf
int main()
{
int a = 5; // 'a' is L-value
float b = 0.9f;
printf("Hello world %d %3.1f n", a, b);
std::cout << "Hello world" << a << " "
<< b << " " << std::endl;
return 0;
}
DECLARATIONS AND
DEFINITIONS
• Declaration:
• extern char c;
• struct User;
• double sqrt(double);
 Okay to have many
• Definition:
• char c;
• int count = 1;
• double abs(double a) {
a>0 ? a : -a;
}
 Must have exactly one
FUNDAMENTAL TYPES
• bool (true  1, false  0)
• char (could be signed or unsigned
– implementation-defined)
• int (signed by default)
• double
• void (“pseudo-type”)
• enum
• class
• also short, long, struct, float, wchar_t,
etc.)
Do not rely on sizes of these!
(Implementation-dependent)
INTEGRAL
ARITHMETIC
USER-DEFINED
MACROS
• Dangerous:
• compiler never sees them
source code  translation unit
• global
• Instead, use
• const
• inline
• template
• enum
• Ok to use for include guards (“header wrappers”)
• If you must use a macro, give it a long ugly name with
lots of capital letters
Example:
template<typename T>
inline T max(T t){
t>0 ? t : -t;
}
MEMORY ALLOCATION
• “on the stack”
• block delimited by {}
• object alive till it falls out of scope
• calls constructor / destructor
• “on the heap”
• new and delete replace malloc, calloc, free
• object exists independently of scope in which it was created
• also “on the free store” or “allocated in dynamic memory”
• be careful: new  delete, new[]  delete[]
• for safety, same object should both allocate and deallocate
• “local static store”
void foo() {
static int i=0;
}
GLOBAL VARIABLES
• Built-in types initialized to 0
(but local variables uninitialized)
• Initialized before main() invoked
• Initialization order:
• within translation unit, same as definition
• between translation units, arbitrary order
file1.cpp
double pi = 3.14;
file2.cpp
double twopi = 2*pi;
Bad!
No guarantee that twopi
will be initialized correctly
A CLASS
class Date {
public:
enum Month {Jan, Feb, Mar, ...}
Date(int year, Month month, int day);
int GetDay() const;
void SetDay(int day);
Date& operator+=(int days);
private:
Month m_month;
int m_year, m_day;
};
member
functions
(methods)
member
variables
STRUCT VS. CLASS
• In C++, no difference b/w struct and class
(except default public vs. private)
• In C++, struct can have
• member variables
• methods
• public, private, and protected
• virtual functions
• etc.
• Rule of thumb:
• Use struct when member variables are public (just a
container)
• Use class otherwise
OO IN C
• In C, a struct can have
both member variables
and methods:
• In C++, syntax is simpler:
void CreateFoo()
{
}
struct Foo
{
void (*Construct)();
int m_data;
};
int main()
{
struct Foo a;
a.Construct = &CreateFoo;
a.Construct();
}
struct Foo
{
Foo()
int m_data;
};
Foo::Foo()
{
}
int main()
{
Foo a;
}
NAMES
• Maintain consistent naming style
• long names for large scope
• short names for small scope
• Don’t start with underscore; reserved for special facilities
• Avoid similar-looking names: l and 1
• Choosing good names is an art
ACCESS CONTROL
• Public: visible to everyone
• Private: visible only to the implementer of
this particular class
• Protected: visible to this class and derived
classes
• Good rule of thumb:
• member functions (methods):
• if non-virtual, then public or protected
• if virtual, then private
• member variables should be private
(except in the case of a struct)
THE BIG FOUR
• By default, each class has four methods:
• constructor Date();
• destructor ~Date();
• copy constructor
Date(const Date& other);
• assignment operator
Date& operator=(const Date& other);
• These call the appropriate functions on each
member variable
• Be careful: If this is not what you want, then
either override or disallow (by making private)
CONSTRUCTOR AND
DESTRUCTOR
• (Copy) constructor creates object
• Destructor destroys (“cleans up”) object
• Be aware of temporary objects
class Matrix {
Matrix(const Matrix& other);
Matrix operator+(const Matrix& other) const;
Matrix& operator=(const Matrix& other);
};
void foo() {
Matrix a, b, c, d;
a = b + c + d;
}
What functions get called?
(Note: There are ways to speed this up while preserving the syntax)
EXAMPLE
Suppose we have a simple class.
class A {
public:
A() { printf("conn"); }
A(const A& other) { printf("copyconn"); }
~A() { printf("desn"); }
A& operator=(const A& other) { printf("assignn");
return *this;
}
};
EXAMPLE 1
What is the output of the following program?
01 {
02 A a;
03 A* b = new A();
04 *b = a;
05 delete b;
06 A c = a;
07 }
02 con
03 con
04 assign
05 des
06 copycon
07 des
07 des
EXAMPLE 2
What is the output of the following program?
01 void F(const A& f, A* g, A h)
02 {
03 *g = f;
04 }
05 {
06 A a, b;
07 F( a, &b, a);
08 }
06 con
06 con
01 copycon
03 assign
04 des
08 des
08 des
EXAMPLE 3
What is the output of the following program?
01 A F()
02 {
03 A tmp;
04 return tmp;
05 }
06 {
07 A a = F();
08 }
(VC++ 6.0 -- Windows)
03 con
07 copycon
05 des
08 des
(g++ 3.4.3 -- Linux)
07 con
08 des
AVOID NEW AND DELETE
• Whenever possible, avoid ‘new’ and ‘delete’
• Instead create object on stack
• Automatic destructor makes things easier
• No need to worry about forgetting to delete the
object (memory leak) or deleting the wrong object
(crash)
• If you must use ‘new’, then try to keep the ‘delete’
nearby
• This helps code maintenance – otherwise it is hard
to keep track of the new/delete pairs
WHEN TO USE NEW AND
DELETE
• Sometimes you have to use new and delete
• And sometimes the pair cannot be close together
• Oh well
• The next slide shows an example where we need to break
both of these rules
AN EXAMPLE OF
NEW/DELETE
• You have a base class:
class Command { virtual DoSomething(); };
• You have several derived classes:
class CommandAdd : public Command {};
class CommandMove : public Command {};
class CommandSet : public Command {};
• You have a list of objects whose types are unknown at compile
time (polymorphism):
std::vector<Command*> undo_list;
• Must put pointers in list – not actual objects – because the
objects may be of different sizes (among other reasons)
• Someone creates the object and puts its pointer on the list:
undo_list.push_back( new CommandAdd() );
• Later the object is removed from the list and deleted:
Command* com = undo_list.back();
undo_list.pop();
com->DoSomething(); // call a virtual method
delete com;
INITIALIZER LISTS
Matrix::Matrix(const Matrix& other)
: m_n(0), m_a(0)
{
}
Matrix::Matrix(const Matrix& other)
{
m_n = 0;
m_a = 0;
}
Use initializer list:
Assign values inside constructor:
CONCRETE CLASSES
• A concrete class
• does a single, relatively small thing well and
efficiently
• hides data members (encapsulation)
• provides clean interface
• acts like a built-in type
• is a “foundation of elegant programming” –
Stroustrup
• Don’t underestimate the importance of this
basic C++/OO feature!
CLASS RELATIONSHIPS
• OK:
• A calls function from B
• A creates B
• A has a data member of type B
• Bad:
• A uses data directly from B
(without using B’s interface)
• Even worse:
• A directly manipulates data in B
POINTERS, ARRAYS,
REFERENCES
• Use 0, not NULL (stronger type checking)
• Name of array is equivalent to pointer to initial element
• Access array using * or []; same efficiency with modern
compiler
• use std::vector, not built-in array, when possible
• Reference is like a pointer
REFERENCES
• Reference: alternate
name for an object (alias)
• There is no
null reference
• No reference to
a temporary
• Syntax confusing
• Basically a const
dereferenced pointer
with no operations
int &a;
int* c = &a;
int& a = 1;
“get address of”
(not a reference)
int b; int &a = b;
(Now use ‘a’ as ‘b’)
CONFUSING SYNTAX
int a, b;
int c = a * b;
int* d = &a;
int e = *d;
int& f = a;
* means
• multiplication, or
• pointer, or
• dereference pointer
& means
• get address of, or
• reference
Same symbol, different meanings!
PASS BY X
void f(int a, int* b, int& c)
{
// changes to a are NOT reflected outside the function
// changes to b and c ARE reflected outside the function
}
main()
{
int a, b, c;
f(a, &b, c);
}
pass
by
value
pass
by
pointer
pass
by
reference
DOES
make a copy
does NOT
make a copy
PBP and PBR are different syntax for the same functionality
ARGUMENT PASSING /
RETURN
• Pass / return by value
• calls copy constructor
• ok for built-in types
int foo(int a) { return 0; }
• performance penalty for structs and classes (temporary objects)
• Pass / return by reference or pointer
• does not call copy constructor
• pass inputs by const reference
• never pass inputs by “plain” reference
void update(int& a); update(2); // error
• pass outputs by pointer
int x = 1; next(x); // should not change x
int x = 1; next(&x); // may change x
• ok to return a ref, or const ref
C++ FUNCTION
MECHANISMS
• Overloaded function names
• Cleaner and safer
print(int);
print(float);
• But beware
print(int); print(int*); print(0);
• Default parameters
void print(int a, int b=0, int c=0);
• Operator overloading
Matrix& operator+=(const Matrix& other);
• Implicit conversion operator
operator int() const {} // converts to int
• Provides convenient syntax, but potentially dangerous so use
sparingly
OPAQUE POINTERS
• An opaque pointer is used to hide the internal
implementation of a datatype
• Also called Pimpl (pointer to implementation) idiom,
or Cheshire Cat
• Example: The d-pointer is the only private data
member of the class and points to an instance of a
struct defined in the class' implementation file
http://en.wikipedia.org/wiki/Opaque_pointer
EXPLICIT TYPE
CONVERSION
• C++ casts
• static_cast between 2 related types
(int/float, int/enum, 2 pointers in class hierarchy)
• reinterpret_cast between 2 unrelated types
(int/ptr, pointers to 2 unrelated classes)
• const_cast cast away constness
• dynamic_cast used for polymorphic types
Run-time type info (RTTI)
• Avoid casts, but use these instead of C casts
• e.g., compiler can perform minimal checking for
static_cast, none for reinterpret_cast
NAMESPACES
• Namespace expresses logical grouping
• using declaration
• Don’t use global using except for transition to
older code
• Ok in namespace for composition
• Ok in function for notational convenience
• Namespaces are open
• Unnamed namespaces restrict code to local
translation unit
• Aliases ( namespace ShortName = LongName; )
CONST
• Const prevents object from being modified (orig., readonly)
• Avoid magic numbers
char a[128];
const int maxn = 128;
char a[maxn];
• Logical constness vs. physical constness
• Const is your friend; use it extensively and consistently
• can cast away constness, but be sure to use mutable
• const pointers:
• const int * const ptr = &a[0]; // const ptr to a const int
• int const * const ptr = &a[0]; // ”
• int * const p2 = &a[0]; // const ptr to an int
• const int * p1 = &a[0]; // ptr to a const int
• int const * p2 = &a[0]; // ”
ASSERT MACRO
• Assert allows the programmer to explicitly type assumptions
about expected inputs and values
• Use assert generously; it is your friend
• Assert helps to catch bugs early during development
• Assert is removed by precompiler before final release, so no run-
time penalty
• Use assert only to check values; do not change values!!!
#include <assert.h>
int GetValue(int index)
{
assert(index >= 0 && index < array.size());
if (index < 0 || index >= array.size())
return -1; // value should make sense
return array[index];
}
If performance is not a concern,
then it is okay to augment (but
not to replace) assert with an
extra check that will remain in
the final version.
INHERITANCE
• Subclass derived from base class
• Two classes should pass the “ISA” test:
derived class is a base class
class Shape {
};
class Circle : public Shape {
};
• Class hierarchy: means of building classes
incrementally, using building blocks
(subclass becomes base class for someone else)
• Facilitates code reuse
INHERITANCE VS.
COMPOSITION
• Inheritance: “is a”
class Circle : public Shape {
};
• Composition: “has a”
class Circle {
private:
Shape m_shape;
};
• Decision should be based on commonality of
interface
VIRTUAL FUNCTIONS
• Function of derived class is called even if you have only a pointer
to the base class
File.h
class Shape
{
virtual void Draw();
};
class Circle : public Shape
{
virtual void Draw();
};
File.cpp
void Func1()
{
Circle mycirc;
Func2(&mycirc);
}
void Func2(Shape* s)
{
s->Draw();
}
// calls Circle::Draw()
HOW A VIRTUAL
FUNCTION WORKS
Shape vtable
vfunc1 addr
vfunc2 addr
...
vfuncN addr
vfunc1 addr
vfunc2 addr
...
vfuncN addr
Circle vtable
var1
...
varM
vtable ptr
mycirc
var1
... varN
shape member
variables
circle member
variables
{
{
WHAT IS THE PENALTY OF
A VIRTUAL FUNCTION?
• Space:
• one vtable per class with virtual function(s)
• one pointer per instance
• Time:
• one extra dereference if type not known at compile time
• no penalty if type known at compile time
(ok to inline a virtual function)
PURE VIRTUAL FUNCTION
• Pure virtual function
• Function intentionally undefined
• Same penalty as regular virtual function
• Abstract class
• Contains at least one pure virtual function
• Cannot instantiate; must derive from base class and override pure virtual
function
• Provides an interface
(separates interface from implementation)
• Advice: virtual functions should always be pure virtual
• i.e., “Make non-leaf classes abstract” (Scott Meyers, Item 29)
• Also, “Don’t derive from concrete classes” (Herb Sutter, p. 137)
• More advice: Make virtual functions private (Herb Sutter, p. 134). This
separates the override implementation details from the public interface.
class Shape {
virtual void Draw() = 0;
};
MULTIPLE INHERITANCE
• C++ allows you to inherit from multiple base classes
• Works best if
• exactly one base class passes ISA test
• all other base classes are interfaces
• Advanced feature that is rarely needed
class MyDialog :
public CDialog, Observer {};
MyDialog is a CDialog
MyDialog needs a single method
from Observer (lightweight class)
(see MVC architecture)
POLYMORPHISM
• Polymorphism
• “ability to assume different forms”
• one object acts like many different types of objects
(e.g., Shape*)
• getting the right behavior without knowing the type
• manipulate objects with a common set of
operations
• Two types:
• Run-time (Virtual functions)
• Compile-time (Templates)
EXCEPTIONS
• Error handling in C:
• Half of code is error handling
• Dangerous: Easy for programmer to forget to check return
value
void Func() {
int ret;
ret = OpenDevice();
if (ret != 0) error(“Unable to open device”);
ret = SetParams();
if (ret != 0) error(“Unable to set params”);
}
EXCEPTIONS (CONT.)
• Error handling in C++:
• try-catch blocks safer
• separate “real code” from error handling code
void Func() {
try {
OpenDevice();
SetParams();
} catch (const MyException& e) {
e.ReportToUser();
} catch (...) {
abort(1);
}
}
void OpenDevice()
{
if (bad) throw MyException(“Cannot open device”);
}
TEMPLATES
• Define a class or function once, to work with a variety
of types
• Types may not be known until future
• Better type checking and faster (cf. qsort)
• Specialization can be used to reduce code bloat
• Templates support generic programming
template<typename T>
T Max(T a, T b) { return a>b ? a : b; }
template<typename T>
class Vector {
Vector(int n, T init_val);
T* m_vals;
};
GENERIC PROGRAMMING
• Drawbacks of qsort in <stdlib.h>
• requires a compare function, even if trivial
• loss of efficiency b/c dereferencing pointer
• lost type safety b/c void*
• only works with contiguous arrays
• no control over construction / destruction / assignment; all
swapping done by raw memory moves
STANDARD TEMPLATE
LIBRARY (STL)
• Containers:
• Sequences
• vector – array in contiguous memory (replaces realloc)
• list – doubly-linked list (insert/delete fast)
• deque (“deck”) – double-ended queue
• stack, queue, priority queue
• Associative
• map – dictionary; balanced tree of (key,value) pairs
like array with non-integer indices
• set – map with values ignored (only keys important)
• multimap, multiset (allow duplicate keys)
• Other
• string, basic_string – not necessarily contiguous
• valarray – vector for numeric computation
• bitset – set of N bits
STL (CONT.)
• Algorithms (60 of them):
• Nonmodifying
• find, search, mismatch, count, for_each
• Modifying
• copy, transform/apply, replace, remove
• Others
• unique, reverse, random_shuffle
• sort, merge, partition
• set_union, set_intersection, set_difference
• min, max, min_element, max_element
• next_permutation, prev_permutation
STD::STRING
• Example:
#include <string>
void Func()
{
std::string s, t;
char c = 'a';
s.push_back(c); // s is now “a”;
const char* cc = s.c_str(); // get ptr to “a”
const char dd[] = "afaf";
t = dd; // t is now “afaf”;
t = t + s; // append “a” to “afaf”
}
STD::VECTOR
• Example:
#include <vector>
void Func()
{
std::vector<int> v(10);
int a0 = v[3]; // unchecked access
int a1 = v.at(3); // checked access
v.push_back(2); // append element to end
v.pop_back(); // remove last element
size_t howbig = v.size(); // get # of elements
v.insert(v.begin()+5, 2); // insert 2 after 5th element
}
STD::VECTOR (CONT.)
• Example:
#include <vector>
#include <algorithm>
void Func()
{
std::vector<int> v(10);
v[5] = 3; // set fifth element to 3
std::vector<int>::const_iterator it
= std::find(v.begin(), v.end(), 3);
bool found = it != v.end();
if (found) {
int three = *it;
int indx = it - v.begin();
int four = 4;
}
}
ITERATORS
• iterator – generalized pointer
• Each container has its own type of iterator
void Func() {
stl::vector<int> v;
stl::vector<int>::const_iterator it = v.begin();
for (it = v.begin() ; it != v.end() ; it++) {
int val = *it;
}
}
TYPES OF ITERATORS
template<class InputIterator, class Type>
InputIterator
find( InputIterator _First,
InputIterator _Last,
const Type& _Val );
• Each container provides a
different type
input
forward
bidirectional
random access
output
Types
ALLOCATORS
• STL written for maximum flexibility
• Each container has an allocator
• Allocator is responsible for memory
management (new/delete)
template < class Type,
class Allocator = allocator<Type> >
class vector {
...
};
• Advice: Ignore allocators
STREAMS
• C
• flush, fprintf, fscanf, sprintf, sscanf
• fgets, getc
• C++
• cout, cin, cerr
BUFFER OVERRUN
• Never use sprintf!
• Use snprintf instead to avoid buffer overrun
• Or use std::stringstream
NUMERICS
• valarray
• matrix and vector (not std::vector)
• slices and gslices
• complex
• random numbers

Weitere ähnliche Inhalte

Ähnlich wie lecture02-cpp.ppt

Cs1123 11 pointers
Cs1123 11 pointersCs1123 11 pointers
Cs1123 11 pointers
TAlha MAlik
 
Oop c++class(final).ppt
Oop c++class(final).pptOop c++class(final).ppt
Oop c++class(final).ppt
Alok Kumar
 

Ähnlich wie lecture02-cpp.ppt (20)

Return of c++
Return of c++Return of c++
Return of c++
 
Objective-C for iOS Application Development
Objective-C for iOS Application DevelopmentObjective-C for iOS Application Development
Objective-C for iOS Application Development
 
Learn c++ Programming Language
Learn c++ Programming LanguageLearn c++ Programming Language
Learn c++ Programming Language
 
c++ Unit I.pptx
c++ Unit I.pptxc++ Unit I.pptx
c++ Unit I.pptx
 
cs8251 unit 1 ppt
cs8251 unit 1 pptcs8251 unit 1 ppt
cs8251 unit 1 ppt
 
Object oriented programming 7 first steps in oop using c++
Object oriented programming 7 first steps in oop using  c++Object oriented programming 7 first steps in oop using  c++
Object oriented programming 7 first steps in oop using c++
 
c++ Unit III - PPT.pptx
c++ Unit III - PPT.pptxc++ Unit III - PPT.pptx
c++ Unit III - PPT.pptx
 
L6
L6L6
L6
 
C som-programmeringssprog-bt
C som-programmeringssprog-btC som-programmeringssprog-bt
C som-programmeringssprog-bt
 
Templates in c++
Templates in c++Templates in c++
Templates in c++
 
Cs1123 11 pointers
Cs1123 11 pointersCs1123 11 pointers
Cs1123 11 pointers
 
introduction to c #
introduction to c #introduction to c #
introduction to c #
 
Oop c++class(final).ppt
Oop c++class(final).pptOop c++class(final).ppt
Oop c++class(final).ppt
 
Introduction Of C++
Introduction Of C++Introduction Of C++
Introduction Of C++
 
C++ Advanced Features
C++ Advanced FeaturesC++ Advanced Features
C++ Advanced Features
 
C++ Advanced Features
C++ Advanced FeaturesC++ Advanced Features
C++ Advanced Features
 
Getting Started with C++
Getting Started with C++Getting Started with C++
Getting Started with C++
 
Getting started with C++
Getting started with C++Getting started with C++
Getting started with C++
 
C language
C languageC language
C language
 
Templates2
Templates2Templates2
Templates2
 

Kürzlich hochgeladen

哪里办理美国宾夕法尼亚州立大学毕业证(本硕)psu成绩单原版一模一样
哪里办理美国宾夕法尼亚州立大学毕业证(本硕)psu成绩单原版一模一样哪里办理美国宾夕法尼亚州立大学毕业证(本硕)psu成绩单原版一模一样
哪里办理美国宾夕法尼亚州立大学毕业证(本硕)psu成绩单原版一模一样
qaffana
 
CHEAP Call Girls in Hauz Quazi (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Hauz Quazi  (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Hauz Quazi  (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Hauz Quazi (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
Escorts Service Arekere ☎ 7737669865☎ Book Your One night Stand (Bangalore)
Escorts Service Arekere ☎ 7737669865☎ Book Your One night Stand (Bangalore)Escorts Service Arekere ☎ 7737669865☎ Book Your One night Stand (Bangalore)
Escorts Service Arekere ☎ 7737669865☎ Book Your One night Stand (Bangalore)
amitlee9823
 
Lubrication and it's types and properties of the libricabt
Lubrication and it's types and properties of the libricabtLubrication and it's types and properties of the libricabt
Lubrication and it's types and properties of the libricabt
dineshkumar430venkat
 
CHEAP Call Girls in Mayapuri (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Mayapuri  (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Mayapuri  (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Mayapuri (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 

Kürzlich hochgeladen (20)

Get Premium Pimple Saudagar Call Girls (8005736733) 24x7 Rate 15999 with A/c ...
Get Premium Pimple Saudagar Call Girls (8005736733) 24x7 Rate 15999 with A/c ...Get Premium Pimple Saudagar Call Girls (8005736733) 24x7 Rate 15999 with A/c ...
Get Premium Pimple Saudagar Call Girls (8005736733) 24x7 Rate 15999 with A/c ...
 
(ISHITA) Call Girls Service Aurangabad Call Now 8617697112 Aurangabad Escorts...
(ISHITA) Call Girls Service Aurangabad Call Now 8617697112 Aurangabad Escorts...(ISHITA) Call Girls Service Aurangabad Call Now 8617697112 Aurangabad Escorts...
(ISHITA) Call Girls Service Aurangabad Call Now 8617697112 Aurangabad Escorts...
 
(PARI) Alandi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
(PARI) Alandi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts(PARI) Alandi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
(PARI) Alandi Call Girls Just Call 7001035870 [ Cash on Delivery ] Pune Escorts
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
哪里办理美国宾夕法尼亚州立大学毕业证(本硕)psu成绩单原版一模一样
哪里办理美国宾夕法尼亚州立大学毕业证(本硕)psu成绩单原版一模一样哪里办理美国宾夕法尼亚州立大学毕业证(本硕)psu成绩单原版一模一样
哪里办理美国宾夕法尼亚州立大学毕业证(本硕)psu成绩单原版一模一样
 
@Delhi ! CAll GIRLS IN Defence Colony 🦋 9999965857 🤩 Dwarka Call Girls
@Delhi ! CAll GIRLS IN Defence Colony 🦋 9999965857 🤩 Dwarka Call Girls@Delhi ! CAll GIRLS IN Defence Colony 🦋 9999965857 🤩 Dwarka Call Girls
@Delhi ! CAll GIRLS IN Defence Colony 🦋 9999965857 🤩 Dwarka Call Girls
 
CHEAP Call Girls in Hauz Quazi (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Hauz Quazi  (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Hauz Quazi  (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Hauz Quazi (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
Top Rated Pune Call Girls Katraj ⟟ 6297143586 ⟟ Call Me For Genuine Sex Serv...
Top Rated  Pune Call Girls Katraj ⟟ 6297143586 ⟟ Call Me For Genuine Sex Serv...Top Rated  Pune Call Girls Katraj ⟟ 6297143586 ⟟ Call Me For Genuine Sex Serv...
Top Rated Pune Call Girls Katraj ⟟ 6297143586 ⟟ Call Me For Genuine Sex Serv...
 
Book Paid Lohegaon Call Girls Pune 8250192130Low Budget Full Independent High...
Book Paid Lohegaon Call Girls Pune 8250192130Low Budget Full Independent High...Book Paid Lohegaon Call Girls Pune 8250192130Low Budget Full Independent High...
Book Paid Lohegaon Call Girls Pune 8250192130Low Budget Full Independent High...
 
Call Girls in Nagpur Sakshi Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Sakshi Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur Sakshi Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Sakshi Call 7001035870 Meet With Nagpur Escorts
 
Call Girls Kothrud Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Kothrud Call Me 7737669865 Budget Friendly No Advance BookingCall Girls Kothrud Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Kothrud Call Me 7737669865 Budget Friendly No Advance Booking
 
VVIP Pune Call Girls Warje (7001035870) Pune Escorts Nearby with Complete Sat...
VVIP Pune Call Girls Warje (7001035870) Pune Escorts Nearby with Complete Sat...VVIP Pune Call Girls Warje (7001035870) Pune Escorts Nearby with Complete Sat...
VVIP Pune Call Girls Warje (7001035870) Pune Escorts Nearby with Complete Sat...
 
Book Sex Workers Available Pune Call Girls Yerwada 6297143586 Call Hot India...
Book Sex Workers Available Pune Call Girls Yerwada  6297143586 Call Hot India...Book Sex Workers Available Pune Call Girls Yerwada  6297143586 Call Hot India...
Book Sex Workers Available Pune Call Girls Yerwada 6297143586 Call Hot India...
 
Kalyan callg Girls, { 07738631006 } || Call Girl In Kalyan Women Seeking Men ...
Kalyan callg Girls, { 07738631006 } || Call Girl In Kalyan Women Seeking Men ...Kalyan callg Girls, { 07738631006 } || Call Girl In Kalyan Women Seeking Men ...
Kalyan callg Girls, { 07738631006 } || Call Girl In Kalyan Women Seeking Men ...
 
Escorts Service Arekere ☎ 7737669865☎ Book Your One night Stand (Bangalore)
Escorts Service Arekere ☎ 7737669865☎ Book Your One night Stand (Bangalore)Escorts Service Arekere ☎ 7737669865☎ Book Your One night Stand (Bangalore)
Escorts Service Arekere ☎ 7737669865☎ Book Your One night Stand (Bangalore)
 
Lubrication and it's types and properties of the libricabt
Lubrication and it's types and properties of the libricabtLubrication and it's types and properties of the libricabt
Lubrication and it's types and properties of the libricabt
 
CHEAP Call Girls in Mayapuri (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Mayapuri  (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Mayapuri  (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Mayapuri (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
Top Rated Pune Call Girls Ravet ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...
Top Rated  Pune Call Girls Ravet ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...Top Rated  Pune Call Girls Ravet ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...
Top Rated Pune Call Girls Ravet ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...
 
Call Girls in Thane 9892124323, Vashi cAll girls Serivces Juhu Escorts, powai...
Call Girls in Thane 9892124323, Vashi cAll girls Serivces Juhu Escorts, powai...Call Girls in Thane 9892124323, Vashi cAll girls Serivces Juhu Escorts, powai...
Call Girls in Thane 9892124323, Vashi cAll girls Serivces Juhu Escorts, powai...
 
Top Rated Pune Call Girls Chakan ⟟ 6297143586 ⟟ Call Me For Genuine Sex Serv...
Top Rated  Pune Call Girls Chakan ⟟ 6297143586 ⟟ Call Me For Genuine Sex Serv...Top Rated  Pune Call Girls Chakan ⟟ 6297143586 ⟟ Call Me For Genuine Sex Serv...
Top Rated Pune Call Girls Chakan ⟟ 6297143586 ⟟ Call Me For Genuine Sex Serv...
 

lecture02-cpp.ppt

  • 1. INTRO TO C & C++ ECE 417/617: Elements of Software Engineering Mzgeen .T .F UOD University
  • 2. RECOMMENDED C++ RESOURCES • Bjarne Stroustrup, The C++ Programming Language • Scott Meyers, Effective C++
  • 3. WHY C++? • Popular and relevant (used in nearly every application domain): • end-user applications (Word, Excel, PowerPoint, Photoshop, Acrobat, Quicken, games) • operating systems (Windows 9x, NT, XP; IBM’s K42; some Apple OS X) • large-scale web servers/apps (Amazon, Google) • central database control (Israel’s census bureau; Amadeus; Morgan- Stanley financial modeling) • communications (Alcatel; Nokia; 800 telephone numbers; major transmission nodes in Germany and France) • numerical computation / graphics (Maya) • device drivers under real-time constraints • Stable, compatible, scalable
  • 4. C VS. C++ • C++ is C incremented (orig., “C with classes”) • C++ is more expressive (fewer C++ source lines needed than C source lines for same program) • C++ is just as permissive (anything you can do in C can also be done in C++) • C++ can be just as efficient (most C++ expressions need no run-time support; C++ allows you to • manipulate bits directly and interface with hardware without regard for safety or ease of comprehension, BUT • hide these details behind a safe, clean, elegant interface) • C++ is more maintainable (1000 lines of code – even brute force, spaghetti code will work; 100,000 lines of code – need good structure, or new errors will be introduced as quickly as old errors are removed)
  • 5. EFFICIENCY AND MAINTAINABILITY 90/10 rule: 10% of your program will take 90% of the processor time to run optimize what needs to be optimized, but no more focus on design
  • 6. DESIGN GOALS OF C++ • Backward compatibility with C (almost completely – every program in K&R is a C++ program – but additional keywords can cause problems) • Simplicity, elegance (few built-in data types, e.g., no matrices) • Support for user-defined data types (act like built-in types; N.B. Standard Template Library (STL)) • No compromise in efficiency, run-time or memory (unless “advanced features” used) • Compilation analysis to prevent accidental corruption of data (type-checking and data hiding) • Support object-oriented style of programming
  • 7. COMPATIBILITY WITH C C++ does not allow • old-style C function declarations void f(a) int a; {} • generic function declarations void f(); void g() { f(2); } • setting enum to int enum Dir {Up, Down}; Dir d=1; • multiple declarations int i; int i; • assigning to void * int* p = malloc(10); • “implicit int” signed a = 7; Other differences: • const global variables have internal linkage in C++, external in C • extra keywords in C++ void main() { int catch = 5; } • bizarre comments int f(int a, int b) { return a//**/b ; } How is C++ not backward compatible with C (C89)? (For these, C++ is backward compatible with C99)
  • 8. PURPOSE OF A PROGRAMMING LANGUAGE • Programming languages serve two purposes: • vehicle for specifying actions to be executed “close to the machine” • set of concepts for thinking about what can be done “close to the problem being solved” • Object-oriented C++ excels at both
  • 9. LEARNING C++ • Goal: Don’t just learn new syntax, but become a better programmer and designer; learn new and better ways of building systems • Be willing to learn C++’s style; don’t force another style into it • C++ supports gradual learning • Use what you know • As you learn new features and techniques, add those tools to your toolbox • C++ supports variety of programming paradigms
  • 10. PROGRAMMING PARADIGMS • procedural – implement algorithms via functions (variables, functions, etc.) • modular – partition program into modules (separate compilation) • object-oriented – divide problem into classes (data hiding, inheritance) • abstract – separate interface from implementation (abstract classes) • generic – manipulate arbitrary data types (STL: containers, algorithms)
  • 11. WHAT IS OBJECT- ORIENTED? • Encapsulation “black box” – internal data hidden • Inheritance related classes share implementation and/or interface • Polymorphism ability to use a class without knowing its type © SDC “C++ is an object-oriented language” = C++ provides mechanisms that support object-oriented style of programming
  • 12. SOME C++ CONCEPTS • constructor / destructor / copy constructor • initialization list • inheritance • exceptions • overloading operators (e.g., assignment operator) • namespace • const • virtual function • pure virtual (abstract) function • friend • template • standard template library (STL) • pass by value, pass by reference • composition versus derivation
  • 13. A SIMPLE C++ PROGRAM #include <iostream> // std::cout #include <cstdio> // printf int main() { int a = 5; // 'a' is L-value float b = 0.9f; printf("Hello world %d %3.1f n", a, b); std::cout << "Hello world" << a << " " << b << " " << std::endl; return 0; }
  • 14. DECLARATIONS AND DEFINITIONS • Declaration: • extern char c; • struct User; • double sqrt(double);  Okay to have many • Definition: • char c; • int count = 1; • double abs(double a) { a>0 ? a : -a; }  Must have exactly one
  • 15. FUNDAMENTAL TYPES • bool (true  1, false  0) • char (could be signed or unsigned – implementation-defined) • int (signed by default) • double • void (“pseudo-type”) • enum • class • also short, long, struct, float, wchar_t, etc.) Do not rely on sizes of these! (Implementation-dependent) INTEGRAL ARITHMETIC USER-DEFINED
  • 16. MACROS • Dangerous: • compiler never sees them source code  translation unit • global • Instead, use • const • inline • template • enum • Ok to use for include guards (“header wrappers”) • If you must use a macro, give it a long ugly name with lots of capital letters Example: template<typename T> inline T max(T t){ t>0 ? t : -t; }
  • 17. MEMORY ALLOCATION • “on the stack” • block delimited by {} • object alive till it falls out of scope • calls constructor / destructor • “on the heap” • new and delete replace malloc, calloc, free • object exists independently of scope in which it was created • also “on the free store” or “allocated in dynamic memory” • be careful: new  delete, new[]  delete[] • for safety, same object should both allocate and deallocate • “local static store” void foo() { static int i=0; }
  • 18. GLOBAL VARIABLES • Built-in types initialized to 0 (but local variables uninitialized) • Initialized before main() invoked • Initialization order: • within translation unit, same as definition • between translation units, arbitrary order file1.cpp double pi = 3.14; file2.cpp double twopi = 2*pi; Bad! No guarantee that twopi will be initialized correctly
  • 19. A CLASS class Date { public: enum Month {Jan, Feb, Mar, ...} Date(int year, Month month, int day); int GetDay() const; void SetDay(int day); Date& operator+=(int days); private: Month m_month; int m_year, m_day; }; member functions (methods) member variables
  • 20. STRUCT VS. CLASS • In C++, no difference b/w struct and class (except default public vs. private) • In C++, struct can have • member variables • methods • public, private, and protected • virtual functions • etc. • Rule of thumb: • Use struct when member variables are public (just a container) • Use class otherwise
  • 21. OO IN C • In C, a struct can have both member variables and methods: • In C++, syntax is simpler: void CreateFoo() { } struct Foo { void (*Construct)(); int m_data; }; int main() { struct Foo a; a.Construct = &CreateFoo; a.Construct(); } struct Foo { Foo() int m_data; }; Foo::Foo() { } int main() { Foo a; }
  • 22. NAMES • Maintain consistent naming style • long names for large scope • short names for small scope • Don’t start with underscore; reserved for special facilities • Avoid similar-looking names: l and 1 • Choosing good names is an art
  • 23. ACCESS CONTROL • Public: visible to everyone • Private: visible only to the implementer of this particular class • Protected: visible to this class and derived classes • Good rule of thumb: • member functions (methods): • if non-virtual, then public or protected • if virtual, then private • member variables should be private (except in the case of a struct)
  • 24. THE BIG FOUR • By default, each class has four methods: • constructor Date(); • destructor ~Date(); • copy constructor Date(const Date& other); • assignment operator Date& operator=(const Date& other); • These call the appropriate functions on each member variable • Be careful: If this is not what you want, then either override or disallow (by making private)
  • 25. CONSTRUCTOR AND DESTRUCTOR • (Copy) constructor creates object • Destructor destroys (“cleans up”) object • Be aware of temporary objects class Matrix { Matrix(const Matrix& other); Matrix operator+(const Matrix& other) const; Matrix& operator=(const Matrix& other); }; void foo() { Matrix a, b, c, d; a = b + c + d; } What functions get called? (Note: There are ways to speed this up while preserving the syntax)
  • 26. EXAMPLE Suppose we have a simple class. class A { public: A() { printf("conn"); } A(const A& other) { printf("copyconn"); } ~A() { printf("desn"); } A& operator=(const A& other) { printf("assignn"); return *this; } };
  • 27. EXAMPLE 1 What is the output of the following program? 01 { 02 A a; 03 A* b = new A(); 04 *b = a; 05 delete b; 06 A c = a; 07 } 02 con 03 con 04 assign 05 des 06 copycon 07 des 07 des
  • 28. EXAMPLE 2 What is the output of the following program? 01 void F(const A& f, A* g, A h) 02 { 03 *g = f; 04 } 05 { 06 A a, b; 07 F( a, &b, a); 08 } 06 con 06 con 01 copycon 03 assign 04 des 08 des 08 des
  • 29. EXAMPLE 3 What is the output of the following program? 01 A F() 02 { 03 A tmp; 04 return tmp; 05 } 06 { 07 A a = F(); 08 } (VC++ 6.0 -- Windows) 03 con 07 copycon 05 des 08 des (g++ 3.4.3 -- Linux) 07 con 08 des
  • 30. AVOID NEW AND DELETE • Whenever possible, avoid ‘new’ and ‘delete’ • Instead create object on stack • Automatic destructor makes things easier • No need to worry about forgetting to delete the object (memory leak) or deleting the wrong object (crash) • If you must use ‘new’, then try to keep the ‘delete’ nearby • This helps code maintenance – otherwise it is hard to keep track of the new/delete pairs
  • 31. WHEN TO USE NEW AND DELETE • Sometimes you have to use new and delete • And sometimes the pair cannot be close together • Oh well • The next slide shows an example where we need to break both of these rules
  • 32. AN EXAMPLE OF NEW/DELETE • You have a base class: class Command { virtual DoSomething(); }; • You have several derived classes: class CommandAdd : public Command {}; class CommandMove : public Command {}; class CommandSet : public Command {}; • You have a list of objects whose types are unknown at compile time (polymorphism): std::vector<Command*> undo_list; • Must put pointers in list – not actual objects – because the objects may be of different sizes (among other reasons) • Someone creates the object and puts its pointer on the list: undo_list.push_back( new CommandAdd() ); • Later the object is removed from the list and deleted: Command* com = undo_list.back(); undo_list.pop(); com->DoSomething(); // call a virtual method delete com;
  • 33. INITIALIZER LISTS Matrix::Matrix(const Matrix& other) : m_n(0), m_a(0) { } Matrix::Matrix(const Matrix& other) { m_n = 0; m_a = 0; } Use initializer list: Assign values inside constructor:
  • 34. CONCRETE CLASSES • A concrete class • does a single, relatively small thing well and efficiently • hides data members (encapsulation) • provides clean interface • acts like a built-in type • is a “foundation of elegant programming” – Stroustrup • Don’t underestimate the importance of this basic C++/OO feature!
  • 35. CLASS RELATIONSHIPS • OK: • A calls function from B • A creates B • A has a data member of type B • Bad: • A uses data directly from B (without using B’s interface) • Even worse: • A directly manipulates data in B
  • 36. POINTERS, ARRAYS, REFERENCES • Use 0, not NULL (stronger type checking) • Name of array is equivalent to pointer to initial element • Access array using * or []; same efficiency with modern compiler • use std::vector, not built-in array, when possible • Reference is like a pointer
  • 37. REFERENCES • Reference: alternate name for an object (alias) • There is no null reference • No reference to a temporary • Syntax confusing • Basically a const dereferenced pointer with no operations int &a; int* c = &a; int& a = 1; “get address of” (not a reference) int b; int &a = b; (Now use ‘a’ as ‘b’)
  • 38. CONFUSING SYNTAX int a, b; int c = a * b; int* d = &a; int e = *d; int& f = a; * means • multiplication, or • pointer, or • dereference pointer & means • get address of, or • reference Same symbol, different meanings!
  • 39. PASS BY X void f(int a, int* b, int& c) { // changes to a are NOT reflected outside the function // changes to b and c ARE reflected outside the function } main() { int a, b, c; f(a, &b, c); } pass by value pass by pointer pass by reference DOES make a copy does NOT make a copy PBP and PBR are different syntax for the same functionality
  • 40. ARGUMENT PASSING / RETURN • Pass / return by value • calls copy constructor • ok for built-in types int foo(int a) { return 0; } • performance penalty for structs and classes (temporary objects) • Pass / return by reference or pointer • does not call copy constructor • pass inputs by const reference • never pass inputs by “plain” reference void update(int& a); update(2); // error • pass outputs by pointer int x = 1; next(x); // should not change x int x = 1; next(&x); // may change x • ok to return a ref, or const ref
  • 41. C++ FUNCTION MECHANISMS • Overloaded function names • Cleaner and safer print(int); print(float); • But beware print(int); print(int*); print(0); • Default parameters void print(int a, int b=0, int c=0); • Operator overloading Matrix& operator+=(const Matrix& other); • Implicit conversion operator operator int() const {} // converts to int • Provides convenient syntax, but potentially dangerous so use sparingly
  • 42. OPAQUE POINTERS • An opaque pointer is used to hide the internal implementation of a datatype • Also called Pimpl (pointer to implementation) idiom, or Cheshire Cat • Example: The d-pointer is the only private data member of the class and points to an instance of a struct defined in the class' implementation file http://en.wikipedia.org/wiki/Opaque_pointer
  • 43. EXPLICIT TYPE CONVERSION • C++ casts • static_cast between 2 related types (int/float, int/enum, 2 pointers in class hierarchy) • reinterpret_cast between 2 unrelated types (int/ptr, pointers to 2 unrelated classes) • const_cast cast away constness • dynamic_cast used for polymorphic types Run-time type info (RTTI) • Avoid casts, but use these instead of C casts • e.g., compiler can perform minimal checking for static_cast, none for reinterpret_cast
  • 44. NAMESPACES • Namespace expresses logical grouping • using declaration • Don’t use global using except for transition to older code • Ok in namespace for composition • Ok in function for notational convenience • Namespaces are open • Unnamed namespaces restrict code to local translation unit • Aliases ( namespace ShortName = LongName; )
  • 45. CONST • Const prevents object from being modified (orig., readonly) • Avoid magic numbers char a[128]; const int maxn = 128; char a[maxn]; • Logical constness vs. physical constness • Const is your friend; use it extensively and consistently • can cast away constness, but be sure to use mutable • const pointers: • const int * const ptr = &a[0]; // const ptr to a const int • int const * const ptr = &a[0]; // ” • int * const p2 = &a[0]; // const ptr to an int • const int * p1 = &a[0]; // ptr to a const int • int const * p2 = &a[0]; // ”
  • 46. ASSERT MACRO • Assert allows the programmer to explicitly type assumptions about expected inputs and values • Use assert generously; it is your friend • Assert helps to catch bugs early during development • Assert is removed by precompiler before final release, so no run- time penalty • Use assert only to check values; do not change values!!! #include <assert.h> int GetValue(int index) { assert(index >= 0 && index < array.size()); if (index < 0 || index >= array.size()) return -1; // value should make sense return array[index]; } If performance is not a concern, then it is okay to augment (but not to replace) assert with an extra check that will remain in the final version.
  • 47. INHERITANCE • Subclass derived from base class • Two classes should pass the “ISA” test: derived class is a base class class Shape { }; class Circle : public Shape { }; • Class hierarchy: means of building classes incrementally, using building blocks (subclass becomes base class for someone else) • Facilitates code reuse
  • 48. INHERITANCE VS. COMPOSITION • Inheritance: “is a” class Circle : public Shape { }; • Composition: “has a” class Circle { private: Shape m_shape; }; • Decision should be based on commonality of interface
  • 49. VIRTUAL FUNCTIONS • Function of derived class is called even if you have only a pointer to the base class File.h class Shape { virtual void Draw(); }; class Circle : public Shape { virtual void Draw(); }; File.cpp void Func1() { Circle mycirc; Func2(&mycirc); } void Func2(Shape* s) { s->Draw(); } // calls Circle::Draw()
  • 50. HOW A VIRTUAL FUNCTION WORKS Shape vtable vfunc1 addr vfunc2 addr ... vfuncN addr vfunc1 addr vfunc2 addr ... vfuncN addr Circle vtable var1 ... varM vtable ptr mycirc var1 ... varN shape member variables circle member variables { {
  • 51. WHAT IS THE PENALTY OF A VIRTUAL FUNCTION? • Space: • one vtable per class with virtual function(s) • one pointer per instance • Time: • one extra dereference if type not known at compile time • no penalty if type known at compile time (ok to inline a virtual function)
  • 52. PURE VIRTUAL FUNCTION • Pure virtual function • Function intentionally undefined • Same penalty as regular virtual function • Abstract class • Contains at least one pure virtual function • Cannot instantiate; must derive from base class and override pure virtual function • Provides an interface (separates interface from implementation) • Advice: virtual functions should always be pure virtual • i.e., “Make non-leaf classes abstract” (Scott Meyers, Item 29) • Also, “Don’t derive from concrete classes” (Herb Sutter, p. 137) • More advice: Make virtual functions private (Herb Sutter, p. 134). This separates the override implementation details from the public interface. class Shape { virtual void Draw() = 0; };
  • 53. MULTIPLE INHERITANCE • C++ allows you to inherit from multiple base classes • Works best if • exactly one base class passes ISA test • all other base classes are interfaces • Advanced feature that is rarely needed class MyDialog : public CDialog, Observer {}; MyDialog is a CDialog MyDialog needs a single method from Observer (lightweight class) (see MVC architecture)
  • 54. POLYMORPHISM • Polymorphism • “ability to assume different forms” • one object acts like many different types of objects (e.g., Shape*) • getting the right behavior without knowing the type • manipulate objects with a common set of operations • Two types: • Run-time (Virtual functions) • Compile-time (Templates)
  • 55. EXCEPTIONS • Error handling in C: • Half of code is error handling • Dangerous: Easy for programmer to forget to check return value void Func() { int ret; ret = OpenDevice(); if (ret != 0) error(“Unable to open device”); ret = SetParams(); if (ret != 0) error(“Unable to set params”); }
  • 56. EXCEPTIONS (CONT.) • Error handling in C++: • try-catch blocks safer • separate “real code” from error handling code void Func() { try { OpenDevice(); SetParams(); } catch (const MyException& e) { e.ReportToUser(); } catch (...) { abort(1); } } void OpenDevice() { if (bad) throw MyException(“Cannot open device”); }
  • 57. TEMPLATES • Define a class or function once, to work with a variety of types • Types may not be known until future • Better type checking and faster (cf. qsort) • Specialization can be used to reduce code bloat • Templates support generic programming template<typename T> T Max(T a, T b) { return a>b ? a : b; } template<typename T> class Vector { Vector(int n, T init_val); T* m_vals; };
  • 58. GENERIC PROGRAMMING • Drawbacks of qsort in <stdlib.h> • requires a compare function, even if trivial • loss of efficiency b/c dereferencing pointer • lost type safety b/c void* • only works with contiguous arrays • no control over construction / destruction / assignment; all swapping done by raw memory moves
  • 59. STANDARD TEMPLATE LIBRARY (STL) • Containers: • Sequences • vector – array in contiguous memory (replaces realloc) • list – doubly-linked list (insert/delete fast) • deque (“deck”) – double-ended queue • stack, queue, priority queue • Associative • map – dictionary; balanced tree of (key,value) pairs like array with non-integer indices • set – map with values ignored (only keys important) • multimap, multiset (allow duplicate keys) • Other • string, basic_string – not necessarily contiguous • valarray – vector for numeric computation • bitset – set of N bits
  • 60. STL (CONT.) • Algorithms (60 of them): • Nonmodifying • find, search, mismatch, count, for_each • Modifying • copy, transform/apply, replace, remove • Others • unique, reverse, random_shuffle • sort, merge, partition • set_union, set_intersection, set_difference • min, max, min_element, max_element • next_permutation, prev_permutation
  • 61. STD::STRING • Example: #include <string> void Func() { std::string s, t; char c = 'a'; s.push_back(c); // s is now “a”; const char* cc = s.c_str(); // get ptr to “a” const char dd[] = "afaf"; t = dd; // t is now “afaf”; t = t + s; // append “a” to “afaf” }
  • 62. STD::VECTOR • Example: #include <vector> void Func() { std::vector<int> v(10); int a0 = v[3]; // unchecked access int a1 = v.at(3); // checked access v.push_back(2); // append element to end v.pop_back(); // remove last element size_t howbig = v.size(); // get # of elements v.insert(v.begin()+5, 2); // insert 2 after 5th element }
  • 63. STD::VECTOR (CONT.) • Example: #include <vector> #include <algorithm> void Func() { std::vector<int> v(10); v[5] = 3; // set fifth element to 3 std::vector<int>::const_iterator it = std::find(v.begin(), v.end(), 3); bool found = it != v.end(); if (found) { int three = *it; int indx = it - v.begin(); int four = 4; } }
  • 64. ITERATORS • iterator – generalized pointer • Each container has its own type of iterator void Func() { stl::vector<int> v; stl::vector<int>::const_iterator it = v.begin(); for (it = v.begin() ; it != v.end() ; it++) { int val = *it; } }
  • 65. TYPES OF ITERATORS template<class InputIterator, class Type> InputIterator find( InputIterator _First, InputIterator _Last, const Type& _Val ); • Each container provides a different type input forward bidirectional random access output Types
  • 66. ALLOCATORS • STL written for maximum flexibility • Each container has an allocator • Allocator is responsible for memory management (new/delete) template < class Type, class Allocator = allocator<Type> > class vector { ... }; • Advice: Ignore allocators
  • 67. STREAMS • C • flush, fprintf, fscanf, sprintf, sscanf • fgets, getc • C++ • cout, cin, cerr
  • 68. BUFFER OVERRUN • Never use sprintf! • Use snprintf instead to avoid buffer overrun • Or use std::stringstream
  • 69. NUMERICS • valarray • matrix and vector (not std::vector) • slices and gslices • complex • random numbers