Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1477265
  • 博文数量: 842
  • 博客积分: 12411
  • 博客等级: 上将
  • 技术积分: 5772
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-14 14:43
文章分类

全部博文(842)

文章存档

2013年(157)

2012年(685)

分类: C/C++

2013-07-26 17:36:49

     C++的面向对象内容还是很多的,内容繁杂,体系庞大,想起家里的Prime的厚度,心里一小颤。二级考试教材只涉及了C++最基础的语法,比如类之间的继承关系,虚函数等,至于泛型编程基本没有涉及。现在自己感觉不熟的就是C++的三个部分:泛型编程、面向对象设计和运算符重载。今天重新看了下这部分,把感觉重要的来写一写。
1. 构造函数中的初始化有两种方式,一种是针对参数的直接设置默认值,如(constructor(int num = 1, int sum = 0)),另一种则是在函数原型之后附加上初始化列表,针对参数、成员数据进行初始化,值得一提的是,对于const/static成员、没有默认构造函数的类对象成员都需要使用第二种方式进行初始化。
2. Mutalbe和Const。有些时候我们希望变量在程序运行过程中保持不变,会为其设置const属性;但是此时如果传入参数的过程修改参数的数据就会引发错误,因此我们可以将函数过程也声明为const(常函数),如(int length() const {return _length;}),编译器就会检查常函数是否修改了类对象的数值。但是还有些时候我们认为类对象中的某些属性与对象核心属性无关,可以改变,就将其声明为mutable类型,则const函数也可以改变其值。应该说C++的const/mutalbe提供了非常大的灵活性。更详细和深入的内容留待以后实际用到时才补充。
3. Static成员。对于类中的static成员属于类中所有对象所共有的,因此每个类中只有一份,没有副本。静态成员函数的主要目的是使得与类成员数据无关的操作函数可以独立于类对象而直接调用,如class::function而非object.function。
     最后,学习编程不敲代码果然不行,哪怕比着书上的例子敲呢!这里附上一个关于栈的类,可以看到关于类的基本的语法点。

点击(此处)折叠或打开

  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <vector>
  4. #include <string>

  5. using namespace std;

  6. //Class Stack Define

  7. class Stack
  8. {
  9.       //类中声明成员函数,可以给出简单函数的定义,默认作为inline使用,如这里的size()
  10.       public:
  11.              bool push( string &);
  12.              bool pop(string &elem);
  13.              bool peek(string &elem);
  14.              bool empty();
  15.              bool full();
  16.              
  17.              int size() {return _stack.size();}
  18.       private:
  19.               vector<string> _stack;
  20.       };
  21. //Initial Stack
  22. //EOF is ctrl + D
  23. //本例充分使用了vector的泛型算法
  24. void fill_stack(Stack &stack, istream &is = cin)
  25. {
  26.      string str;
  27.      while (is >> str && !stack.full())
  28.            stack.push(str);
  29.      cout << "Read in "<< stack.size()<< " elements\n";
  30.  }
  31.  
  32. bool Stack::push(string &elem)
  33. {
  34.      if (full())
  35.         return false;
  36.      _stack.push_back(elem);
  37.      return true;
  38. }

  39. inline bool
  40. Stack::empty()
  41. {
  42.      return _stack.empty();
  43.               }

  44. bool
  45. Stack::pop(string &elem)
  46. {
  47.      if (empty())
  48.         return false;
  49.      elem = _stack.back();
  50.      _stack.pop_back();
  51.      return true;
  52. }

  53. inline bool
  54. Stack::full()
  55. {
  56.      return _stack.size() == _stack.max_size();
  57. }

  58. //peek() is used to check the last elem in Stack
  59. bool Stack::peek(string &elem)
  60. {
  61.      if (empty())
  62.         return false;
  63.      elem = _stack.back();
  64.      return true;
  65. }



  66. int main(int argc, char *argv[])
  67. {
  68.     cout <<"A Stack Test...\n";
  69.     
  70.     string elem;
  71.     string &r_elem = elem;
  72.     
  73.     Stack stack;
  74.     fill_stack(stack);
  75.     stack.peek(r_elem);
  76.     cout << "the last elem is : "<< r_elem<<endl;
  77.     
  78.     system("PAUSE");
  79.     return EXIT_SUCCESS;
  80. }


阅读(1696) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~