c++ (& c) grab bag - mit opencourseware...// valid down-cast. class cat { virtual void purr() {...

51
C++ (& C) Grab Bag 1

Upload: others

Post on 27-Apr-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

C++ (& C) Grab Bag

1

Page 2: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

Final Project: Due in 2 DaysComplete Something

2

Page 3: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

Parent destructors

3

Page 4: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

struct Buffer {Buffer(int s) { buf = new char[s]; }~Buffer() { delete [] buf; }char *buf;

};

struct FBuffer : public Buffer {FBuffer(int s) : Buffer(s) {

f = fopen("file", "w");}~FBuffer() { fclose(f); }void write() { fwrite(buf, 1, 40, f); }FILE *f;

};

4

Page 5: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

struct FBuffer struct Buffer { : public Buffer {

Buffer(int s); FBuffer(int s);~Buffer(); ~FBuffer();char *buf; void write();

}; FILE *f; };

Buffer *buf = new Buffer(128);delete buf; // ✓

5

Page 6: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

struct FBuffer struct Buffer { : public Buffer {

FBuffer(int s);Buffer(int s);~Buffer(); ~FBuffer();char *buf; void write();

}; FILE *f; };

FBuffer *fbuf = new FBuffer(128); delete fbuf; // ✓

6

Page 7: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

Construction

Uninitialized

Uninitialized

Buffer(buf)

Buffer(buf)

FBuffer(f)

7

Page 8: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

Destruction

Buffer(buf)

FBuffer(f)

Buffer(buf)

Uninitialized

Uninitialized

8

Page 9: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

struct FBuffer struct Buffer { : public Buffer {

Buffer(int s); FBuffer(int s);~Buffer(); ~FBuffer();char *buf; void write();

}; FILE *f; };

Buffer *fbuf = new FBuffer(128); delete fbuf; // ✘ only ~Buffer is called

9

Page 10: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

struct FBuffer struct Buffer { : public Buffer {

Buffer(); FBuffer();virtual ~Buffer(); virtual ~FBuffer();char *buf; void write();

}; FILE *f; };

Buffer *fbuf = new FBuffer; delete fbuf; // ✓

10

Page 11: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

C++ Casts

11

Page 12: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

// C castchar *buf = (char *)malloc(128);

// C-style castfloat b = 98.6; int a = int(b);

12

Page 13: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

// C-style cat castsclass Cat { };class Tiger : public Cat { };class Persian : public Cat { };Cat *c = new Persian; Tiger *t = (Tiger *)c; // whoops!

Cat

PersianTiger

13

Page 14: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

// valid up-cast

Tiger *t = new Tiger;

Cat *c1 = (Cat *)t;Cat *c2 = static_cast<Cat *>(t); Cat *c3 = dynamic_cast<Cat *>(t);

14

Page 15: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

// almost valid down-cast

Cat *c = new Tiger;

Tiger *t1 = (Tiger *)c;Tiger *t2 = static_cast<Tiger *>(c);Tiger *t3 = dynamic_cast<Tiger *>(c);

// compile error

15

Page 16: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

// valid down-cast

class Cat { virtual void purr() { } };class Tiger : public Cat { };class Persian : public Cat { };

Cat *c = new Tiger;

Tiger *t1 = (Tiger *)c;Tiger *t2 = static_cast<Tiger *>(c);Tiger *t3 = dynamic_cast<Tiger *>(c);

16

Page 17: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

// invalid down-cast

Cat *c = new Persian;

Tiger *t1 = (Tiger *)c;Tiger *t2 = static_cast<Tiger *>(c);Tiger *t3 = dynamic_cast<Tiger *>(c);

// t1 & t2 are invalid pointers// t3 is NULL

17

Page 18: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

References

18

Page 19: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

void swap(int *a, int *b) {int tmp = *a;*a = *b;

*b = tmp;}

int main() {int x = 2, y = 3;swap(&x, &y);

}

19

Page 20: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

void swap(int &a, int &b) {int tmp = a;a = b;

b = tmp;}

int main() {int x = 2, y = 3;swap(x, y);

}

20

Page 21: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

Hello, World!

21

Page 22: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

#include <iostream>

int main() {std::cout << "Hello, World!"

<< std::endl; return 0;

}

22

Page 23: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

#include <iostream>

int main() {std::cout << "Hello, World!"

<< std::endl; return 0;

}

23

Page 24: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

Namespaces

24

Page 25: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

SNDFILE *open(const char *);count_t seek(SNDFILE *, count_t);int error(SNDFILE *);

25

Page 26: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

SNDFILE *sf_open(const char *); count_t sf_seek(SNDFILE *, count_t);int sf_error(SNDFILE *);

