第十七章 特殊类成员

第十七章  特殊类成员

1.1  静态成员变量

假如我们要在一个类中的所有对象间共享某种数据,那不妨将其设置为静态成员变量/函数;

static x

1.2  静态成员变量

静态成员变量与成员变量有4点不同:

①前者属于类②前者必须在全局定义③前者被调用只用说明那个类即可④前者在没有创建对象之前就已经存在

 1 #include <iostream>
 2 using namespace std;
 3 class A 
 4 {
 5 public:
 6     static int n;
 7 };
 8 int A::n=0;    //要使用类成员限定来访问静态成员
 9 void show(){cout<<A::n<<"a \n";}
10 int main()
11 {
12     int i;
13     for(i=0;i<5;i++)
14     {
15         A::n++;            //访问静态成员变量n并对其进行自加操作............公有的可以直接访问①
16         show();                //调用全局函数show,该函数输出静态成员变量n的值
17     }
18     return 0;
19 }

 

2.  私有静态成员变量

 1 #include <iostream>
 2 using namespace std;
 3 class A 
 4 {
 5 public:
 6     void func(){cout<<A::x<<endl;;}     //定义公有成员函数func(),用该函数访问私有静态成员变量x
 7 private:
 8     static int x;                 //将静态成员变量x声明为私有
 9 };
10 int A::x=1000;                 //定义并初始化静态成员变量
11 int main()
12 {
13     A a;                          //创建一个对象
14     a.func();                         //用该对象访问公有成员函数func()
15     //cout << A::x <<endl;        //注意不能直接访问...............私有的不可以直接访问①
16     return 0;
17 }

 

3.  静态成员函数

静态成员函数在未创建对象时也可以使用,它的使用和静态成员变量一样 ①

 1 /*
 2 #include <iostream>
 3 using namespace std;
 4 class A
 5 {
 6 public:
 7     void static show(){cout<<A::n;n++;}     //注意:静态成员函数不能访问某个对象的成员变量,因为他没有指向该对象的this指针。不过它可以访问该类的静态成员变量 ②
 8 private:
 9     static int n;                      //声明私有静态成员变量n
10 };
11 int A::n=0;                             //定义私有静态成员变量n
12 int main()
13 {
14     int i;
15     for(i=0;i<5;i++) 
16     {
17         A::show();                         //循环调用公有静态成员函数show()
18         cout<<endl;
19     }
20     return 0;
21 }
22 */
23 
24 /*
25 //另外我们也可以通过对象来访问静态成员函数,如:
26 #include <iostream>
27 using namespace std;
28 class A
29 {
30 public:
31     void static show(){cout<<A::n;n++;}
32 private:
33     static int n;
34 };
35 int A::n=0;
36 int main()
37 {
38     A a,b,c;
39     a.show();
40     b.show();
41     c.show();
42     return 0;
43 }
44 */
45 
46 
47 
48 #include <iostream>
49 using namespace std;
50 class A
51 {
52 public:
53     void show(int i){x=i;cout<<x;}
54     //void static show1(int j){x=j;cout<<x;}
55     //静态成员函数没有指向对象的this指针,所以不能访问对象的成员数据
56 private:
57     int x;
58 };
59 int main()
60 {
61     A a;
62     a.show(1);
63     //a.show1(2); 
64     //不能通过静态成员函数访问自己的成员变量
65     return 0;
66 }

 

4.  静态成员的使用

静态成员可以被继承。

