ECE 2400 Computer Systems Programming Fall 2017 Topic 12: Transition from C to C++

Similar documents
ECE 2400 Computer Systems Programming Fall 2018 Topic 11: Transition to C++

ECE 2400 Computer Systems Programming Fall 2017 Topic 7: C Lists and Vectors

ECE 2400 Computer Systems Programming Fall 2018 Topic 6: C Dynamic Allocation

Writing an ANSI C Program Getting Ready to Program A First Program Variables, Expressions, and Assignments Initialization The Use of #define and

Chapter 15 - C++ As A "Better C"

ECE 2400 Computer Systems Programming Fall 2018 Topic 7: Concrete Data Types

ECE 2400 Computer Systems Programming Fall 2017 Topic 4: C Pointers

ECE 2400 Computer Systems Programming Fall 2017 Topic 15: C++ Templates

C++ Functions. Last Week. Areas for Discussion. Program Structure. Last Week Introduction to Functions Program Structure and Functions

This document is a preview generated by EVS

BIL 104E Introduction to Scientific and Engineering Computing. Lecture 4

C++ Programming Classes. Michael Griffiths Corporate Information and Computing Services The University of Sheffield

Language Design COMS W4115. Prof. Stephen A. Edwards Spring 2003 Columbia University Department of Computer Science

Introduction to C++ Systems Programming

Tutorial 5. PDS Lab Section 16 Autumn Functions The C language is termed as function-oriented programming

Welcome to Teach Yourself Acknowledgments Fundamental C++ Programming p. 2 An Introduction to C++ p. 4 A Brief History of C++ p.

Holtek C and ANSI C Feature Comparison User s Guide

ECE 2400 Computer Systems Programming Fall 2017 Topic 14: C++ Inheritance

Dr M Kasim A Jalil. Faculty of Mechanical Engineering UTM (source: Deitel Associates & Pearson)

Fast Introduction to Object Oriented Programming and C++

Chapter 2. Procedural Programming

INTRODUCTION TO C++ FUNCTIONS. Dept. of Electronic Engineering, NCHU. Original slides are from

Introduction to C++ Professor Hugh C. Lauer CS-2303, System Programming Concepts

Procedural programming with C

C Concepts - I/O. Lecture 19 COP 3014 Fall November 29, 2017

Review: Constants. Modules and Interfaces. Modules. Clients, Interfaces, Implementations. Client. Interface. Implementation

Functions. Angela Chih-Wei Tang ( 唐之瑋 ) Department of Communication Engineering National Central University JhongLi, Taiwan.

Pointers, Dynamic Data, and Reference Types

Introduction to C++ Introduction to C++ 1

Contents of Lecture 3

Axivion Bauhaus Suite Technical Factsheet MISRA

CSE123. Program Design and Modular Programming Functions 1-1

CSCI 171 Chapter Outlines

Absolute C++ Walter Savitch

Memory and Addresses. Pointers in C. Memory is just a sequence of byte-sized storage devices.

High-performance computing and programming I. Introduction to C programming in *NIX

Concepts for the C++0x Standard Library: Introduction

Motor Industry Software Reliability Association (MISRA) C:2012 Standard Mapping of MISRA C:2012 items to Goanna checks

Ben Van Vliet Ben Van Vliet March 3,

6.5 Function Prototypes and Argument Coercion

Q1: /8 Q2: /30 Q3: /30 Q4: /32. Total: /100

CS 137 Part 5. Pointers, Arrays, Malloc, Variable Sized Arrays, Vectors. October 25th, 2017

COMP26120: Pointers in C (2018/19) Lucas Cordeiro

SYSC 2006 C Winter 2012

CS 314 Principles of Programming Languages. Lecture 11

Memory, Arrays & Pointers

Jagannath Institute of Management Sciences Lajpat Nagar. BCA II Sem. C Programming

QUIZ. 1. Explain the meaning of the angle brackets in the declaration of v below:

Programming. C++ Basics

C++: Const Function Overloading Constructors and Destructors Enumerations Assertions

