一般类、&、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 ;
}