类中任何成员函数都可以访问静态成员,但是静态成员函数不能直接访问非静态成员,静态成员函数不能说明为虚函数

 

 1 #include <iostream>
 2 using namespace std;
 3 class aspl         //将阿司匹林声明为一个aspl类,那么每箱阿司匹林就是该类的一个对象      
 4 {
 5 public:
 6     aspl(float p){price=p;TotalPrice=p+TotalPrice;}    //在构造函数中实例化该对象的私有成员变量price,这样就得到了一箱阿司匹林并且有了它的初始价格
 7     ~aspl(){TotalPrice=TotalPrice-price;}     //析构函数销毁该对象并且将总价格减去该箱的价格,这样账面上就少了一箱阿司匹林,并且总价格也减去了该箱的价格
 8     static float get(){return TotalPrice;}
 9 private:
10     float price;                //由于每箱阿司匹林都有价格,因此必须得有个成员变量来表示价格,这里在aspl这个类中声明一个私有成员变量price
11     static float TotalPrice;      //由于阿司匹林的总价格属于类的总价格,而不是某一箱阿司匹林的价格,因此我们要将总价格声明为静态成员变量,这里声明为TotalPrice
12 };
13 float aspl::TotalPrice=0;      //静态成员变量必须初始化
14 void main()
15 {
16     float f;
17     cout<<"阿司匹林的库存总价格为:";
18     cout<<aspl::get()<<endl;      //必须用类名限定符来调用静态成员函数
19     int i=0;
20     cout<<"请输入第"<<i+1<<"次购进的阿司匹林的单箱价格:";
21     cin>>f;
22     aspl *p[5];                  //定义了5个指向aspl类的数组指针p
23     p[i]=new aspl(f);           //购进一箱阿司匹林
24     cout<<"阿司匹林的库存总价格为:";
25     cout<<aspl::get()<<endl;      //输出总价格
26     i++;                          //i代表购进的次数,i++表示将要进行i+1次购进
27     cout<<"请输入第"<<i+1<<"次购进的阿司匹林的单箱价格:";  //提示用户输入i次购进
28     cin>>f;
29     p[i]=new aspl(f);          //输入的数值保存在i次购进的对象的成员变量中
30     cout<<"阿司匹林的库存总价格为:";
31     cout<<aspl::get()<<endl;     //输出当前的库存总价格
32     cout<<"请输入卖出的阿司匹林的编号,编号即第几次购进:";//提示用户要删除哪次购进
33     cin>>i;                        //将输入值保存在i变量中
34     delete p[i];                  //删除第i次创建的对象
35     cout<<"阿司匹林的库存总价格为:";
36     cout<<aspl::get()<<endl;      //再次输出销售一箱阿司匹林后的库存总价格
37 }

 

 

 

5.  函数指针

long(*func1)(int);  //声明了一个函数指针

long* func2(int);  //声明了一个返回指针的函数

第一种定义了一个叫func1的函数指针,该指针指向一个含有int型参数并且返回值为long型的函数

函数指针名可以看作函数名的代号,我们可以通过它来直接调用函数,所以函数指针经常会在条件或者判断语句里出现,以便于用户选择调用不同名字但又类型和参数相同的函数。