Kurt Schmidt. October 30, 2018

Tokens, Expressions and Control Structures

Language Design COMS W4115. Prof. Stephen A. Edwards Fall 2006 Columbia University Department of Computer Science

Short Notes of CS201

Computer Programming

CS201 - Introduction to Programming Glossary By

ECE 2400 Computer Systems Programming Fall 2018 Topic 1: Introduction to C

Programming in C. UVic SEng 265. Daniel M. German Department of Computer Science University of Victoria. October 23, 2002 Version: 1.

Declaring Pointers. Declaration of pointers <type> *variable <type> *variable = initial-value Examples:

CS 261 Fall C Introduction. Variables, Memory Model, Pointers, and Debugging. Mike Lam, Professor

C++ Primer for CS175

Approximately a Test II CPSC 206

Motivation was to facilitate development of systems software, especially OS development.

Introduction to C. Robert Escriva. Cornell CS 4411, August 30, Geared toward programmers

The C Language Reference Manual

Advanced Pointer & Data Storage

Intermediate Programming, Spring 2017*

C++ basics Getting started with, and Data Types.

C: Pointers, Arrays, and strings. Department of Computer Science College of Engineering Boise State University. August 25, /36

Dynamic Data Structures. CSCI 112: Programming in C

Professor Terje Haukaas University of British Columbia, Vancouver C++ Programming

JTSK Programming in C II C-Lab II. Lecture 3 & 4

Advances in Programming Languages: Regions

Introduction to C Programming (Part A) Copyright 2008 W. W. Norton & Company. All rights Reserved

CS3157: Advanced Programming. Outline

C Review. MaxMSP Developers Workshop Summer 2009 CNMAT

