一般类、&、const、模板、友元函数、操作符重载基本用法及实现
complex.h
#ifndef COMPLEX_H
#define COMPLEX_H
#include
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
#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
#include
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
#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
#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
#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
#include
#include
#include
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
#include"pointer.h"
#include
#include
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
#include
#include
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
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
#include "quote.h"
#include
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
#include
#include
#include
#include
#include
#include
#include
#include
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;
}