240 likes | 324 Views
B Smith: Fall 05, rate 2. Redundant and wordy. Class jointly created a hello world .cpp and ran. Discuss using namespace; and std::cout. Introduction to C++ (II). Math 130. Administrivia. Project 5 due date Extra credit: Grading Labs. Overview. C++ Input and Output Function Enhancements
E N D
B Smith: Fall 05, rate 2. Redundant and wordy. Class jointly created a hello world .cpp and ran. Discuss using namespace; and std::cout Introduction to C++ (II) Math 130
Administrivia • Project 5 due date • Extra credit: • Grading Labs
Overview • C++ Input and Output • Function Enhancements • Function Calls and Default arguments • Function Overloading • Function Templates
B Smith: Discuss stream objects cin.???, maybe cin.<<() to indicate that it’s a special type of function. It also jumps out that this is not procedural, and that overloading operators is standard order of business Input and Output in C++ • printf() and scanf()still available in C++ • You won’t want to use them • Standard I/O in C++ use stream I/O • In C, the streams (in addition to files) are • stdin • stdout • stderr • In C++, the standard streams are • cin • cout • cerr
variable/ constant standard output device cout << standard input device cin variable >> coutandcin • Input and Output streams of C++ • cout – enables the system to write to the screen • cin – enables the system to read from the keyboard
B Smith: To use the book’s code, change the warning level during compilation to ignore deprecated headers warning cout • The object type need not be specified! • no %s, %d, etc • C++ uses the “inserter” or “put to” operator, << B Smith: This is a grat opportunity to talk about an “implicit parameter.” Output to the terminal could be done using operator<<(cout, "hello"); vs cout << “hello”; Hence, when we are a ready to overload << for our purposes, we will understand better the prototype: operator<<(ostream&, “string”); #include <iostream> int main() { std::cout << "Hello there world!\n"; return 0; } The “put to” symbol std::cout << “The sum of 1 and 2 is” << (1 + 2) << ‘\n’;
cin • Entering data is somewhat simplified in C++ • Note the “extractor,” or the “get from,” operator >> int main() { float num1, num2, product; cout << "Please type in a number: "; cin >> num1; cout << "Please type in another number: "; cin >> num2; product = num1 * num2; cout << num1 << " times " << num2 << " is " << product << endl; return 0; }
Functions in C++ • The primary function enhancements over C: • default arguments • reference arguments (vs oft-troublesome pointers) • function and operator overloading • inline function compilation
The prototype makes it clear that setStatus takes two integers as arguments. Also ok to use variable names. Function Enhancements - Default Arguments • In C, we learned to specify a function prototype #include<stdio.h> void setStatus ( int , int ) ; int stuID , stuStatus ; //global variables int main ( ) { printf( ‘‘ Enter student ID’’) ; scanf ( ‘‘%d’’, &stuID ) ; printf( ‘‘ Enter student status’’) ; scanf ( ‘‘%d’’, &stuStatus ) ; setStatus ( stuID , stuStatus ) ; } void setStatus ( int id , int stat) //func header { stuID = id ; printf( ‘‘ stuID i s %d’’ , id ) ; stuStatus = stat; printf( ‘‘ stuStatus i s %d’’ , stat) ; }`` The function implemented with no default arugments
Function Enhancements • Default Arguments • C++ allows you to specify a function prototype that takes a variable number of arguments void setStatus ( int , int = 20 ) ; • If second argument is omitted, C++ uses 20 as the default argument
Default Arguments • Consider this example function prototype: void func1 ( int , int = 5 , float = 6.78 ) ; • C++ compilers will consider the following calls valid: func1 ( 7 , 2 , 9.3 ) // no defaults used func1 ( 7 , 2 ) // same as func1( 7 , 2 , 6.78 ) func1 ( 7 ) // same as func1( 7 , 5 , 6.78 )
Default Arguments – Rules • Only in function protototypes can function defaults be defined • If any argument is given a default value, those that follow it must also be given default values (think right justify) void func1 ( int , int = 5 , float = 6.78 ) ; // ok void func1 ( int = 0, int = 5 , float ) ; // error void func1 ( int = 0, int, float = 6.78 ) ; // error • If one argument is omitted, then all arguments to the left must be omitted • The default values in the prototype may be an expression consisting of constants and previously declared variables
Reusing Function Names (Overloading) • In C, each function requires its own unique name • Consider taking the absolute value of a number; what would be your functions return value? • In <math.h> , you will see: double fabs( double ) • In <stdlib.h> , you will see: int abs( int ) • C++ allows us to create one function capable of working with various types or to perform multiple functions • Function overloading is the capability of C++ that allows one function to serve multiple, but typically similar, purposes
Function Overloading void showAbs ( int x ) { // for int if ( x < 0 ) x = −x ; cout << “The absolute value is” << x << endl ; } void showAbs ( long x ) { // for long int if ( x < 0 ) x = −x ; cout << “The absolute value is” << x << endl ; } void showAbs ( double x ) { // for double if ( x < 0 ) x = −x ; cout << “The absolute value is” << x << endl ; }
Function Overloading • Of the three showabs() functions, the one chosen depends on the argument(s) with which the function is called • The correct function is chosen based on type and number of arguments • Hence, the appropriate function is called in: int x = −23; showabs ( x ) ; • Function Overloading will be more useful later, c.f. constructor functions • A function template would be appropriate for our purposes here
B Smith: Stopped here. Sp06. Function Templates • Consider again the task of finding the absolute value of a number of some arbitrary type • Below would be an appropriate template, but note the contrast • function header: void showAbs(int x) • template header: void showAbs(T number) template <class T> void showAbs (T number ) { if ( number < 0 ) number = −number ; cout << “The absolute value is” << number << endl ; return ; }
Function Template • In the statement void showAbs(int x) • int represents an integer data type • In the statement void showAbs(T number) • T represents a generic data type • The compiler will will use the appropriate data type based on the function call it encounters
B Smith: Stopped here on 4/20/05 Function Template Example #include <iostream> template <class T> void showtabs (T number ) { if ( number < 0) number = −number ; cout << "The absolute value of the number is " << number << endl ; return ; } int main ( ) { int num1 = −4; float num2 = −4.23; double num3 = −4.23456; showtabs (num1 ) ; showtabs (num2 ) ; showtabs (num3 ) ; return 0 ; }
Function Templates • T is arbitrary and is a placeholder for a data type • It would’ve made just as much sense to use DTYPE • But, T is used widely by many programmers to respresent a generic data type template <class T> void showtabs (T number ) { . . . } template <class DTYPE> void showtabs (DTYPE number ) { . . . }
#include <iostream> int abs(int value ) { int absnum; if ( value < 0) absnum = −value ; else absnum = value ; return absnum; } Function Templates w/ a Return Type #include <iostream> template <class T> T abs(T value ) { T absnum; if ( value < 0) absnum = −value ; else absnum = value ; return absnum; } int main ( ) { int num1 = −4; float num2 = −4.23; double num3 = −4.23456; cout <<"The absolute value of "<<num1 <<" is "<< abs (num1) << endl ; cout <<"The absolute value of "<<num2 <<" is "<< abs (num2) << endl ; cout <<"The absolute value of "<<num3 <<" is "<< abs (num3) << endl ; return 0 ; }
Templates • The compiler substitutes the appropriate data type for the Tdata type in the function template • The following function is built for int datatypes: similar functions are created for the other dataypes int showabs ( int value ) { int absnum; if ( value < 0) absnum = −value ; else absnum = value ; return ( absnum) ; }
B Smith: Class needed to see examples of when this would be useful, or just pull this one Multi-argument Templates • Finally, function templates for functions passing more than one argument: template <class T1 , class T2 , class T3>
Summary • C++ Input and Output • should use over printf/scanf • typesafe (no need to worry about %s, %d, etc) • Function Enhancements • Function Calls and Default arguments • optional number of arguments in C++ • Function Overloading • functions with the same name can handle different data types • will be really useful for overloading operators • Function Templates • create one function to serve multiple data types