26

Page 27: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

namespace sf {SNDFILE *open(const char *);count_t seek(SNDFILE *, count_t);int error(SNDFILE *);

}

27

Page 28: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

#include <iostream>

int main() {std::cout << "Hello, World!"

<< std::endl; return 0;

}

28

Page 29: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

std::cout << "Hello, World!" << std::endl;

using namespace std;cout << "Hello, World!"

<< endl;

using std::cout;using std::endl;cout << "Hello, World!"

<< endl;

29

Page 30: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

g++ -E hello.cpp

iostreamnamespace std {

extern istream cin; extern ostream cout; extern ostream cerr;

}

30

Page 31: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

namespace std {extern istream cin;

extern ostream cout; extern ostream cerr;

class ActionLawsuit {};

}

31

Page 32: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

extern istream cin; extern ostream cout; extern ostream cerr;

class ActionLawsuit {};

32

Page 33: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

namespace super {namespace std {

extern istream cin; extern ostream cout; extern ostream cerr;

class ActionLawsuit {};

}}

super::std::ActionLawsuit; 33

Page 34: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

extern

34

Page 35: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

iostreamnamespace std {

extern istream cin; extern ostream cout; extern ostream cerr;

}

35

Page 36: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

iostreamostream cout;

main.c foo.c #include <iostream> #include <iostream>

int main() { int foo() {cout << "i"; cout << "Phone"; foo(); }

}

36

Page 37: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

cout

main

cout

foo

main.c (preprocessed) foo.c (preprocessed)­ostream cout; ostream cout;

int main() { int foo() {cout << "i"; cout << "Phone"; foo(); }

}

main.o foo.o cout

main

cout

foo

ld: 1 duplicate symbol for architecture x86_64 37

Page 38: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

main.c (preprocessed) foo.c (preprocessed)extern ostream cout; extern ostream cout;

int main() { int foo() {cout << "i"; cout << "Phone"; foo(); }

}

main.o foo.o main foo

<standard library>cout

38

Page 39: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

#include <iostream>

int main() {std::cout << "Hello, World!"

<< std::endl; return 0;

}

39

Page 40: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

#include <iostream>

int main() {std::cout << "Hello, World!"

<< std::endl; int a = 2 << 1; return 0;

}

40

Page 41: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

Operator Overloading

41

Page 42: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

struct vec2 {vec2(float x, float y)

: x(x), y(y) { }float x, y;

};

int main() {vec2 a(1, 0);vec2 b(1, 3);vec2 c = a + b; // compile error

}

vec.cpp: In function ‘int main()’: vec.cpp:12: error: no match for ‘operator+’ in ‘a + b’

42

Page 43: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

vec2 vec2::add(const vec2 &o) {return vec2(x + o.x, y + o.y);

}

int main() {vec2 a(1, 0), b(1, 3);vec2 c = a.add(b);

}

43

Page 44: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

vec2 vec2::operator +(const vec2 &o) {return vec2(x + o.x, y + o.y);

}

int main() {vec2 a(1, 0), b(1, 3);vec2 c = a + b;

vec2 d = a.operator+(b);}

44

Page 45: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

vec2 operator +(vec2 &v, const vec2 &o) {return vec2(x + o.x, y + o.y);

}

int main() {vec2 a(1, 0), b(1, 3);vec2 c = a + b;

}

45

Page 46: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

a + b a - b a * b a / ba % b a < b a <= b a == b a >= b a > b

a != b a && b a || ba & b a | ba ^ b a << b a >> b a, b a[b]

vec2 operator+(const vec2 &o);

46

Page 47: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

+a -a ++a a++ --a a--!a ~a *a &a

vec2 operator+();

47

Page 48: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

a = b a &= b a += b a |= ba -= b a ^= b a *= b a <<= b a /= b a >>= b a %= b a = (b += c)

vec2 &vec2::operator+=(const vec2 &o){ x += o.x; (this is a pointery += o.y;

return *this; to the object) }

48

Page 49: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

Streams

49

Page 50: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

struct Foo {char *str() const {

return "Foo!"; }

};

ostream & operator<<(ostream &os, const Foo &f) {

return os << f.str();}

int main() {Foo f;

std::cout << f << std::endl; }

50

Page 51: C++ (& C) Grab Bag - MIT OpenCourseWare...// valid down-cast. class Cat { virtual void purr() { }}; class Tiger : public Cat { }; class Persian : public Cat { }; Cat *c = new Tiger;

MIT OpenCourseWarehttp://ocw.mit.edu

6.S096 Introduction to C and C++IAP 2013

For information about citing these materials or our Terms of Use, visit: http://ocw.mit.edu/terms.