FORM 2 (Please put your name and form # on the scantron!!!!)

6.096 Introduction to C++ January (IAP) 2009

C++ C and C++ C++ fundamental types. C++ enumeration. To quote Bjarne Stroustrup: 5. Overloading Namespaces Classes

Advanced Pointer Topics

Axivion Bauhaus Suite Technical Factsheet AUTOSAR

Introduction to Programming Using Java (98-388)

by Pearson Education, Inc. All Rights Reserved.

Lecture Topics. Administrivia

Fundamental Data Types. CSE 130: Introduction to Programming in C Stony Brook University

PROGRAMMING IN C++ KAUSIK DATTA 18-Oct-2017

ECE 2400 Computer Systems Programming, Fall 2017 Programming Assignment 2: List and Vector Data Structures

C Introduction. Comparison w/ Java, Memory Model, and Pointers

Pointers and Arrays CS 201. This slide set covers pointers and arrays in C++. You should read Chapter 8 from your Deitel & Deitel book.

Introduce C# as Object Oriented programming language. Explain, tokens,

Problem Solving with C++

ECEN 449 Microprocessor System Design. Review of C Programming. Texas A&M University

A brief introduction to C programming for Java programmers

Introduction to C. Zhiyuan Teo. Cornell CS 4411, August 26, Geared toward programmers

Outline. 1 Function calls and parameter passing. 2 Pointers, arrays, and references. 5 Declarations, scope, and lifetimes 6 I/O

Agenda. The main body and cout. Fundamental data types. Declarations and definitions. Control structures

Basic Types, Variables, Literals, Constants

A Fast Review of C Essentials Part I

Homework #3 CS2255 Fall 2012

Lecture 8: Object-Oriented Programming (OOP) EE3490E: Programming S1 2017/2018 Dr. Đào Trung Kiên Hanoi Univ. of Science and Technology

Transcription:

ECE 2400 Computer Systems Programming Fall 2017 Topic 12: Transition from C to C++ School of Electrical and Computer Engineering Cornell University revision: 2017-10-23-01-13 1 C++ Namespaces 2 2 C++ Functions 7 3 C++ References 10 4 C++ Exceptions 14 5 C++ Types 16 5.1. struct Types............................... 16 5.2. bool Types................................. 17 5.3. void* Types................................ 17 6 C++ Dynamic Allocation 18 1

1. C++ Namespaces 1. C++ Namespaces Large C projects can include tens or hundreds of files and libraries Very easy for two files or libraries to define a function with the same name causing a namespace collision 1 // contents of foo.h 2 // this avg rounds down 3 int avg( int x, int y ) 4 { 5 int sum = x + y; 6 return sum / 2; 7 } 1 // contents of bar.h 2 // this avg rounds up 3 int avg( int x, int y ) 4 { 5 int sum = x + y; 6 return (sum + 1) / 2; 7 } 1 #include "foo.h" 2 #include "bar.h" 3 #include <stdio.h> 4 5 int main( void ) 6 { 7 printf("avg(2,3) = %d\n", avg(2,3) ); 8 return 0; 9 } http://cpp.sh/5vm7m Unclear which version of avg to use Causes compile-time redefinition error 2

1. C++ Namespaces Traditional approach in C is to use prefixes Can create cumbersome syntactic overhead 1 // contents of foo.h 2 // this avg rounds down 3 int foo_avg( int x, int y ) 4 { 5 int sum = x + y; 6 return sum / 2; 7 } 1 // contents of bar.h 2 // this avg rounds up 3 int bar_avg( int x, int y ) 4 { 5 int sum = x + y; 6 return (sum + 1) / 2; 7 } 1 #include "foo.h" 2 #include "bar.h" 3 #include <stdio.h> 4 5 int main( void ) 6 { 7 printf("avg(2,3) = %d (rnd down)\n", foo_avg(2,3) ); 8 printf("avg(2,3) = %d (rnd up)\n", bar_avg(2,3) ); 9 return 0; 10 } http://cpp.sh/9wknn 3

1. C++ Namespaces C++ namespaces extend the language to support named scopes Namespaces provide flexible ways to use specific scopes 1 // contents of foo.h 2 namespace foo { 3 4 // this avg rounds down 5 int avg( int x, int y ) 6 { 7 int sum = x + y; 8 return sum / 2; 9 } 10 11 // Other code in 12 // namespace uses "avg" 13 } 1 // contents of bar.h 2 namespace bar { 3 4 // this avg rounds up 5 int avg( int x, int y ) 6 { 7 int sum = x + y; 8 return (sum + 1) / 2; 9 } 10 11 // Other code in 12 // namespace uses "avg" 13 } 1 #include "foo.h" 2 #include "bar.h" 3 #include <stdio.h> 4 5 int main( void ) 6 { 7 printf("avg(2,3) = %d (rnd down)\n", foo::avg(2,3) ); 8 printf("avg(2,3) = %d (rnd up)\n", bar::avg(2,3) ); 9 return 0; 10 } http://cpp.sh/6dz5k 1 int main( void ) 3 using namespace foo; 4 printf("avg(2,3) = %d (rnd down)\n", avg(2,3) ); 5 printf("avg(2,3) = %d (rnd up)\n", bar::avg(2,3) ); 6 return 0; 7 } 4

1. C++ Namespaces Namespaces are just syntactic sugar Useful way to group related struct and function definitions 1 namespace List { 2 typedef struct _node_t 3 { 4 int value; 5 struct _node_t* next_p; 6 } 7 node_t; 8 } 1 namespace List { 2 typedef struct 3 { 4 node_t* head_p; 5 } 6 list_t; 7 } 1 namespace List { 2 void construct ( list_t* list_p ); 3 void destruct ( list_t* list_p ); 4 void push_front ( list_t* list_p, int v ); 5... 6 } 7 8 int main( void ) 9 { 10 List::list_t list; 11 List::construct( &list ); 12 List::push_front( &list, 12 ); 13 List::push_front( &list, 11 ); 14 List::push_front( &list, 10 ); 15 List::destruct( &list ); 16 return 0; 17 } 5

1. C++ Namespaces Can rename namespaces and import one namespace into another All of the C standard library is placed in the std namespace Use the C++ version of the C standard library headers 1 #include "foo.h" 2 #include "bar.h" 3 #include <cstdio> 4 5 int main( void ) 6 { 7 std::printf("avg(2,3) = %d (rnd down)\n", foo::avg(2,3) ); 8 std::printf("avg(2,3) = %d (rnd up)\n", bar::avg(2,3) ); 9 return 0; 10 } <assert.h> <cassert> conditionally compiled macro <errno.h> <cerrno> macro containing last error num <fenv.h> <cfenv> floating-point access functions <float.h> <cfloat> limits of float types <inttypes.h> <cinttypes> formating macros for int types <limits.h> <climits> limits of integral types <locale.h> <clocale> localization utilities <math.h> <cmath> common mathematics functions <setjmp.h> <csetjmp> for saving and jumping to execution context <signal.h> <csignal> signal management <stdarg.h> <cstdarg> handling variable length arg lists <stddef.h> <cstddef> standard macros and typedefs <stdint.h> <cstdint> fixed-size types and limits of other types <stdio.h> <cstdio> input/output functions <stdlib.h> <cstdlib> general purpose utilities <string.h> <cstring> narrow character string handling <time.h> <ctime> time utilities <ctype.h> <cctype> types for narrow characters <uchar.h> <cuchar> unicode character conversions <wchar.h> <cwchar> wide and multibyte character string handling <wctype.h> <cwctype> types for wide characters 6

2. C++ Functions 2. C++ Functions C only allows a single definition for any given function name 1 int avg ( int x, int y ); 2 int avg3( int x, int y, int z ); C++ function overloading allows multiple def per function name Each definition must have a unique function signature (e.g., number of parameters) 1 int avg( int x, int y ) 3 int sum = x + y; 4 return sum / 2; 5 } 6 7 int avg( int x, int y, int z ) 8 { 9 int sum = x + y + z; 10 return sum / 3; 11 } 12 13 int main() 14 { 15 // Will call definition of avg with 2 parameters 16 int a = avg( 10, 20 ); 17 18 // Will call definition of avg with 3 parameters 19 int b = avg( 10, 20, 25 ); 20 21 return 0; 22 } 7

2. C++ Functions C only allows a single definition for any given function name 1 int avg ( int x, int y ); 2 double favg( double x, double y ); Function overloading also enables multiple definitions with the same number of arguments but different argument types 1 int avg( int x, int y ) 3 int sum = x + y; 4 return sum / 2; 5 } 6 7 double avg( double x, double y ) 8 { 9 double sum = x + y; 10 return sum / 2; 11 } 12 13 int main() 14 { 15 // Will call definition of avg with int parameters 16 int a = avg( 10, 20 ); 17 18 // Will call definition of avg with double parameters 19 double b = avg( 7.5, 20 ); 20 21 return 0; 22 } 8

2. C++ Functions Default parameters can allow the caller to optionally specify specific parameters at the end of the parameter list 1 #include <cstdio> 2 3 enum round_mode_t 4 { 5 ROUND_MODE_FLOOR, 6 ROUND_MODE_CEIL, 7 }; 8 9 int avg( int a, int b, 10 round_mode_t round_mode = ROUND_MODE_FLOOR ) 11 { 12 int sum = a + b; 13 if ( round_mode == ROUND_MODE_CEIL ) 14 sum += 1; 15 return sum / 2; 16 } 17 18 int main( void ) 19 { 20 std::printf("avg( 5, 10 ) = %d\n", avg( 5, 10 ) ); 21 return 0; 22 } http://cpp.sh/3m4o Function overloading and default parameters are just syntactic sugar Enable elegantly writing more complicated code, but must also be more careful about which function definition is actually associated with any given function call 9

3. C++ References 3. C++ References C provides pointers to indirectly refer to a variable 1 int a = 3; 2 int* const b = &a; 3 *b = 5; 4 int c = *b; 5 int* d = &(*b); stack Aside: 1 // cannot change value 2 const int a; 3 4 // cannot change pointed-to value 5 const int* b = &a; 6 7 // cannot change pointer 8 int* const b = &a; 9 10 // cannot change pointer or pointed-to value 11 const int* const b = &a; Pointer syntax can sometimes be cumbersome (we will see this later with operator overloading) C++ references are an alternative way to indirectly refer to variable References require introducing new types Every type T has a corresponding reference type T& A variable of type T& contains a reference to a variable of type T 1 int& a // reference to a variable of type int 2 char& b // reference to a variable of type char 3 float& c // reference to a variable of type float 10

3. C++ References Cannot declare and then assign to reference in separate statements Must always use an initialization statement Do not use address-of operator (&) to initialize reference 1 int a = 42; 2 int& b; // reference to a variable (illegal) 3 b = &a; // assign to reference (illegal) 4 int& c = &a; // initialize reference with address of (illeg 5 int& c = a; // initialize reference (legal) For the most part, references act like syntatic sugar for pointers References must use an initialization statement (cannot be NULL) Cannot change reference after initialization References are automatically dereferenced References are a synonym for the referenced variable 1 int a = 3; // int a = 3; 2 int& b = a; // int* const b = &a; 3 b = 5; // *b = 5; 4 int c = b; // int c = *b; 5 int* d = &b; // int* d = &(*b); stack 11

3. C++ References Using pointers for call-by-reference 1 void sort2( int* x_ptr, 2 int* y_ptr ) 3 { 4 if ( (*x_ptr) > (*y_ptr) ) { 5 int temp = *x_ptr; 6 *x_ptr = *y_ptr; 7 *y_ptr = temp; 8 } 9 } Using references for call-by-reference 1 void sort2( int& x, int& y ) 3 if ( x > y ) { 4 int temp = x; 5 x = y; 6 y = temp; 7 } 8 } stack 9 10 int main( void ) 11 { 12 int a = 9; 13 int b = 5; 14 sort( a, b ); 15 return 0; 16 } http://cpp.sh/3f77d 12

