提起数据共享与复用,想到的是模板、继承、友元、全局变量、静态成员,因此做此总结。
C++数据共享方式:
- 全局变量、全局函数、外部变量、外部函数。
后者需要extern声明。 - 类的静态成员
(类成员有三种访问权限,在类中,无论何种权限的成员都可直接访问;而在类外,只能通过类的对象访问public成员)
而类所有对象共享静态成员,静态成员包括静态数据成员和静态成员函数,其中静态数据成员函数只能访问静态数据成员。
定义:类内声明前加static.使用如下:
class A{
public:
//静态成员因为类共享,因此不可使用this指针。
static string banji;
//静态数据成员,只能类内声明,类外初始化。
//静态成员函数只能访问静态数据成员。
static void getinfo1()
{
cout<<banji<<endl;
};
string name;
};
/*调用,因为不属于某个对象,因此只能通过
类名::静态成员形式访问*/
string A::banji="2018-2";
A::getinfol();
- 友元
友元,会破坏数据封装和隐藏,友元的目的就是让一个函数/类访问另一个类的私有成员。友元包括友元函数和友元类两种情况,友元函数既可以是类的成员函数也可以是普通全局函数。·
//case1:全局函数做友元函数,其参数一般为类的对象
class A{
public:
friend void fun(A a);
string name;
private:
int age;
};
void fun(A a){cout<<a.age<<endl;}
/*case2:成员函数作为友元函数,对其参数没有要有
对象的要求,但是若没有,则成函所属类应有
被访问类的对象做为数据成员*/
class A1;
class A{
public:
friend void A1::fun();//声明类A1的成函是类A的友元函数。
string name;
private:
int age;
};
class A1{
public:
void fun();
A a;
};
void A1::fun()//类外定义成函的格式。
{cout<<a.age<<endl;}
//case3:友元类
class A1;
class A{
public:
string name;
friend class A1;//表明类A1是类A的友元类,A1可以访问A类对象的私有成员。
private:
int age;
};
class A1{
public:
A a;
void fun(){
cout<<a.name<<"的年龄是"<<a.age<<endl;
}
};
- 模板
模板包括模板函数和模板类,当类A和类B差别不大,只是成员参数类型不同时,就很适合用模板。
关键字:template<class T1,Typename T2>
(1)模板函数
template<class T1,Typename T2>
void readout(T1 a,T2 b){
cout<<"第一个:"<<a<<endl;
cout<<"第二个:"<<b<<endl;
}
int main()
{
int a=3;
string b="3";
char c='6';
int d=6;
//调用模板函数
read(a,d);//可以由编译器根据传入参数自动生成
read<int>(3,6);//也可以明确指定要参数实例话哪种类型。
return 0;
}
(2)模板类
template<Typename T>
class A{
public:
A(T t){
this->t=t;
}
T get()
{
return t;
}
protected:
T t;
};
A<int> a(100);//初始化一个对象。
class B:public A<int>
{
public:
B(int a=10,int b=10):A<int> (a)
{
this->b=b;
}
private:
int b;
}