C++第十二天笔记2016年03月04日(周五) A.M

1.    多重继承

在多继承中,如果派生类的多个基类出现重名函数,为了避免出现歧义,则可以在派生类中重写这些重名函数。

2.    菱形继承问题,成员冗余(成员变量的冗余,无问题。成员函数的冗余,可能会出现问题)。函数调用出现歧义。

使用虚继承解决菱形继承问题。

3.    模板

函数模板:有类型参数的函数。

如何定义函数模板:

1 template <typename T>
2 void print(T,_t)
3 {
4        cout<< _t << endl;
5 }
6 print(1);
7 print(“hello”);
8 print(&a);

模板函数:类型参数的值确定。void print(T,_t);

4. 普通函数和函数模板的区别:

普通函数:参数值未定,但参数类型确定。

函数模板:不仅参数的值不确定,连参数的类型都不确定,我们使用template来创建模板关键字这是一种 更高级的 复用。

5.  课堂练习

1. 函数模板:

 1 #include <iostream>
 2 using namespace std;
 3
 4
 5 //void printArray(int* array, int size)
 6 //{
 7 //    for (int i=0; i< size; i++) {
 8 //        cout << array[i];
 9 //        if (i<(size-1)) {
10 //            cout << ", ";
11 //        }
12 //    }
13 //    cout<<endl;
14 //}
15 //
16 //void printArray(float* array, int size)
17 //{
18 //    for (int i=0; i< size; i++) {
19 //        cout << array[i];
20 //        if (i<(size-1)) {
21 //            cout << ", ";
22 //        }
23 //    }
24 //    cout<<endl;
25 //}
26 //void printArray(char** array, int size)
27 //{
28 //    for (int i=0; i< size; i++) {
29 //        cout << array[i];
30 //        if (i<(size-1)) {
31 //            cout << ", ";
32 //        }
33 //    }
34 //    cout<<endl;
35 //}
36
37 template <typename T>
38 void printArray(T* array,int size)
39 {
40     for (int i=0; i<size; i++) {
41         cout << array[i];
42
43         if (i<(size-1)) {
44             cout << ", ";
45         }
46     }
47     cout << endl;
48 }
49
50 int main(int argc, const char * argv[]) {
51
52     const int max = 5;
53     int iarray[max] = {3,4,5,6,7};
54     float farray[max] = {2.1, 2.2, 2.3, 2.4, 2.5};
55     char* cArray[max] = {"df", "fvc" , "zdf", "ht", "dsfa"};
56
57     printArray(iarray, max);
58     printArray(farray, 5);
59     printArray(cArray, 5);
60
61     return 0;
62 }

2. 类模板

  1 #include <iostream>
  2 using namespace std;
  3
  4 template <typename T>
  5 class Stack
  6 {
  7 private:
  8     int size;
  9     int top;
 10     T* stackPtr;
 11
 12 public:
 13     Stack(int s = 10);
 14     ~Stack();
 15
 16     int push(const T&);
 17     int pop(T&);
 18     int isEmpty() const;
 19     int isFull() const;
 20
 21     void printOn(ostream& output);
 22 };
 23
 24 template <typename T>
 25 Stack<T>::~Stack(){
 26     if (stackPtr != NULL) {
 27         delete [] stackPtr;
 28         stackPtr = NULL;
 29     }
 30 }
 31
 32 template <typename T>
 33 Stack<T>::Stack(int s){
 34     size = s;
 35     top=-1;
 36     stackPtr = new T[size];
 37 }
 38
 39 template <typename T>
 40 int Stack<T>::push(const T& item){
 41     if (!isFull()) {
 42         stackPtr[++top] = item;
 43         return 1;
 44     }
 45     return 0;
 46 }
 47
 48 template <typename T>
 49 int Stack<T>::pop(T& item){
 50     if (!isEmpty()) {
 51         item = stackPtr[top--];
 52         return 1;
 53     }
 54     return 0;
 55 }
 56
 57 template <typename T>
 58 int Stack<T>::isEmpty() const{
 59     return top == -1;
 60 }
 61
 62 template <typename T>
 63 int Stack<T>::isFull() const{
 64     return top == size-1;
 65 }
 66
 67
 68 template <typename T>
 69 void Stack<T>::printOn(ostream& output){
 70     output << "Stack( ";
 71     for (int i = 0; i <= top; i++) {
 72         output << stackPtr[i];
 73         if (i<top)
 74         {
 75             cout<<", ";
 76         }
 77     }
 78     output << ")\n";
 79 }
 80 int main(int argc, const char * argv[]) {
 81
 82     cout<<"*********添加整型元素*************\n";
 83     Stack<int> stack;
 84     for (int i=0; i<5; i++) {
 85         stack.push(i*10);
 86     }
 87     stack.printOn(cout);
 88
 89     cout<<"*********删除浮点型元素*************\n";
 90     Stack<float> stack1;
 91     for (int i=0; i<5; i++) {
 92         stack1.push(i*10);
 93     }
 94     for (int i=0; i<5; i++) {
 95         float f;
 96         stack1.pop(f);
 97         cout << f <<endl;
 98     }
 99     stack1.printOn(cout);
100
101     cout<<"*********添加字符元素*************\n";
102
103     char* c[5]={"one", "two", "three", "four", "five"};
104     Stack<char*> stack2;
105     for (int i=0; i<5; i++) {
106         stack2.push(c[i]);
107     }
108     stack2.printOn(cout);
109
110     return 0;
111 }

