一般类、&、const、模板、友元函数、操作符重载基本用法及实现
complex.h
# ifndef COMPLEX_H
# define COMPLEX_H
# include <ostream>
using namespace std; template < typename T >
class Complex { public : Complex ( ) : re ( 0 ) , img ( 0 ) { } Complex ( T _re, T _img) : re ( _re) , img ( _img) { } void setRe ( const T& _re) { re= _re; } void setImg ( const T& _img) { img= _img; } T getRe ( ) const { return re; } T getImg ( ) const { return img; } inline Complex< T> & operator + ( const Complex< T> & a) ; template < typename N > inline friend Complex< N> operator + ( const Complex< N> & a, const N& b) ; template < typename N > inline friend Complex< N> operator + ( const N& a, const Complex< N> & b) ; private : T re; T img;
} ;
template < typename T >
inline Complex< T> & Complex< T> :: operator + ( const Complex< T> & a) { this -> re= this -> re+ a. re; this -> img= this -> img+ a. img; return * this ;
} template < typename T >
inline Complex< T> operator + ( const Complex< T> & a, const T& b) { Complex< T> sum= Complex < T> ( a. re+ b, a. img) ; return sum;
} template < typename T >
inline Complex< T> operator + ( const T& a, const Complex< T> & b) { Complex< T> sum= Complex < T> ( a+ b. re, b. img) ; return sum;
}
template < typename T >
inline ostream& operator << ( ostream& os, const Complex< T> & a) { return os<< a. getRe ( ) << "---" << a. getImg ( ) ;
} # endif
complexTest.cpp
# include <iostream>
# include "complex.h"
using namespace std;
int main ( )
{ Complex< double > a; a. setRe ( 2.0 ) ; a. setImg ( 3.0 ) ; cout << a << endl; Complex< double > b ( 1.5 , 2.0 ) ; a = a + 3.0 ; cout << a << endl; Complex< double > c = a + b; cout << c << endl; Complex< double > d = 3.0 + b; cout << d << endl; cout << c<< endl << d; return 0 ;
}
含有指针的类,构造,拷贝构造,赋值,析构函数
myString.h
# ifndef MYSTRING_H
# define MYSTRING_H
# include <ostream>
# include <string.h>
using namespace std;
class myString { public : myString ( const char * _str= 0 ) { if ( _str== 0 ) { str= new char [ 1 ] ; strcpy ( str, "\0" ) ; } else { str= new char [ strlen ( _str) + 1 ] ; strcpy ( str, _str) ; } } myString ( const myString& _str) { str= new char [ strlen ( _str. str) + 1 ] ; strcpy ( str, _str. str) ; } myString& operator = ( const myString& _str) { if ( str== _str. str) { return * this ; } else { delete [ ] str; str= new char [ strlen ( _str. str+ 1 ) ] ; strcpy ( str, _str. str) ; return * this ; } } ~ myString ( ) { delete [ ] str; } char * getStr ( ) const { return str; } friend ostream& operator << ( ostream& os, myString& _str) ; private : char * str;
} ;
ostream& operator << ( ostream& os, myString& _str) { return os<< _str. str;
} # endif
myStringTest.cpp
# include <iostream>
# include "myString.h"
using namespace std;
int main ( )
{ myString a ( "defg" ) ; myString b; b = a; myString c = a; cout << a << "*" << b << "*" << c << "*" << endl; return 0 ;
}
类型转换函数、explicit用法
fraction.h
# ifndef FRACTION_H
# define FRACTION_H class Fraction { public : explicit Fraction ( int _numerator, int _denominator= 1 ) : numerator ( _numerator) , denominator ( _denominator) { } operator double ( ) const { return ( double ) numerator/ denominator; } Fraction& operator + ( const Fraction& a) { this -> numerator = this -> numerator* a. denominator + this -> denominator+ a. numerator; this -> denominator = this -> denominator * a. denominator; return * this ; } private : int numerator; int denominator;
} ; # endif
fractionTest.cpp
# include <iostream>
# include "fraction.h"
using namespace std;
int main ( ) { Fraction a ( 1 , 4 ) ; cout << ( double ) a << endl; cout << a + 4 ; return 0 ;
}
将函数作为另一个函数参数两种方式:1)函数指针;2)仿函数
bigger.h
# ifndef BIGGER_H
# define BIGGER_H class BiggerThan { public : BiggerThan ( double _x) : x ( _x) { } bool operator ( ) ( const double & i) const { return i> x; } private : double x;
} ; # endif
functor.cpp
# include <iostream>
# include "bigger.h"
using namespace std;
int biggerNumber ( double * arr, int size, const BiggerThan& bigger) { int cnt= 0 ; for ( int i= 0 ; i< size; i++ ) { bigger ( arr[ i] ) ? cnt++ : cnt; } return cnt;
}
int biggerNumberPoint ( double * arr, int size, double cpy, bool ( * fp) ( double , double ) ) { int cnt= 0 ; for ( int i= 0 ; i< size; i++ ) { fp ( arr[ i] , cpy) ? cnt++ : cnt; } return cnt;
}
bool biggerPoint ( double i, double x) { return i> x;
} int main ( )
{ BiggerThan bigger ( 10 ) ; double array[ ] = { 1.4 , 12.0 , 14.0 , 15.0 , 3.0 } ; cout << biggerNumber ( array, 5 , bigger) << endl; cout << biggerNumberPoint ( array, 5 , 10 , biggerPoint) << endl; return 0 ;
} ;
智能指针
智能指针可以自动释放占用的内存 shared_ptr 共享智能指针 unique_ptr独享智能指针,跟普通指针大小一样,不允许拷贝构造 weak_ptr共享指针指针,解决循环引用问题,从智能指针生成
pointer.h
# ifndef SMART_POINTER_POINTER_H
# define SMART_POINTER_POINTER_H
# include <memory>
# include <string>
# include <vector>
# include <iostream>
using namespace std;
class StringBlob {
public : StringBlob ( ) { } StringBlob ( initializer_list< string> ss) : sp ( make_shared < vector< string>> ( ss) ) { } void push_back ( const string& s) { sp-> push_back ( s) ; } void pop_back ( ) { if ( check ( 0 ) ) sp-> pop_back ( ) ; } private : shared_ptr< vector< string> > sp; bool check ( const int & i) { if ( i> 0 && i< sp-> size ( ) ) return true ; else return false ; } } ;
class WoMan ;
class Man {
public : void setdata ( shared_ptr< WoMan> _mdata) { mdata = _mdata; } ~ Man ( ) { std:: cout << "Man has destory" << std:: endl; }
private :
weak_ptr< WoMan> mdata;
} ; class WoMan {
public : void setdata ( shared_ptr< Man> _mdata) {
mdata = _mdata;
} ~ WoMan ( ) { std:: cout << "woman has destory" << std:: endl; } ;
private : shared_ptr< Man> mdata;
} ;
# endif
pointerTest.cpp
# include <iostream>
# include "pointer.h"
# include <string>
# include <iostream>
using namespace std;
int main ( )
{ StringBlob s1 = { "test1" , "tess4" , "test5" } ; s1. push_back ( "test" ) ; unique_ptr< string> up ( new string ( "wuhand" ) ) ; unique_ptr< string> up3 ( new string ( "beijing" ) ) ; string* up_point = new string ( "11111" ) ; cout << "unique_ptr size " << sizeof ( up) << endl; cout << * up << endl; unique_ptr< string> up2 ( up. release ( ) ) ; cout << * up2 << endl; cout << * up3 << endl; up3. reset ( up_point) ; cout << * up3 << endl; up3. reset ( nullptr ) ; shared_ptr< WoMan> woman = make_shared < WoMan> ( ) ; shared_ptr< Man> man = make_shared < Man> ( ) ; woman-> setdata ( man) ; man-> setdata ( woman) ; cout << man. use_count ( ) << endl; cout << woman. use_count ( ) << endl; cout << "............" << endl; auto p = make_shared < int > ( 3 ) ; weak_ptr< int > w_p ( p) ; cout << "wark ptr size " << sizeof ( w_p) << endl; auto p2 = w_p. lock ( ) ; cout << p. use_count ( ) << endl; weak_ptr< int > w_p2 ( p) ; p2. reset ( ) ; p. reset ( ) ; if ( w_p2. expired ( ) ) { cout << "p has no object" << endl; } cout << p. use_count ( ) << endl; return 0 ;
}
可变参数、auto、Ranged-base
sample_c11.cpp
# include <iostream>
# include <vector>
# include <algorithm>
using namespace std;
void print ( )
{ }
template < typename T , typename . . . Types>
void print ( const T& first, const Types& . . . args)
{ cout << first << endl; print ( args. . . ) ;
} int main ( )
{ print ( "wuhan" , "beijing" , 2333333 ) ; vector< int > test = { 1 , 50 , 3 , 5 , 4 } ; auto position = find ( test. begin ( ) , test. end ( ) , 50 ) ; if ( position != test. end ( ) ) { cout << * position << endl; cout << "position " << distance ( test. begin ( ) , position) << endl; } for ( auto i : test) { cout << i << " " ; } cout << endl; for ( auto & i : test) { i = 10 ; } for ( auto i : test) { cout << i << " " ; } cout << endl; return 0 ;
}
继承和多态,虚函数、打破虚函数
quote.h
# ifndef QUOTE_H
# define QUOTE_H # include <iostream>
using namespace std;
class Quote { public : Quote ( double _price) : price ( _price) { } virtual const double sell_price ( ) const { return price; } virtual ~ Quote ( ) { cout<< "Quote has destroy" << endl; } protected : double price;
} ; class Bulk_Quote : public Quote { public : Bulk_Quote ( double _radio, double _price) : radio ( _radio) , Quote ( _price) { } virtual const double sell_price ( ) const { return price* radio; } virtual ~ Bulk_Quote ( ) { cout<< "Bulk_Quoto has destroy" << endl; } private : double radio;
} ; # endif
quoteTest.cpp
# include <iostream>
# include "quote.h"
# include <memory>
using namespace std;
int main ( )
{ Quote q1= Quote ( 10 ) ; Bulk_Quote q2= Bulk_Quote ( 0.5 , 10 ) ; cout << q1. sell_price ( ) << endl; cout << q2. sell_price ( ) << endl; cout << q2. Quote :: sell_price ( ) << endl;
return 0 ;
}
容器vector, list等、关联容器map, set等
stl_test.cpp
# include <iostream>
# include <algorithm>
# include <functional>
# include <vector>
# include <list>
# include <deque>
# include <set>
# include <map>
# include <unordered_set>
using namespace std;
int main ( )
{ cout << "..........vector............" << endl<< endl; vector< int > a = { 1 , 4 , 3 , 7 , 10 } ; a. push_back ( 8 ) ; cout << "vector size " << a. size ( ) << endl; cout << "vector capacity " << a. capacity ( ) << endl; sort ( a. begin ( ) , a. end ( ) , greater < int > ( ) ) ; for ( int temp : a) { cout << temp << " " ; } cout<< endl; auto target = find ( a. begin ( ) , a. end ( ) , 4 ) ; if ( target != a. end ( ) ) cout << "find target postion " << distance ( a. begin ( ) , target) << endl; cout << "..........list, foward_list............" << endl<< endl; list< int > a_list = { 7 , 5 , 2 , 1 , 6 , 8 } ; a_list. sort ( greater < int > ( ) ) ; for ( list< int > :: iterator temp= a_list. begin ( ) ; temp!= a_list. end ( ) ; temp++ ) { cout << * temp << " " ; } cout<< endl; for ( auto temp : a_list) cout << temp << " " ; cout << endl; cout << "..........deque queue stack............" << endl<< endl; deque< int > a_deque = { 7 , 5 , 2 , 1 , 6 , 8 } ; sort ( a_deque. begin ( ) , a_deque. end ( ) , less < int > ( ) ) ; for ( auto temp : a_deque) cout << temp << " " ; cout << endl; cout << "..........multiset multimap............" << endl<< endl; multiset< int > a_multiset = { 3 , 1 , 3 , 2 , 5 , 8 , 7 } ; a_multiset. insert ( 20 ) ; auto target_multiset = a_multiset. find ( 7 ) ; if ( target_multiset != a_multiset. end ( ) ) cout << "multiset find " << * target_multiset << endl<< endl; for ( auto temp : a_multiset) cout << temp << " " ; cout << endl; multimap< int , string> a_multimap = { make_pair ( 1 , "wuhan" ) , make_pair ( 5 , "beijing" ) , make_pair ( 3 , "dongfang" ) , } ; for ( auto temp : a_multimap) cout << temp. first << " " << temp. second << endl; auto target_multimap = a_multimap. find ( 5 ) ; cout << "multimap find " << ( * target_multimap) . first << " " << ( * target_multimap) . second << endl; cout << "..........unordered_map unordered_set............" << endl<< endl; unordered_set< int > a_unordered_set = { 3 , 1 , 3 , 2 , 5 , 8 , 7 } ; a_unordered_set. insert ( 20 ) ; for ( auto temp : a_unordered_set) cout << temp << " " ; cout << endl; cout << "................set map..............." << endl<< endl; set< int > a_set = { 3 , 1 , 3 , 2 , 5 , 8 , 7 } ; for ( auto temp : a_set) cout << temp << " " ; return 0 ;
}