Вы находитесь на странице: 1из 14

I

C++.
. , , , typename . .
(Nicolai
M. Josuttis) Object-Oriented Programming in C++, John Wiley and Sons Ltd, ISBN 0-470-84399-3. , C++
, .


C++ , , . . ,

, . .
(
) :
1. .
2. , , Object
void*.
3. .

30

I.

(, C, Java ), , , .
.
1. , , , . ,
, , .
2. , . , , .
3. , C/C++,
. ,
, .
, , . , , . . ,
.
. , C++ . ,
( )
, , , ..
:
, . ,
. .

2

. ; , .

2.1.
,
; ,
. , ,
.
, .

2.1.1.
, .
// basics/max.hpp
template <typename T>
inline T const& max(T const& a, T const& b)
{
// a < b, b, a
return a < b ? b : a;
}
, ; a b.
T.
, , :
template < ___ >
typename T. ,
.

32

2.

typename .
C++, , (. 4, ,
).
T. ,
T. ,
. ( , ..), , .
T <,
a b.
typename class. typename C++ ,
class. class .
max() :
// basics/max.hpp
template <class T>
inline T const& max(T const& a, T const& b)
{
// a < b, b, a
return a < b ? b : a;
}

. class
. , class
( T , ), typename. , ,
struct typename .

2.1.2.

max().
// basics/max.cpp
#include <iostream>
#include <string>
#include <max.hpp>
int main()

2.1.

33

{
int i = 42;
std::cout << "max(7,i):
" << ::max(7,i) << std::end1;
double f1 = 3.4;
double f2 = -6.7;
std::cout << "max(f1,f2): " << ::max(f1,f2) << std::end1;
std::string s1 = "mathematics";
std::string s2 = "math";
std::cout << "max(s1,s2): " << ::max(s1,s2) << std::end1;
}
max() : int,
double std::string. . :
max(7,i):
42
max(f1,f2): 3.4
max(s1,s2): mathematics
, max() ::? , max()
. :
std::max(), 1

.
- , .
2
, .
, max() .
, max()
int i = 42;
... max(7,i) ...
,
int. , :
inline int const& max(int const& a, int const& b)
{
// a < b, b, a

, std (,
string), C++
, std::max().
2

, . , .

2.

34
return a < b ? b : a;
}

(instantiation). .
, (instantiation) (instance) , . , ,
, .
,
. .
, max() max double
std::string ,
:
const double& max(double const&, double const&);
const std::string& max(std::string const&,
std::string const&);
,
, , :
std::complex<float> c1,c2; // complex
// <
...
max(c1,c2);
//
, .
1. ; . , .
2. . ,
.
, : ,
.
, . 6, .
: .

2.2.
(, max()) -
.

2.3.

35

const& int, ,
int. , . , :
template <typename T>
inline T const& max(T const& a, T const& b);
...
max(4,7);
// : T int
max(4,4.2); // : T int, double
.
1. :
max(static_cast<double>(4),4.2); //
2. :
max<double>(4,4.2); //
3. , .
.

2.3.
.
1. , :
template <typename T> // T
2. , :
max(T const& a, T const& b); // a b -
.
3
( ) .
, max() .
template <typename T1, typename T2>
inline T1 max (T1 const& a, T2 const& b)
{
return a < b ? b : a;
}
...
max(4,4.2)
// ,
3


.
C++ , , , (. 13.3).

2.

36

//
//
, max() , . ,
.
, ,
, .
C++ (

. 15.2.4, . 298). ,
42 66.66 double 66.66, int 66.
,
, ,
4
.
T1, T1 const&.
, .
(function template argument deduction) , .
, , .
template <typename T>
inline T const& max(T const& a, T const& b);
...
max<double>(4,4.2); // T,
// double
, , . , , , .
template <typename T1, typename T2, typename RT>
inline RT max(T1 const& a, T2 const& b);
5

, RT . , RT

