经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
类和模板小结
来源:cnblogs  作者:荒唐123  时间:2018/10/19 9:00:32  对本文有异议

类和模板小结

标签 :数据结构学习笔记


  • 使用struct和class写类的区别:
    使用struct关键字,默认的访问权限是public,而使用class的默认访问权限是private,两者唯一的区别就是默认的访问权限的不同
  • private和protect:

    private成员变量或函数在类的外部是不可访问的,甚至是不可查看的。只有类和友元函数可以访问私有成员。
    protect变量或函数与私有成员十分相似,但有一点不同,保护成员在派生类(即子类)中是可访问的。
    eg:class SmallBox:Box // SmallBox 是Box的派生类
  • 构造函数在定义变量的时候(早于手动为变量赋初值的过程)即会被调用
  • 类的友元函数是定义在类外部,但有权访问类的private成员和protected成员。
    尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
    友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。
    如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend,如下所示:
    声明类 ClassTwo 的所有成员函数作为类 ClassOne 的友元,需要在类 ClassOne 的定义中放置如下声明:friend class ClassTwo;
  • 在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。在成员函数内部,它可以用来指向调用对象。
    友元函数没有 this 指针,因为友元不是类的成员。只有成员函数才有 this 指针。

模板(其实挺简单的,不要被吓到了)

函数模板

  • 模板就是把函数定义为对任意数据类型都通用的函数,也叫泛型函数,调用时候根据提供的实参替换成特定的数据类型
    eg:交换模板:

    1. template <typename T>//关键字typename或class,定义数据类型为 T(int,double.....)
    2. void swap(T &a,T &b){
    3. T tmp;
    4. tmp=a;
    5. a=b;
    6. b=tap;
    7. }
  • <>里面为模板参数,分为类型模板参数(template <typename T>)和非类型模板参数(template<int n,int m>int compare(const char (&p1)[n],const char (&p2)[m]{函数体})

    类模板

    正如我们定义函数模板一样,我们也可以定义类模板。泛型类声明的一般形式如下所示:
  1. template <class typename> class class-name {
  2. .
  3. .
  4. .
  5. }

typename定义类型。您可以使用一个逗号分隔的列表来定义多个泛型数据类型。

下面的实例定义了类 Stack<>,并实现了泛型方法来对元素进行入栈出栈操作:

  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdlib>
  4. #include <string>
  5. #include <stdexcept>
  6. using namespace std;
  7. template <class T>
  8. class Stack {
  9. private:
  10. vector<T> elems; // 元素
  11. public:
  12. void push(T const&); // 入栈
  13. void pop(); // 出栈
  14. T top() const; // 返回栈顶元素
  15. bool empty() const{ // 如果为空则返回真。
  16. return elems.empty();
  17. }
  18. };
  19. template <class T>
  20. void Stack<T>::push (T const& elem)
  21. {
  22. // 追加传入元素的副本
  23. elems.push_back(elem);
  24. }
  25. template <class T>
  26. void Stack<T>::pop ()
  27. {
  28. if (elems.empty()) {
  29. throw out_of_range("Stack<>::pop(): empty stack");
  30. }
  31. // 删除最后一个元素
  32. elems.pop_back();
  33. }
  34. template <class T>
  35. T Stack<T>::top () const
  36. {
  37. if (elems.empty()) {
  38. throw out_of_range("Stack<>::top(): empty stack");
  39. }
  40. // 返回最后一个元素的副本
  41. return elems.back();
  42. }
  43. int main()
  44. {
  45. try {
  46. Stack<int> intStack; // int 类型的栈
  47. Stack<string> stringStack; // string 类型的栈
  48. // 操作 int 类型的栈
  49. intStack.push(7);
  50. cout << intStack.top() <<endl;
  51. // 操作 string 类型的栈
  52. stringStack.push("hello");
  53. cout << stringStack.top() << std::endl;
  54. stringStack.pop();
  55. stringStack.pop();
  56. }
  57. catch (exception const& ex) {
  58. cerr << "Exception: " << ex.what() <<endl;
  59. return -1;
  60. }
  61. }

当上面的代码被编译和执行时,它会产生下列结果:

  1. 7
  2. hello
  3. Exception: Stack<>::pop(): empty stack
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号