另外要注意的是:函数指针可以指向某个函数,但是前提是被指向的函数的参数和返回至都与该函数指针被声明时的返回值和参数相吻合

 

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 bool check(string str)     //检测是否是数字的函数,要注意该函数一定要放在调用函数的上面
 5 {
 6    for(int i = 0;i<str.length();i++)
 7    if((str[i]>'9' || str[i]<'0')&&(str[i]!='.'))
 8    return false;
 9    return true;
10 }
11 float triangle(float &x,float &y)
12 {
13    return x*y*0.5;
14 }
15 float rectangle(float &x,float &y)
16 {
17    return x*y;
18 }
19 void Swap(float &x,float &y)
20 {
21    float n;
22    n=x;
23    x=y;
24    y=n;
25 }
26 void print(float &x,float &y)
27 {
28    cout<<"长为:"<<x<<"  "<<"宽为:"<<y<<endl;
29 }
30 void get(float &a ,float &b)
31 {
32    cout<<"请输入x的新值:";
33    string str1;cin>>str1;
34    while(!check(str1))     //调用检测数字函数,如果返回值为假,执行该循环,为真退出
35    {
36       cout<<"输入的不是数字,请重新输入!!!"<<endl;
37       cin>>str1;
38    }
39    a = atof(str1.c_str());         //将字符串转换为浮点数
40    cout<<"请输入y的新值:";
41    string str2;cin>>str2;
42    while(!check(str2)){
43       cout<<"输入的不是数字,请重新输入!!!"<<endl;
44       cin>>str2;
45    }
46    b = atof(str2.c_str());
47 }
48 int main()
49 {
50    void(*p)(float &,float &);         //声明一个函数指针p,该指针指向一个返回void值并且带有两个float参数的函数
51    float(*fp)(float &, float &);        //声明一个函数指针fp,该指针指向一个返回float值并且带有两个float参数的函数
52    bool quit=false;
53    float a=2,b=3;                     //定义两个参数a和b的值
54    int choice;                           //声明选择参数choice
55    while(quit==false)
56    {
57       cout<<"(0)退出(1)设定长宽(2)三角形(3)矩形(4)交换长宽:";
58       cin>>choice;
59       switch(choice)                     //条件判断语句
60       {
61          case 1:
62             p=get;                        //用指针p来指向函数名get,该函数带有两个float参数并返回一个void值,与函数指针p的参数和类型相吻合
63             break;
64          case 2:
65             fp=triangle;                //用指针fp来指向函数名triangle,该函数带有两个float参数并返回一个float值,与函数指针fp的参数和类型相吻合
66             break;
67          case 3:
68             fp=rectangle;                //用指针fp来指向函数名rectangle,该函数带有两个float参数并返回一个float值,与函数指针fp的参数和类型相吻合
69             break;
70          case 4:
71             p=Swap;                       //用指针p来指向函数名swap,该函数带有两个float参数并返回一个void值,与函数指针p的参数和类型相吻合
72             break;
73          default:
74             quit=true;
75             break;
76       }
77       if(quit)break;
78       if(choice==1||choice==4)            //假如选择了第1或者第4项
79       {
80          print(a,b);
81          p(a,b);                             //调用函数指针p所指向的函数,该指针指向的是一个返回值为void的函数,由于不同的选项中将不同的函数名赋给了指针p,因此选择不同则调用的函数也不同
82          print(a,b);
83       }
84       else if(choice==2||choice==3)        //假如选择了第2和第3项
85       {
86          print(a,b);
87          cout<<"面积为:"<<fp(a,b)<<endl;    //调用函数指针fp所指向的函数,该指针指向的是一个返回值为float的函数,由于不同的选项中将不同的函数名赋给了指针fp,因此选择不同则调用的函数也不同
88       }
89    }
90    return 0;
91 }

 

 

 

6.  函数指针数组

void(*p[5])(float &,float &);

7.  函数指针也可以作为函数的参数

 1 #include <iostream>
 2 using namespace std;
 3 void square(int &x,int &y)
 4 {
 5     x=x*x;
 6     y=y*y;
 7 }
 8 void cube(int &x,int &y)
 9 {
10     x=x*x*x;
11     y=y*y*y;
12 }
13 void Swap(int &x,int &y)
14 {
15     int z;
16     z=x;
17     x=y;
18     y=z;
19 }
20 void print(void(*p)(int &x,int &y),int &x,int &y)    //该函数有3个参数,第1个是一个函数指针p,它指向的函数带有两个参数,
21                                                     //并返回一个void值,另外还有两个int型引用x和y
22 {
23     cout<<"执行函数前\n";
24     cout<<"x:"<<x<<"\t"<<"y:"<<y<<endl;
25     p(x,y);
26     cout<<"执行函数后\n";
27     cout<<"x:"<<x<<"\t"<<"y:"<<y<<endl;
28 }
29 int main()
30 {
31     int a=2,b=3;
32     char choice;
33     bool quit=false;
34     void (*p)(int &,int &);
35     //声明的p为一个函数指针,它所指向的函数带有两个参数并返回 一个void值
36     while(quit==false)
37     {
38         cout<<"(0)退出(1)平方(2)立方(3)交换参数:";
39         cin>>choice;
40         switch(choice)
41         {
42         case '0':quit=true;
43         case '1':p=square;break;         //输入1,将函数名square的地址赋给p
44         case '2':p=cube;break;        //输入2,将函数名cube的地址赋给p
45         case '3':p=Swap;break;        //输入3,将函数名Swap的地址赋给p
46         default:p=0;break;
47         }
48         if(quit==true)break;
49         if(p==0)
50         {
51             cout<<"请输入0到3之间的数字\n";
52             continue;
53         }
54         print(p,a,b);                    //调用将函数指针作为参数的函数print
55     }
56     return 0;
57 }

 