3. 类模板默认值与多个模板参数

 1 #include <iostream>
 2 using namespace std;
 3
 4 template <typename T = int>
 5 class A {
 6     T t;
 7 public:
 8     A(){
 9         t = 10;
10     }
11     void print(){
12         cout << t << endl;
13     }
14 };
15
16
17 template <typename T1 ,typename S>
18 void test(T1 t, S s) {
19     cout << t << endl;
20     cout << s << endl;
21 }
22 int main(int argc, const char * argv[]) {
23     cout<<"*********类模板默认值**********\n";
24     A<> a;
25     a.print();
26
27     cout<<"*********多个模板参数**********\n";
28     int m = 20;
29     char* n = "Hello";
30     test(m, n);
31
32     return 0;
33 }

时间: 2024-12-14 18:21:41

C++第十二天笔记2016年03月04日(周五) A.M的相关文章

OC第七天笔记2016年03月22日(周二)A.M

1. 可变字符串 NSMutableString* mstr = [[NSMutableString alloc] initWithCapacity:10]; 增 删 改 替换 //[mstr length] [mstr insertString:@"http://" atIndex:0]; //第一个参数:即将要插入的字符串 //第二个参数:插入的位置(下标) NSLog(@"%@",mstr); //http://www.baidu.com [mstr inse

OC第六天笔记2016年03月21日(周一)A.M

在OC中,我们通过使用协议和分类来实现多继承的效果. 协议只能声明方法,而不能有任何实例变量. 声明协议: @protocal protocolName<protocol ,…> @optional //可选择的 @require//必须的  默认 @end eg: 1 @protocal rules<NSObject > 2 3 4 5 @interface abc: NSObject <rules> 6 7 @end //协议中只有方法声明,没有实例变量 在类中的实

OC第七天笔记2016年03月21日(周一)P.M

1. 使用NsCompare 或者isEqualToNumber来实现NsNumber对象的比较. NsCompare:比较大小关系 isEqualToNumber:是否相等 长度:[str length] 查找子串: NSRange rr = [str rangeOfString:@”ll”]; If(rr.location == NSNotFound){ NSLog(@”ll is not in str ”); } else { NSLog(@”ll is in str”);}

C++第十四天笔记2016年03月10日(周四) A.M

1. 线性结构:链表和数组 数组:可以访问任意位置的元素.添加删除操作相对麻烦. 链表:添加删除效率相对较高.只能从第一个元素开始访问. 访问较多:数组.添加删除较多:链表. 数组:元素类型 数组名[元素个数]; 2.  如何创建链表: 链表:链表中的每一个元素称为节点. 节点:数据域(存储数据)和指针域(存储下一节点的地址编号). 3.  双向链表:数据域和指针域(包含两个,其中一个指向下一个节点,另外一个指向上一个节点) 4.  头结点:链表中的第一个节点 空链表:链表中无任何节点. 1 #

OC第八天笔记2016年03月23日(周三)A.M

1.     NSFileManager: ----------------------main--------------------------- 1 <font size="3">#import <Foundation/Foundation.h> 2 #import "Student.h" 3 int main(int argc, const char * argv[]) { 4 @autoreleasepool { 5 6 //1.

OC第四天笔记2016年03月18日(周五)A.M

在OC中没有多继承 继承方式公有继承:派生类对象可以当做基类对象来使用 类中实例变量的默认权限为受保护,方法默认权限公有. 类中方法都是虚方法 在OC继承中,基类的所有成员都可以被派生类继承. 在派生类中定义一个原型和基类相同的方法,称派生类重写了此方法. id代表任意类型, 在程序运行期间才会确定id所代表的类型. 使用类方法创建的对象会被自动放入“自动释放池”中,所以不需要再手动release. 派生类中扩展实例变量时,不能与基类部分实例变量同名.

iPhone 第二天笔记2016年03月30日(周三)A.M 秒表计时、登录验证+页面跳转

1. 按钮代码实现: 1 <font size="3">-(void)initbuttonregister 2 { 3 UIButton* btn = [UIButton buttonWithType:UIButtonTypeCustom]; 4 //设置frame 5 [btn setFrame:CGRectMake(200, 230, 80, 44)]; 6 //设置title 7 [btn setTitle:@"注册" forState:UICon

iPhone 第一天笔记2016年03月28日(周一)A.M iPhone开发入门

1. 切换home键:command + shift + h; 2. info.plist  Application does not run in background -> YES ****************************main****************************** 1 <font size="3">#import <UIKit/UIKit.h> 2 #import "AppDelegate.h&quo

OC第九天笔记2016年03月24日(周四)A.M

1.  打开ARC:-fobjc-arc 关闭ARC:-fno-objc-arc 2.  在ARC中内存回收由编译器完成 声明对象之后,未将对象置为nil,则对象作用域结束时,空间才会被回收:如果将对象置为nil,则对象的空间会立即回收. 3.  __strong __weak __strong:强引用,拥有某一块堆空间的所有权.默认. __weak:弱引用,仅拥有使用权. 一旦强引用置为nil,弱引用会被自动置为nil. 声明属性:如果属性为对象实例变量,赋值方式strong,否则使用weak