CSCI 334: Principles of Programming Languages Lecture 19: C++

CSCI 334: Principles of Programming Languages Lecture 19: C++

Announcements CSCI 334: Principles of Programming Languages HW8 pro tip: the HW7 solutions have a complete, correct implementation of the CPS version of bubble sort in SML. All you need to do is encode the same Lecture 19: C++ logic in C++. Instructor: Dan Barowy Dynamic Dispatch (ala Smalltalk) Announcements Superclass Point object Point class Template x 2 y 3 Method dictionary Code newX:Y: I’ve decided to skip Java. ColoredPoint object ColoredPoint class … move 2 3 purple Method dictionary Code Template newX:Y: x color y foo color Call move on ColoredPoint Optimize Dynamic Dispatch Superclass Superclass Point object Point class Template Point object PointPoint vtableclass Template x x 2 4 y 2 y 3 Method dictionary Code 3 Method dictionary Code ColoredPoint object ColoredPoint class newX:Y: newX:Y: 5 … … move move 1 2 2 6 • Static types let us do some optimization. 3 • Sacrificing runtime polymorphism-by-default also allows optimization. purple Method dictionary Code • Statically determine locations of x and y. Template newX:Y: x • Non-virtual method lookup determined statically. 3 color y • Copy virtual methods from superclasses into method dictionary. foo color • Eliminate class object; just a “virtual function table” now. Optimize Dynamic Dispatch Call move on ColoredPoint C++ virtual dispatch never searches as in SmallTalk! Point object Point vtable Code Point object Point vtable Code … … 2 x move 2 x move 3 3 y 3 y ColoredPoint object ColoredPoint vtable Code ColoredPoint object ColoredPoint vtable Code … … 2 x move 2 x move 1 2 3 y color 3 y color purple color foo purple color foo Runtime polymorphism Runtime polymorphism • You may have forgotten how OO polymorphism works. • You may have forgotten how OO polymorphism works. • It’s easy to forget with Smalltalk, which is dynamically typed. • It’s easy to forget with Smalltalk, which is dynamically typed. • In Java—and especially C++—you need to think about this or it • In Java—and especially C++—you need to think about this or it will bite you. will bite you. class Animal { class Human : public Animal { class Animal { class Human : public Animal { public: public: public: public: string myName() { string myName() { virtual string myName() { virtual string myName() { return "Animal"; return "Human"; return "Animal"; return "Human"; } } } } }; }; }; }; Animal *a = new Animal(); Animal *a = new Animal(); cout << a->myName() << endl; cout << a->myName() << endl; Human *h = new Human(); Human *h = new Human(); cout << h->myName() << endl; cout << h->myName() << endl; a = h; a = h; cout << a->myName() << endl; cout << a->myName() << endl; • What will the last line print? • What will the last line print? Inheritance vs Subtyping Initializer Lists class Pirate : public Person { public: Pirate(string name); Pirate::Pirate(name) : Person(name) {} virtual void sayHello(); } • In C++, the base class constructor is called automatically for you for no-argument constructors. • Recall that inheritance and subtyping are not the same. • When calling a superclass constructor with an argument from a • Example: implement a stack using a dequeue. subclass, you must use initializer list syntax. This is different from • Inheritance of the form: Java. class <subclass> : <superclass> • You can (and should) also use the initializer list to call is mere inheritance; the C++ compiler will not treat <subclass> constructors for instance variables if they need initialization. as a subtype of <superclass> • Initializer lists only work for instance variables that have • Inheritance of the form: constructors; primitives do not have constructors. class <subclass> : public <superclass> is inheritance with subtyping; the compiler will treat • For primitives, initialize the old-fashioned way (in constructor <subclass> as an instance of <superclass> when needed. body). Manual Memory Management Destructors class String { private: char *s; constructor • In C++, you need to think explicitly about allocation and int size; public: deallocation, just as you do in C. String(char *); ~String(); • While you can use malloc and free in C++, you should }; destructor generally favor new and delete instead. String::String(char *c) { • does more than : it also calls the class constructor. size = strlen(c); new malloc s = new char[size+1]; strcpy(s,c); • delete does more than free: it also calls the class destructor. } String::~String() { delete []s; } Automatic vs. Heap Allocation Type Inference! • C++ has a restricted form of type inference. allocated on the stack! int main() { int main() { Pirate dan = Pirate(“Dan”); auto dan = Pirate(“Dan”); dan.sayHello(); access member using “.” dan.sayHello(); Pirate *karen = new Pirate(“Karen”); auto karen = new Pirate(“Karen”); karen->sayHello(); karen->sayHello(); } allocated on the heap } access member using “->” (remember, this is syntactic • auto makes life wonderful. Use it unless you are confused sugar) about inferred types (in which case, write the type manually) Lambda expressions Lambda expressions • C++ has lambda expressions. 3 1 2 • They are a tad more verbose than in SML. [ ]( ){ } • Three main components. Let’s rewrite this SML lambda expression in C++: [ 3 ]( 1 ){ 2 } fn (x: int) => x + 1 1. Parameter list 2. Function body [](int x ){ return x + 1; }; 3.Capture list Lambda expressions Lambda expressions [ 3 ]( 1 ){ 2 } [ 3 ]( 1 ){ 2 } Let’s rewrite this SML lambda expression in C++: Let’s rewrite this SML lambda expression in C++: val y = 2 val y = 2 fn (x: int) => x + y fn (x: int) => x + y int y = 2; int y = 2; [ y ](int x ){ return x + y ;}; [ &y ](int x ){ return x + y; }; Captures y “by value” (copies value of y) Captures y “by reference” (refers to y) Lambda expressions Lambda subtleties What is the type of a lambda expression? [&y](int x){return x + y;}; Capture of closed-over lambda parameters is only This one takes an int and returns and int necessary for variables with “automatic storage std::function<int(int)> duration”. More generally.. (demo) std::function<T(U1,…,Un)> Templates Templates • C++ lets you program “generically” just like Java or SML. • No restriction on template parameter like Java (int vs Integer) • Syntax is a little different. • Works by generating specialized code (literally, a new class) at • Mechanism is very different. compile-time for each parameter type used. template <typename T> class Box { class Box { public: public: int x; T x; } } … … Box b = new Box(); Box<double> b = new Box<double>(); b->x = 2; b->x = 2.2; Templated Lambdas Typedef’d Templates • You can even typedef templated types. • You can even template lambda expressions. • Unfortunately, the typedef mechanism does not understand • Here’s a generic identity function. template parameters, which means that you have to fix the template parameter if you use it. template <typename T> • C++0x introduced a generalization of typedef to address this auto Identity = [](T x){return x;}; called using. std::function<bool(T,T)> • Won’t work; doesn’t understand • Call it like: T: template <typename T> typedef Comparison std::function<bool(T,T)>; Identity<string>(“hello”); • Will work: template <typename T> using Comparison = std::function<bool(T,T)>; Next class • Scala wrap-up • Logic programming.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    7 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us