3. C++ References Draw stack frame diagram corresponding to the execution of this program stack 1 void avg( int& result, 2 int x, int y ) 3 { 4 int sum = x + y; 5 result = sum / 2; 6 } 7 8 int main( void ) 9 { 10 int a = 10; 11 int b = 20; 12 int c; 13 avg( c, a, b ); 14 return 0; 15 } Our coding conventions prefer using pointers for return values Makes it obvious to caller that the parameter can be changed Const references useful for passing in large values 1 void blur( image_t* out, const image_t& in ); 2 3 int main( void ) 4 { 5 image_t in = /* initialize */ 6 image_t out = /* initialize */ 7 blur( &out, in ); 8 return 0; 9 } 13

4. C++ Exceptions 4. C++ Exceptions When handling errors in C we can return an invalid value 1 int days_in_month( int month ) 3 int x; 4 switch ( month ) 5 { 6 case 1: x = 31; break; 7... 8 case 12: x = 31; break; 9 default: x = -1; 10 } 11 return x; 12 } When handling errors in C we can assert 1 int days_in_month( int month ) 3 assert( (month > 1) && (month <= 12 ) ); 4... 5 } 6 7 int main() 8 { 9 int result = days_in_month( 7 ); 10 11 // Indicate success to the system 12 return 0; 13 } 14

4. C++ Exceptions C++ exceptions enable cleanly throwing and catching errors 1 #include <cstdio> 2 3 int days_in_month( int month ) 4 { 5 int x; 6 switch ( month ) 7 { 8 case 1: x = 31; break; 9 case 2: x = 28; break; 10... 11 case 12: x = 31; break; 12 default: 13 throw "Invalid month!"; 14 } 15 return x; 16 } stack 17 18 int main() 19 { 20 try { 21 int month = 7; 22 int days = days_in_month( month ); 23 std::printf( "month %d has %d days\n", month, days ); 24 } 25 catch ( const char* e ) { 26 std::printf( "ERROR: %s\n", e ); 27 return -1; 28 } 29 30 // Indicate success to the system 31 return 0; 32 } http://cpp.sh/9v3km 15

5. C++ Types 5.2. struct Types Can throw variable of any type (e.g., integers, structs) Can catch and rethrow exceptions Uncaught exceptions will terminate the program 5. C++ Types Small changes to three kinds of types struct types bool types void* types 5.1. struct Types C++ supports a simpler syntax for declaring struct types 1 typedef struct 3 double real; 4 double imag; 5 } 6 complex_t; 7 8 int main( void ) 9 { 10 complex_t complex; 11 complex.real = 1.5; 12 complex.imag = 3.5; 13 return 0; 14 } 1 struct Complex 3 double real; 4 double imag; 5 }; 6 7 8 int main( void ) 9 { 10 Complex complex; 11 complex.real = 1.5; 12 complex.imag = 3.5; 13 return 0; 14 } C coding convention uses _t suffix for user defined types C++ coding convention uses CamelCase for user defined types 16