8.  使用typedef简化函数指针的声明

 1 //typedef 可以简化代码 可以为现有类型创建一个新的名字,或者声明一个对象为某个新类型typedef void(*vp)(int &,int &);
 2 //#define f(x) x*x ≠ #define f(x) (x*x)  typedef要比#define要好,特别是在有指针的场合 再比如
 3 //      typedef char* pStr1;    //后面代替前面
 4 //        #define pStr2 char*        //没有分号,前面代替后面
 5 //      pStr1 s1, s2;        //定义了两个char* 
 6 //    pStr2 s3, s4;        //定义了一个char* s3 一个char s4
 7 //
 8 
 9 #include <iostream>
10 using namespace std;
11 typedef void(*vp)(int &,int &);//typedef 将vp声明为一个函数指针类型,该类型的指针指向一个带有两个int型引用参数并返回void的函数
12 void square(int &x,int &y)
13 {
14     x=x*x;
15     y=y*y;
16 }
17 void cube(int &x,int &y)
18 {
19     x=x*x*x;
20     y=y*y*y;
21 }
22 void Swap(int &x,int &y)
23 {
24     int z;
25     z=x;
26     x=y;
27     y=z;
28 }
29 void print(vp,int &,int &);            //print函数的声明部分,该函数有三个参数,一个vp类型的函数指针,两个int型引用。
30 int main()
31 {
32     vp p;
33     int a=2,b=3;
34     char choice;
35     bool quit=false;
36     while(quit==false)
37     {
38         cout<<"(0)退出(1)平方(2)立方(3)交换参数:";
39         cin>>choice;
40         switch(choice)
41         {
42         case '0':quit=true;
43         case '1':p=square;break;     //输入,将函数名square的地址赋给p
44         case '2':p=cube;break;      //输入,将函数名cube的地址赋给p
45         case '3':p=Swap;break;      //输入,将函数名Swap的地址赋给p
46         default:p=0;break;
47         }
48         if(quit==true)break;
49         if(p==0)
50         {
51             cout<<"请输入0到3之间的数字\n";
52             continue;
53         }
54         print(p,a,b);                    //调用这个将函数指针作为参数的函数
55     }
56     return 0;
57 }
58 void print(vp p,int &x,int &y)    //print函数的定义部分,函数头声明了3个接收参数,第1个是vp类型的函数指针p,它指向的函数带有两个参数并返回一个void值,另外还有两个int型引用x和y
59 {
60     cout<<"执行函数前\n";
61     cout<<"x:"<<x<<"\t"<<"y:"<<y<<endl;
62     p(x,y);
63     cout<<"执行函数后\n";
64     cout<<"x:"<<x<<"\t"<<"y:"<<y<<endl;
65 }

 

9.  类的函数指针

 1 #include <iostream>
 2 using namespace std;
 3 class human                                 //抽象类human
 4 {
 5 public:
 6     virtual void run()=0;                    //纯虚函数run
 7     virtual void eat()=0;                    //纯虚函数eat
 8 };
 9 class mother:public human                 //派生类mother从抽象类human继承
