zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Windows安装Oracle
    MySQL索引的创建和使用
    使用TensorFlow进行中文情感分析
    gensim库word2vec使用
    软件测试理论
    产品经理
    产品经理
    产品经理
    职业规划及核心竞争力
    项目管理
  • 原文地址:https://www.cnblogs.com/yulianggo/p/9263930.html
Copyright © 2011-2022 走看看