Académique Documents
Professionnel Documents
Culture Documents
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
//
2.
42
//
inline int const& max(int const& a, int const& b)
{
return a < b ? b : a;
}
9.2, . 145, :
.
2.5.
.
.
.
.
.
,
.