c++0.3----this指针/static/namespace

本篇文章为额外内容:包含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 }

猜你喜欢

转载自www.cnblogs.com/yulianggo/p/9263930.html
今日推荐