10 {
11 public:
12     void run(){cout<<"母亲跑百米要花二十秒\n";}    //覆盖纯虚函数run
13     void eat(){cout<<"母亲喜欢吃零食\n";}    //覆盖纯虚函数eat
14 };
15 class father: public human                 //派生类father从抽象类human继承
16 {
17 public:
18     void run(){cout<<"父亲跑百米要花十秒\n";}    //覆盖纯虚函数run
19     void eat(){cout<<"父亲不喜欢吃零食\n";}    //覆盖纯虚函数eat
20 };
21 class uncle:public human                 //派生类uncle从抽象类human继承
22 {
23 public:
24     void run(){cout<<"舅舅跑百米要花十一秒\n";}    //覆盖纯虚函数run
25     void eat(){cout<<"舅舅喜欢偷吃零食\n";}        //覆盖纯虚函数eat
26 };
27 int main()
28 {
29     void(human::*pf)()=0;                    //声明一个成员函数指针pf,该指针属于抽象类human
30     human* p=0;                             //声明一个指向抽象类human的指针p,并将它的内存地址赋为0
31     char choice1,choice2;                    //声明两个字符变量,用来保存两次用户输入的字符
32     bool quit=false;                         //声明一个布尔变量quit作为while循环的条件
33     while(quit==false)                        //当quit为真时退出循环
34     {
35         cout<<"(0)退出(1)母亲(2)父亲(3)舅舅:";    //选择菜单
36         cin>>choice1;                        //将用户的第1次选择保存在choice1中
37         switch(choice1)                        //将该选择作为判断的依据
38         {
39             case '0':quit=true;break;            //假如输入了字符0,那么将quit的值赋为真,然后退出switch循环
40             case '1':p=new mother;break;        //假如输入了字符1,那么创建mother类的新对象,并将p指向它,然后退出switch循环
41             case '2':p=new father;break;        //假如输入了字符2,那么创建father类的新对象,并将p指向它,然后退出switch循环
42             case '3':p=new uncle;break;        //假如输入了字符3,那么创建uncle类的新对象,并将p指向它,然后退出switch循环
43             default:choice1='q';break;        //将字符q赋给choice1,然后退出switch循环
44         }
45         if(quit)                                //假如quit的值为真
46             break;                                //退出while循环
47         if(choice1=='q')                        //假如choice1的值为字符q
48         {    cout<<"请输入0到3之间的数字\n";
49             continue;
50         } //输出警告并跳转到while循环的开始处继续执行
51         cout<<"(1)跑步(2)进食\n";                //输出选择菜单
52         cin>>choice2;                                //将第2次用户的选择保存在choice2中
53         switch(choice2)                        //将用户的第2次选择作为判断的依据
54         {
55             case '1':pf=&human::run;break;        //假如输入了字符1,那么将基类human的虚函数run的内存地址赋给成员函数指针,然后退出switch循环。注意,这里的&号是取human类成员函数run的地址
56             case '2':pf=&human::eat;break;        //假如输入了字符2,那么将基类human的虚函数eat的内存地址赋给成员函数指针,然后退出switch循环
57             default:break;                        //退出switch循环
58         }
59         (p->*pf)();                            //通过指针p来访问对象,通过*pf来访问该对象的成员函数
60         delete p;                                //删除p指针,因为*pf指向的不是对象而是该对象的成员函数,所以没有必要删除pf
61     }
62     return 0;
63 }

 

10.  成员函数指针数组

 1 #include <iostream>
 2 using namespace std;
 3 class paper
 4 {
 5 public:
 6     void read(){cout<<"纸上面的字可以读\n";}
 7     void write(){cout<<"纸可以用来写字\n";}
 8     void burn(){cout<<"纸可以用来点火\n";}
 9 };
10 typedef void(paper::*p)(); //利用typedef声明一个成员函数指针类型p,该类型的指针指向paper类的成员函数,该函数不具返回值且没有参数
11 int main()
12 {
13     //成员函数指针指向三个成员函数
14     p func[3]={&paper::read,&paper::write,&paper::burn};//用类型p来声明一个func成员函数指针数组,并将它的成员函数指针初始化为它们所指向的函数的内存地址。
15                                                         //与普通数组元素一样,成员函数指针数组的每个成员函数指针也会拥有一个编号,该编号从0开始
16     paper* pp=0;                    //声明一个指向paper类的普通指针
17     char choice[1];                //声明一个只保存一个字符的char型数组choice
18     bool quit=false;                //声明一个布尔变量quit并将它的值赋为false
19     while(quit==false)                //当quit的值为false时
20     {
21         cout<<"(0)退出(1)读(2)写(3)点火:";      //输出选择菜单
22         cin>>choice[0];                   //将用户的选择保存在字符数组choice中
23         if(choice[0]>'3' || choice[0]<'0') //判断该字符是否在0到3之间,假如不是
24         {
25             cout<<"请输入从0~3之间的数字\n";     //提示用户输入
26         }
27         //否则,假如输入的字符在0~3之间
28         else if (choice[0]=='0')      //再判断该字符是否等于'0'
29         {
30             quit=true;                    //等于的话将quit赋为true,那么while条件不成立,退出循环
31         }
32         else 
33         {
34             int n;                       //定义一个整型变量用来接收被转换为整型的字符串
35             pp=new paper;                  //新构造一个paper类对象,用pp来指向它
36             n=atoi(choice);    //将choice转换为整型后再赋给n
37             (pp->*func[n-1])();        // pp指针访问新对象的成员函数,由该对象调用func 指针数组中下标为n-1的指针指向的成员函数,这里要注意数组的下标,n是用户输入的选项值,由于数组元素从0开始,所以要n减1,后面的()表示函数无参数
38             delete pp;                //删除pp指针指向的新对象
39         }
40     }
41     return 0;
42 }

 

 