5. C++ Types 5.2. bool Types 5.2. bool Types C used int types to represent boolean values C++ has an actual bool type which is part of the language C++ provides two new literals: true and false C++ still accepts integers where a boolean value is expected 1 int eq( int a, int b ) 3 int a_eq_b = ( a == b ); 4 return a_eq_b; 5 } 1 bool eq( int a, int b ) 3 bool a_eq_b = ( a == b ); 4 return a_eq_b; 5 } 5.3. void* Types C allows automatic type conversion of void* to any pointer type C++ requires explicit type casting of void* 1 int main( void ) 3 int* x = malloc( 4 * sizeof(int) ); 4 free(x); 5 return 0; 6 } 1 int main( void ) 3 int* x = (int*) malloc( 4 * sizeof(int) ); 4 free(x); 5 return 0; 6 } 17

6. C++ Dynamic Allocation 6. C++ Dynamic Allocation C dynamic allocation was handled by malloc/free Part of the C standard library, not part of the language C++ includes two new operators as part of the language The new operator is used to dynamically allocate variables The delete operator is used to deallocate variables These operators are type safe and are critical for object oriented programming 1 int* a_p = new int; 2 *a_p = 42; 3 delete a_p; 4 5 int* b_p = new int[4]; 6 b_p[0] = 1; 7 b_p[1] = 2; 8 b_p[2] = 3; 9 b_p[3] = 4; 10 delete[] b_p; 11 12 // struct Complex 13 // { 14 // double real; 15 // double imag; 16 // }; stack heap 17 18 Complex* complex_p = new Complex; 19 complex_p->real = 1.5; 20 complex_p->imag = 3.5; 21 delete complex_p; 18

