c++学习笔记(二)

初步涉及运算符重载和模版,当然只是略略触碰到,让自己看得懂程序而已。以后逐步加深。

运算符重载:

    (1)成员函数运算符重载:

        因为有this指针,通常的双目运算符参数表只有一个,单目则是没有入参,不过有时单目会有附加的说明的参数,来说明单目运算符左右结合的规则。Demo& operator ++(Demo &a);        Demo operator ++(Demo &a, int);没有int参数的那个运算符重载是用来是a++,单数有int 的就是++a,当然int只是为了区分++重载的时候应该选取那个函数。

    (2)友元函数运算符重载:

        双目一般参数列表有两个,和成员的一般差一个。原因是没有this,友元么,并非是当前对象的成员。

当然不是所有的运算符都可以重载的,“  .  ?:   sizeof   ::”都是不能重载的。

运算符重载,是对象之间的运算变成了可能,我们知道c语言的结构体是不能做加减的,但是c++类似的类的对象就可以。实在是很方便。

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 class Demo{
 7 public:
 8     Demo(int a=0, int b=0) {
 9         cout << "------1------" << this << endl;
10         x=a, y=b;
11     }
12     void prnint(){
13         cout << "x=" << x << "; y=" << y << endl;
14     }
15 
16 private:
17     friend Demo& operator ++(Demo &a);
18     friend Demo  operator ++(Demo &a, int);
19 
20     int x;
21     int y;
22 };
23 
24 Demo& operator ++(Demo &a)
25 {
26     a.x++;
27     a.y++;
28     return a;
29 }
30 
31 Demo  operator ++(Demo &a, int)
32 {
33     Demo tmp(a);
34     ++a.x;
35     ++a.y;
36     return tmp;
37 }
38 
39 void test()
40 {
41     Demo a(Demo(1,2));
42     Demo b = a++;
43     a.prnint();
44     b.prnint();
45 
46     Demo c = ++b;
47     a.prnint();
48     b.prnint();
49     c.prnint();    
50 }
51 
52 int main()
53 {
54     test();
55     return 0;
56 }
C++运算符重载

模版:

    泛型编程的组成部分,提高了代码的利用率,就像是typedef一样,不过更加强大。

    分类(1)函数模版(2)类模版(3)非类型模版。  

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 template <typename T>
 6 T add(T x, T y);
 7 
 8 template <typename T>
 9 T add(T x, T y)
10 {
11     return x+y;
12 }
13 
14 void test()
15 {
16     cout << add(1, 2) << endl;
17     //error: add(double, int): cout << add(1.1, 2) << endl;
18     cout << add(1.2, 3.4) << endl;
19 }
20 
21 
22 int main()
23 {
24     test();
25     return 0;
26 }
函数模版
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 template <typename T>
 6 class Demo{
 7 public:
 8     Demo(T val);
 9     void setval(T val);
10     T getval();
11 
12 private:
13     T val;
14 };
15 
16 template <typename T>
17 Demo<T>::Demo(T val){
18     this->val = val;
19 }
20 
21 template <typename T>
22 void Demo<T>::setval(T val){
23     this->val = val;
24 }
25 
26 template <typename T>
27 T Demo<T>::getval(){
28     return val;
29 }    
30 
31 void test()
32 {
33     int val = 1;
34     Demo<double> obj(val);
35     cout << obj.getval() << endl;
36 
37     obj.setval(3);
38     cout << obj.getval() << endl;
39 }
40 
41 
42 int main()
43 {
44     test();
45     return 0;
46 }
类模版
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 template <typename T=int, int max=10>
 6 class ARR{
 7 public:
 8     ARR(const T val);
 9     void setval(const T val, const int id);
10     T getval(const int id);
11 
12 private:
13     T arr[max];
14 };
15 
16 template <typename T, int max>
17 ARR<T, max>::ARR(const T val)
18 {
19     for(int i =0; i < max; i++){
20         arr[i] = val;
21     }
22 }
23 
24 template <typename T, int max>
25 void ARR<T, max>::setval(const T val, const int id)
26 {
27     if(id < max){
28         arr[id] = val;
29     }else{
30         cout << "setval-Overflow!!!" << endl;
31     }
32 }
33 
34 template <typename T, int max>
35 T ARR<T, max>::getval(const int id)
36 {
37     if(id < max){
38         return arr[id];
39     }else{
40         cout << "getval-Overflow!!!" << endl;
41     }
42 
43     return arr[0];
44 }    
45 
46 void test()
47 {
48     ARR<double, 6> obj(1.1);
49     cout << obj.getval(0) << endl;
50 
51     obj.setval(3.3, 1);
52     cout << obj.getval(1) << endl;
53 
54     ARR<> obj1(1);
55     cout << obj1.getval(0) << endl;
56 
57     obj1.setval(3, 1);
58     cout << obj1.getval(1) << endl;
59 }
60 
61 
62 int main()
63 {
64     test();
65     return 0;
66 }
非类型模版

 

posted @ 2017-04-12 14:43  AAAron  阅读(174)  评论(0编辑  收藏  举报