转载于:https://www.cnblogs.com/zenseven/p/3799044.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个孩子能长大成人到底有多不容易? | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅(图源警民直通车-上海&#xff0c;侵权删&#xff09;

差距50倍!为什么Web API第一次执行这么慢?

前言新建一个ASP.NET Core Web API项目&#xff0c;使用命令行方式启动&#xff0c;连续发送多次请求。从下图的时间线可以发现&#xff0c;第一次执行&#xff08;116ms&#xff09;比后面的&#xff08;2ms&#xff09;慢了很多:在这100多ms中&#xff0c;Web API到底做了些什…

Exchange服务器系列课程之四--管理Exchange收件人

前面已经讨论了Exchange的安装&#xff0c;今天我们来讨论一下Exchange服务器的用户管理。管理Exchange的工具在第二篇文章已经讨论过了&#xff0c;这里不再阐述。Exchange中的收件人对象有三种&#xff1a;用户&#xff0c;组&#xff0c;联系人。我们可以为收件人对象启用邮…

动力强劲的星型发动机,为何不用在汽车上呢?

全世界只有3.14 % 的人关注了青少年数学之旅星型发动机嘚瑟的模样&#xff0c;一定让人过目不忘——对&#xff0c;虽然它看起来妖娆&#xff0c;但动力却十分强劲。那它为什么没在汽车上普及呢&#xff1f;我们一起来看看&#xff01;什么是星型发动机星型发动机&#xff0c;顾…

超详细图解!【MySQL进阶篇】存储过程,视图,索引,函数,触发器

超详细图解&#xff01;【MySQL进阶篇】存储过程,视图,索引,函数,触发器1.1 下载Linux 安装包1.2 安装MySQL1.3 启动 MySQL 服务1.4 登录MySQL2\. 索引2.1 索引概述2.2 索引优势劣势2.3 索引结构2.3.1 BTREE 结构2.3.3 BTREE 结构2.3.3 MySQL中的BTree2.4 索引分类2.5 索引语法…

Xcode中release和debug模式

本人对Xcode中的release模式和debug模式很是疑惑,于是今天对其进行的调研,写下笔记以备查阅Debug是调试版本,包含调试信息,并且不做任何优化,便于程序猿进行调试.Release 是发布版本,它往往是进行各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好的使用.在上传…

porting linux

编译器&#xff1a;arm-linux- 3.4.1 出现以下错误 cc1: error: invalid option short-load-bytesmake: *** [entry.o] 错误 1 如果改用2.95.3则不会出现该问题。 原因是高版本的编译器不支持-mshort-load-bytes选项&#xff0c;改为-malignment-traps即可。 makefile中一些易忘…

.Net Core with 微服务 - 分布式事务 - 2PC、3PC

最近比较忙&#xff0c;好久没更新了。这次我们来聊一聊分布式事务。在微服务体系下&#xff0c;我们的应用被分割成多个服务&#xff0c;每个服务都配置一个数据库。如果我们的服务划分的不够完美&#xff0c;那么为了完成业务会出现非常多的跨库事务。即使按照 DDD 的原则来切…

写给还在大学的兄弟姐妹

看到软件专业毕业生之一个月攻略 这篇文章之后&#xff0c;忽然想起了自己两个多月前找工作时的写的一篇文章&#xff0c;便拿出来与大家分享。 这仅是个人的一些看法&#xff0c;不正确之处还请各位指出&#xff0c;有砖尽管拍。 基础很重要 许多企业招聘&#xff0c;要求大学…

2019优质公众号大盘点,果断收藏了慢慢看吧 ~

全世界只有3.14 % 的人关注了青少年数学之旅又到年底了啦&#xff0c;也到了一年一度的年底盘点时间。那么2019年&#xff0c;又有哪些优质公众号崭露头角呢&#xff1f;本期将为您盘点几个优质公众号&#xff0c;总有一个刷屏过你的朋友圈&#xff01;长按二维码&#xff0c;选…

