首页 > 代码库 > c++学习笔记(二)
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 }
模版:
泛型编程的组成部分,提高了代码的利用率,就像是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 }
c++学习笔记(二)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。