友元函數
#include <iostream>
using namespace std;
class Coordinate
{
friend void printXY(Coordinate &c);
public:
Coordinate(int x,int y);
private:
int m_iX;
int m_iY;
};
Coordinate::Coordinate(int x,int y)
{
m_iX = x;
m_iY = y;
}
void printXY(Coordinate &c)
{
cout<<c.m_iX<<","<<c.m_iY;
}
int main()
{
Coordinate coor(3,5);
printXY(coor);
return 0;
}
友元類
class Circle;
class Coordinate
{
friend Circle;
friend void printXY(Coordinate &c);
public:
Coordinate(int x,int y);
private:
int m_iX;
int m_iY;
};
class Circle
{
public:
void printXY()
{
cout<<m_coor.m_iX<<m_coor.m_iY;
}
private:
Coordinate m_coor;
};在這裏插入代碼片
友元關係不可傳遞;
友元關係具有單向性;
友元聲明的形式和數量不受限制;
友元只是封裝的補充,設計巧妙可以避開就更好,不然會暴露數據。
靜態
#include <iostream>
using namespace std;
class Tank
{
public:
Tank(){s_iCount++;}
~Tank(){s_iCount--;}
static int getCount(){return s_iCount;}
static int s_iCount;
private:
string m_strCode;
};
int Tank::s_iCount = 0;
int main()
{
cout<<Tank::getCount()<<endl;
cout<<Tank::s_iCount<<endl;
Tank tank;
cout<<tank.getCount()<<endl;
cout<<tank.s_iCount<<endl;
return 0;
}
靜態的成員函數只能操作靜態數據。
因爲靜態是隨類存在,編譯的。
靜態數據成員必須單獨 初始化。
靜態數據成員只有一份,且不依賴對象而存在,求一個對象的大小時是不包含靜態數據的。
運算符重載
本質:函數重載
關鍵字:operator
一元運算符的重載
-負號的重載:
成員函數的重載:
#include <iostream>
using namespace std;
class Coordinate
{
public:
Coordinate(int x, int y);
Coordinate& operator-();
private:
int m_iX;
int m_iY;
};
Coordinate::Coordinate(int x, int y)
{
m_iX = x;
m_iY = y;
}
Coordinate& Coordinate::operator-()
{
m_iX = -m_iX;
m_iY = -m_iY;
return *this;
}
int main()
{
Coordinate coor1(3,5);
-coor1; //等價於coor1.operator-();
return 0;
}
友元函數重載:
#include <iostream>
using namespace std;
class Coordinate
{
friend Coordinate operator-(Coordinate &coor);
public:
Coordinate(int x, int y);
private:
int m_iX;
int m_iY;
};
Coordinate::Coordinate(int x, int y)
{
m_iX = x;
m_iY = y;
}
Coordinate operator-(Coordinate &coor)
{
coor.m_iX = -coor.m_iX;
coor.m_iY = -coor.m_iY;
return coor;
}
int main()
{
Coordinate coor1(3,5);
-coor1; //等價於operator-(coor1);
return 0;
}
後置++重載
#include <iostream>
using namespace std;
class Coordinate
{
public:
Coordinate(int x, int y);
Coordinate operator++(int); //後置++,裏面的int只是後置運算符的標誌
private:
int m_iX;
int m_iY;
};
Coordinate::Coordinate(int x, int y)
{
m_iX = x;
m_iY = y;
}
Coordinate Coordinate::operator++(int)
{
Coordinate old(*this);
m_iX++;
m_iY++;
return old;
}
int main()
{
Coordinate coor1(3,5);
coor1++; //coor1.operator++(0);
return 0;
}
<<運算符重載
#include <iostream>
using namespace std;
class Coordinate
{
friend ostream& operator<<(ostream &out, const Coordinate &coor);
public:
Coordinate(int x, int y);
private:
int m_iX;
int m_iY;
};
Coordinate::Coordinate(int x, int y){
m_iX = x;
m_iY = y;
}
ostream& operator<<(ostream &out, const Coordinate &coor)
{
out<<coor.m_iX<<","<<coor.m_iY;
return out;
}
int main()
{
Coordinate coor(3,5);
cout<<coor; //operator<<(cout,coor);
return 0;
}
函數模板
#include <iostream>
using namespace std;
template <class T>
T maxx(T a,T b)
{
return (a>b)?a:b;
}
int main()
{
int ival = maxx(100,99);
char cval = maxx<char>('A','B');
cout<<ival<<endl;
cout<<cval<<endl;
return 0;
}
變量作爲函數模板
template <int size>
void display()
{
cout<<size<<endl;
}
int main(){
display<10>();
}
多參數函數模板
template <typename T, typename C>
void display(T a, C b)
{
cout<<a<<" "<<b<<endl;
}
int main()
{
int a=1024;
string str = "hello world!";
display<int, string>(a,str);
return 0;
}
typename和class可以混用。
類模板
模板代碼暫時不能分離編譯。
得將所有代碼都寫在h文件裏。