让未备案的网站先飙起来

让未备案的网站先飙起来作者&#xff1a;田逸&#xff08;sery163.com&#xff09;国人在技术方面的创新能力不怎么样&#xff0c;但是在设置障碍&#xff0c;折腾自己人的方面的创造性却登峰造极&#xff0c;比如网站备案。要备案也没什么问题&#xff0c;毕竟大家都是老老实实…

TDengine和DolphinDB哪个更好,哈哈哈哈,闲来无聊分析了一下。

#拥抱开源—涛思数据TDengine有奖征稿# TDengine是专为时序数据设计的&#xff0c;针对的是物联网、工业互联网、IT运维场景。这些场景是不需要特殊的查询函数的&#xff0c;更关心的是写入速度、查询速度。而且这些场景下&#xff0c;也需要一些其他数据库不具备的功能&#…

技术总监谈好的程序员如何写代码

要判断一个程序员是不是好的程序员&#xff0c;主要看他写的代码&#xff0c;因为程序员最重要的事是写代码。 即便不去理解代码的意图&#xff0c;只要看一眼&#xff0c;好的程序员写的代码与差的程序员写的代码基本上就可以看出来。好的程序员写的代码&#xff0c;整洁而规范…

记一次 .NET 某WMS仓储打单系统 内存暴涨分析

一&#xff1a;背景 1. 讲故事七月中旬有一位朋友加wx求助&#xff0c;他的程序在生产上跑着跑着内存就飙起来了&#xff0c;貌似没有回头的趋势&#xff0c;询问如何解决&#xff0c;截图如下&#xff1a;和这位朋友聊下来&#xff0c;感觉像是自己在小县城当了个小老板&#…

C语言面试题之华为篇2(答案全)

C语言面试题之华为篇(答案全) &#xff08;1&#xff09;什么是预编译&#xff0c;何时需要预编译&#xff1a; 答案&#xff1a; &#xff11;、总是使用不经常改动的大型代码体。 &#xff12;、程序由多个模块组成&#xff0c;所有模块都使用一组标准的包含文件和相同的编…

一分钟读懂一个数学时代,看完不跪算我输!

▲ 点击查看上帝说&#xff0c;要有光&#xff0c;于是便有了光。而香农说&#xff0c;要有熵&#xff0c;于是信息化时代正式拉开帷幕。克劳德艾尔伍德香农&#xff08;Claude Elwood Shannon&#xff09;被尊称为“信息论之父”。不管你是否知道他&#xff0c;是如何看待他…

秋招面试我去了拼多多,直接被问JVMGC底层原理和算法,我吊打面试官

JVM 常用参数设置积累 # 堆的初始值&#xff0c;默认物理内存的1/64 -Xms: # 堆的最大值&#xff0c;默认物理内存的1/4 -Xmx: # 年轻代大小「在整个堆内存大小确定的情况下&#xff0c;增大年轻代将会减小年老代&#xff0c;反之亦然。此值关系到JVM垃圾回收&#xff0c;对系…

php中使用exec,system等函数调用系统命令

2019独角兽企业重金招聘Python工程师标准>>> 注意:要想使用这二个函数php.ini中的安全模式必须关闭&#xff0c;要不然为了安全起见php是不让调用系统命令的。  先看一下php手册对这二个函数的解释:  exec --- 执行外部程式  语法 : string exec ( string com…

了解jQuery技巧来提高你的代码

jQuery之所以如此流行并被从大公司到个人博客的几乎每个人都广泛使用&#xff0c;是因为它上手和使用相当简单&#xff0c;而且为我们提供了一些人都不知道的相当棒的特性。我认为jQuery的大多数用户更趋向于使用jQuery插件来解决面临的难题&#xff0c;这通常是明智的选择。但…

Vista Dynamips模拟器安装

原因由于npf文件&#xff0c;缺少这个文件就不能获取网卡参数:解决1&#xff1a;安装Ethereal&#xff0c;在安装过程中勾选“Start WinPcap service "NPF" at startup”这一项.然后就可以获取网卡参数&#xff01;有可能不行&#xff0c;没关系.解决2&#xff1a;输…