本篇文章为额外内容:包含this指针,static静态成员变量和函数,命名空间。
以下为namespace.h文件的内容:(包含上述所有的知识哦)
1 #ifndef __NAMESPACE__ 2 #define __NAMESPACE__ 3 #include<iostream> 4 using namespace std; 5 6 namespace haha{ //第一个命名空间 7 8 template<typename T> 9 class A{ 10 public: 11 static void set_value(const int& t); 12 static const int& get_value() {return value;} 13 private: 14 static T value; 15 }; 16 17 template<typename T> 18 inline void A<T>::set_value(const int& t){ 19 value=t; 20 } 21 } 22 23 namespace hehe{//第二命名空间 24 25 template<typename T> 26 class A{ 27 public: 28 void print() const {cout<<"value="<<this->value<<endl;} 29 private: 30 static T value; 31 }; 32 } 33 #endif
调用部分:
1 #include<iostream> 2 #include "namespace.h" 3 using namespace std; 4 template<typename T> 5 T haha::A<T>::value=0;//定义haha命名空间下的静态变量 6 template<typename T> 7 T hehe::A<T>::value=0;//定义hehe命名空间下的静态变量 8 9 int main() 10 { 11 haha::A<int> a; 12 hehe::A<int> b;
13 cout<<haha::A<int>::get_value()<<endl; //通过类名访问haha下的get_value()函数 14 a.set_value(1010); 15 b.print(); 16 cout<<a.get_value()<<endl; //通过对象访问get_value()函数; 17 cout<<"1"<<endl; 18 return 0; 19 }
一.this指针:
成员函数有一个隐藏的形参,叫做this指针。c1.real()其实相当于complex::real(&c1) 会把&c1作为实参传给形参this。在类的成员函数里面,this指针可以省略,在编译器编译时,this指针自动被补充。因为静态成员函数没有访问非静态成员变量的功能,因此,静态成员函数不包含默认的this指针。
二.static静态成员变量和函数:
静态成员变量与每个对象无关,它对每个对象应该是一样的。静态变量只能在类外初始化,不能由构造函数给它赋值,它不能有类的对象决定。例如银行的类,利率就可以设置为静态成员变量。
static静态成员函数:
静态成员函数没有this指针,它只能存取静态成员,不能访问非静态成员变量。因此它专门用来处理静态成员变量。
注意:static静态成员函数不能为常函数哦。因为,常函数是针对成员变量而言,不能修改成员变量的值。而static成员函数连this指针都没有,根本碰不到非静态成员,所以,不能被const修饰。
三.模板函数:
如果不想确定函数所处理的变量的类型,而是根据使用者的需要改变而改变,那么可以用模板函数。
例如:
1 template<class T> 2 3 const T& big(const T& num1,const T& num2) 4 { 5 (num1>num2)?num1:num2; 6 }
调用的时候不必明确指出来。
例如stone r1=(2,3),stone r2=(3,2);stone r3;
r3=min(r1,r2)
编译器会对模板进行实参类型推导。推导的结果为stone,当运行到num1>num2时,会调用stone类的运算符>重载函数。stone类的定义此处省略,反正跟其他的类一个样。
四:模板类:
如果不想确定类里面某些具体类型,而是依据创建对象时所指定的类型的改变而改变。那么将类型替换为任何字符,等待用户指定时替换,用模板就好了。
例如:
1 template<typename T> 2 class complex{ 3 friend complex& __doapl(complex& com1,const complex& com2); 4 5 public: 6 inline T real() { return re;} 7 inline const T& image() const {return im;} 8 inline T(T r=0.0,T i=0.0):re(r),im(i){} 9 T func(complex &com){} 10 11 private: 12 T re; 13 T im; 14 15 };
调用时要明确指定T的类型。
例如:
complex<int> com1;
五.命名空间:
若一个文件内出现两个同名的类,可以用命名空间把他们划分到不同的区域。
标准库所有的代码在namespace std里面。一个命名空间可以出现在任何文件里,到最后系统会进行拼接。
命名空间的格式如下:
1 namespace haha 2 { 3 . . . 4 }