Professional Documents
Culture Documents
A bit of C++
P2 A bit of C++
Roadmap
>
>
>
>
>
C++ vs C
C++ vs Java
References vs pointers
C++ classes: Orthodox Canonical Form
A quick look at STL The Standard Template Library
O. Nierstrasz
P2 A bit of C++
Roadmap
>
>
>
>
>
C++ vs C
C++ vs Java
References vs pointers
C++ classes: Orthodox Canonical Form
A quick look at STL The Standard Template Library
O. Nierstrasz
P2 A bit of C++
>
>
>
>
>
>
O. Nierstrasz
P2 A bit of C++
O. Nierstrasz
11.5
P2 A bit of C++
What is C?
>
O. Nierstrasz
P2 A bit of C++
My first C Program
Include standard io
declarations
A preprocessor directive
#include<stdio.h>
Write to
standard
output
intmain(void)
{
printf("hello,world\n");
return0;
}
char array
Indicate correct termination
O. Nierstrasz
P2 A bit of C++
What is C++?
A better C (http://www.research.att.com/~bs/C++.html)
that supports:
> Systems programming
> Object-oriented programming (classes & inheritance)
> Programming-in-the-large (namespaces, exceptions)
> Generic programming (templates)
> Reuse (large class & template libraries)
O. Nierstrasz
P2 A bit of C++
C++ vs C
Most C programs are also C++ programs.
Nevertheless, good C++ programs usually do not resemble C:
> avoid macros (use inline)
> avoid pointers (use references)
> avoid malloc and free (use new and delete)
> avoid arrays and char* (use vectors and strings) ...
> avoid structs (use classes)
C++ encourages a different style of programming:
> avoid procedural programming
model your domain with classes and templates
O. Nierstrasz
P2 A bit of C++
Roadmap
>
>
>
>
>
C++ vs C
C++ vs Java
References vs pointers
C++ classes: Orthodox Canonical Form
A quick look at STL The Standard Template Library
O. Nierstrasz
10
P2 A bit of C++
packagep2;
//MyfirstJavaprogram!
publicclassHelloMain{
publicstaticvoidmain(String[]args){
System.out.println("helloworld!");
return0;
}
}
O. Nierstrasz
11
P2 A bit of C++
A C++ comment
cout is an
instance of
ostream
O. Nierstrasz
Include standard
iostream classes
usingnamespacestd;
#include<iostream>
//MyfirstC++program!
intmain(void)
{
cout<<"helloworld!"<<endl;
return0;
}
operator overloading
(two different argument types!)
12
P2 A bit of C++
c++helloWorld.cppohelloWorld
helloWorld:helloWorld.cpp
c++$@.cppo$@
makehelloWorld
O. Nierstrasz
13
P2 A bit of C++
>
>
Run-time efficiency
O. Nierstrasz
14
P2 A bit of C++
C++ Features
C with Classes
C++ 1.0 (1985)
C++ 2.0
C++ 3.0
ANSI C++ (1998)
O. Nierstrasz
Classes as structs
Inheritance; virtual functions
Inline functions
Strong typing; function prototypes
new and delete operators
Local classes; protected members
Multiple inheritance
Templates
Exception handling
Namespaces
RTTI (Runtime Type Information)
15
P2 A bit of C++
Similarities:
> primitive data types (in Java,
platform independent)
> syntax: control structures,
exceptions ...
> classes, visibility declarations
(public, private)
> multiple constructors, this, new
> types, type casting (safe in Java,
not in C++)
> comments
O. Nierstrasz
16
P2 A bit of C++
>
>
>
>
>
>
>
>
>
>
>
O. Nierstrasz
17
P2 A bit of C++
New Keywords
In addition the keywords inherited from C, C++ adds:
Exceptions
catch,throw,try
Declarations:
bool,class,enum,explicit,export,
friend,inline,mutable,namespace,
operator,private,protected,public,
template,typename,using,virtual,
volatile,wchar_t
Expressions:
and,and_eq,bitand,bitor,compl,
const_cast,delete,dynamic_cast,
false,new,not,not_eq,or,or_eq,
reinterpret_cast,static_cast,this,
true,typeid,xor,xor_eq
O. Nierstrasz
(see http://www.glenmccl.com/glos.htm)
18
P2 A bit of C++
Roadmap
>
>
>
>
>
C++ vs C
C++ vs Java
References vs pointers
C++ classes: Orthodox Canonical Form
A quick look at STL The Standard Template Library
O. Nierstrasz
19
P2 A bit of C++
Memory Layout
The address space consists of (at least):
Text:
Static:
static data
Heap:
Stack:
O. Nierstrasz
20
P2 A bit of C++
Pointers in C++
inti;
int*iPtr;//apointertoaninteger
iPtr=&i;//iPtrcontainstheaddressofI
*iPtr=100;
variable
i
iPtr
O. Nierstrasz
value
100
456FD4
Address in hex
456FD4
456FD0
21
P2 A bit of C++
References
A reference is an alias for another variable:
inti=10;
int&ir=i;
ir=ir+1;
i,ir
10
//reference(alias)
//incrementi
22
P2 A bit of C++
References vs Pointers
>
O. Nierstrasz
23
P2 A bit of C++
C++ Classes
C++ classes may be instantiated either automatically (on the stack):
MyClassoVal;
//constructorcalled
//destroyedwhenscopeends
//uninitializedpointer
oPtr=newMyClass;
//constructorcalled
//mustbeexplicitlydeleted
O. Nierstrasz
24
P2 A bit of C++
25
P2 A bit of C++
//returnsareference
//automatic
//dynamic
//returnsareference(!)tob
//agoesoutofscope
voidfinish(MyClass&b){
delete&b;
}
//needpointertob
#include"MyClass.h
finish(start());
}
return 0;
using namespace std;
int main (int argc, char **argv) {
MyClass aClass("d");
O. Nierstrasz
created
createa
createb
destroya
destroyb
destroyd
26
P2 A bit of C++
Roadmap
>
>
>
>
>
C++ vs C
C++ vs Java
References vs pointers
C++ classes: Orthodox Canonical Form
A quick look at STL The Standard Template Library
O. Nierstrasz
27
P2 A bit of C++
O. Nierstrasz
28
P2 A bit of C++
Why OCF?
If you dont define these four member functions, C++ will generate
them:
>
default constructor
>
destructor
>
copy constructor
>
assignment
O. Nierstrasz
29
P2 A bit of C++
30
P2 A bit of C++
A Simple String.h
Returns a
reference
to ostream
Operator
overloading
A friend function
prototype
declaration of the
String class
classString
{
friendostream&operator<<(ostream&,constString&);
public:
String(void);
//defaultconstructor
Operator
~String(void);
//destructor
//copyconstructor overloading
inline String(constString©);
String(constchar*s);
//char*constructor
String&operator=(constString&);
//assignment
of =
inlineintlength(void)const{return::strlen(_s);}
char&operator[](constintn)throw(exception);
String&operator+=(constString&)throw(exception); //concatenation
private:
char*_s;//invariant:_spointstoanullterminatedheapstring
voidbecome(constchar*)throw(exception); //internalcopyfunction
};
O. Nierstrasz
31
P2 A bit of C++
Default Constructors
Every constructor should establish the class invariant:
Allocate
String::String(void) memory for the
{
string
_s=newchar[1];
_s[0]='\0';
//allocateachararray
//NULLterminateit!
O. Nierstrasz
//callString::String()
//callittentimes!
32
P2 A bit of C++
Destructors
The String destructor must explicitly free any memory
allocated by that object.
String::~String(void)
{
delete[]_s;
}
free memory
33
P2 A bit of C++
Copy Constructors
Our String copy constructor must create a deep copy:
String::String(constString©)
{
become(copy._s);
//callhelper
}
voidString::become(constchar*s)throw(exception)
{
_s=newchar[::strlen(s)+1];
if(_s==0)throw(logic_error("newfailed"));
::strcpy(_s,s);
}
From std
O. Nierstrasz
34
P2 A bit of C++
>
>
>
O. Nierstrasz
35
P2 A bit of C++
Other Constructors
Class constructors may have arbitrary arguments, as long
as their signatures are unique and unambiguous:
String::String(constchar*s)
{
become(s);
}
36
P2 A bit of C++
Assignment Operators
Assignment is different from the copy constructor because an instance
already exists:
String&String::operator=(constString©)
{
if(this!=©){
//takecare!
delete[]_s;
become(copy._s);
}
return*this;
//NB:areference,notacopy
}
> Return String& rather than void so the result can be used in an
expression
> Return String& rather than String so the result wont be copied!
> this is a pseudo-variable whose value is a pointer to the current
object
O. Nierstrasz
37
P2 A bit of C++
Implicit Conversion
When an argument of the wrong type is passed to a
function, the C++ compiler looks for a constructor that will
convert it to the right type:
str="helloworld";
is implicitly converted to:
str=String("helloworld");
O. Nierstrasz
38
P2 A bit of C++
39
P2 A bit of C++
Overloadable Operators
The following operators may be overloaded:
+
&
<
>
<=
>=
++
<<
>>
==
!=
&&
||
+=
/=
%=
^=
&=
|=
*=
<<=
>>=
[]
()
>
>*
new
delete
40
P2 A bit of C++
Friends
We would like to be able to write:
cout<<String("TESTING...")<<endl;
But:
41
P2 A bit of C++
Friends ...
We declare:
And define:
O. Nierstrasz
classString
{
friendostream&
operator<<(ostream&,constString&);
...
};
ostream&
operator<<(ostream&outStream,constString&s)
{
returnoutStream<<s._s;
}
42
P2 A bit of C++
Roadmap
>
>
>
>
>
C++ vs C
C++ vs Java
References vs pointers
C++ classes: Orthodox Canonical Form
A quick look at STL The Standard Template
Library
O. Nierstrasz
43
P2 A bit of C++
vector,list,deque,set,multiset,map,multimap
1. search,count,copy,random_shuffle,sort,...
5.
O. Nierstrasz
44
P2 A bit of C++
//STLstacks
//Standardstrings
voidrev(void)
{
typedefstack<string>IOStack; //instantiatethetemplate
IOStackioStack;
//instantiatethetemplateclass
stringbuf;
while(getline(cin,buf)){
ioStack.push(buf);
}
while(ioStack.size()!=0){
cout<<ioStack.top()<<endl;
ioStack.pop();
}
}
O. Nierstrasz
45
P2 A bit of C++
O. Nierstrasz
46
P2 A bit of C++
47
P2 A bit of C++
constructor?
Why can objects of the same class access each others
private members?
O. Nierstrasz
48
P2 A bit of C++
License
http://creativecommons.org/licenses/bysa/2.5/
Attribution-ShareAlike 2.5
Attribution. You must attribute the work in the manner specified by the author or licensor.
Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting
work only under a license identical to this one.
For any reuse or distribution, you must make clear to others the license terms of this work.
Any of these conditions can be waived if you get permission from the copyright holder.
Your fair use and other rights are in no way affected by the above.
O. Nierstrasz
49