, , , (
).
5
, .
- .

2.4.

37

, ,
, :
template <typename T1, typename T2, typename RT>
inline RT max(T1 const& a, T2 const& b);
...
max<int,double,double>(4,4.2) // ,
, , . : , .
: ,
. , ,
.
template <typename RT, typename T1, typename T2>
inline RT max(T1 const& a, T2 const& b);
...
max<double>(4,4.2)
// :
// double
max<double> RT double,
T1 T2
int double.
, max() -
( )
.
max() (
, ).
11, .

2.4.
, .
, ,
C++ ,
- .
.
. ,
, , , .
.

2.

38

// basics/max2.cpp
//
inline int const& max(int const& a, int const& b)
{
return a < b ? b : a;
}
//
template <typename T>
inline T const& max(T const& a, T const& b)
{
return a < b ? b : a;
}
//
template <typename T>
inline T const& max(T const& a, T const& b, T const& c)
{
return max(max(a,b),c);
}
int main();
{
::max(7, 42, 68);
::max(7.0, 42.0);

//
//
//
::max('a', 'b');
//
::max(7, 42);
//
//
//
::max<>(7, 42);
//
::max<double>(7,42);//
//
::max('a', 42.7);
//
//


max<double> (
)
max<char> ( )
,
,

max<int> ( )
max<double> (
)
,
,

}
, ,
.
, ,
.
max() .
max(7,42);

// int
// ,

2.4.

39

,
, . max().
max(7.0,42.0);
max('a', 'b');

//
//
//
//

max<double> (
)
max<char> (
)

. , ,
.
max<>(7,42);

// max<int> ( )

,
,
( 'a', 42.7 int).
max('a', 42.7);

//
// ,
//

: ,
C-.
// basics/max3.cpp
#include <iostream>
#include <cstring>
#include <string>
//
template <typename T>
inline T const& max(T const& a, T const& b)
{
return a < b ? b : a;
}
//
template <typename T>
inline T* const& max(T* const& a, T* const& b)
{
return *a < *b ? b : a;
}
// -
inline char const* const& max(char const* const& a,
char const* const& b)
{
return std::strcmp(a,b) < 0 ? b : a;
}
int main()

2.

40
{
int a = 7;
int b = 42;
::max(a,b);

// max() int

std::string s="hey";
std::string t="you";
::max(s,t); // max() std::string
int* p1 = &b;
int* p2 = &a;
::max(p1,p2); // max()
char const* s1 = "David";
char const* s2 = "Nico";
::max(s1,s2); // max() C-
}
, .
,
.
,
. , max(), , C-, , C- .
// basics/max3a.cpp
#include <iostream>
#include <cstring>
#include <string>
//
// ( )
template <typename T>
inline T const& max(T const& a, T const& b)
{
return a < b ? b : a;
}
// -
// ( )
inline char const* max(char const* a, char const* b)
{
return std::strcmp(a,b) < 0 ? b : a;
}
//
// ( )

2.4.

41

template <typename T>


inline T const& max(T const& a, T const& b, T const& c)
{
return max(max(a,b),c); // , max(a,b)
//
//
int main()
{
::max(7,42,68);

//

const char* s1 = "frederic";


const char* s2 = "anica";
const char* s3 = "lucas";
::max(s1,s2,s3))
//
}
, max() C-,
return max(max(a,b),c);
. , max() C-
, .
, , . ,
( ) , . , max()
int
max() int ,
.
// basics/max4.cpp
//
template <typename T>
inline T const& max(T const& a, T const& b)
{
return a < b ? b : a;
}
//
template <typename T>
inline T const& max(T const& a, T const& b, T const& c)
{
return max(max(a,b),c); //
}
//
// int,
// int

2.

42

//
inline int const& max(int const& a, int const& b)
{
return a < b ? b : a;
}
9.2, . 145, :
.

2.5.
.
.
.
.

.
,
.