6. C++ Dynamic Allocation Revisiting earlier example for a function that appends a dynamically allocated node to a chain of nodes 1 #include <cstddef> 2 3 struct Node 4 { 5 int value; 6 Node* next_p; 7 }; 8 9 Node* append( Node* node_p, int value ) 10 { 11 Node* new_node_p = // Node* new_node_p = 12 new Node; // malloc( sizeof(node) ); 13 new_node_p->value = value; 14 new_node_p->next_p = node_p; 15 return new_node_p; 16 } 17 18 int main( void ) 19 { 20 Node* node_p = NULL; 21 node_p = append( node_p, 3 ); 22 node_p = append( node_p, 4 ); 23 delete node_p->next_p; // free( node_p->next_pt ); 24 delete node_p; // free( node_p ); 25 return 0; 26 } 19

6. C++ Dynamic Allocation Revisiting earlier example for a function that dynamically allocates and then randomly initializes an array of integers 1 #include <cstddef> 2 3 int* rand_array( size_t size ) 4 { 5 int* x = // int* x = 6 new int[size]; // malloc( size * sizeof(int) ); 7 8 for ( size_t i=0; i<size; i++ ) 9 x[i] = rand() % 100; 10 11 return x; 12 } 13 14 int main( void ) 15 { 16 int* a = rand_array(3); 17 delete[] a; // free(a); 18 return 0; 19 } 20