C++成员函数与数据成员
面向对象基本观念:
传统程序设计: (ds + ds + ds) * (f + f + f)
面向对象设计: (ds + f) * (ds + f) * (ds + f)
以数据库观念理解C/C++ 的术语:
C C++ Database
structure class table
variable instance record
field data member field/attribute
(???) member function (attribute)
在面向对象语言中, data member 与member function 通称为attribute. 有些语言的语法甚至设计成让物件的用户分不出来一个attriute 究竟是data member 或是member function.
Member function (成员函数) and "this"
实例请参考
date.c date.cc
complex.c complex0.cc
school.c school.cc
设计成员函数: 找出函数f 中最主要的参数x, 若其型别为t, 则将f 改声明成t 的成员函数.
- class t {
- int f(tx, ...); int f(...);
- };
- f(a, ...); af(...);
声明方式: 同样的函数, 在C++ 中若成为成员函数, 则其参数个数往往比在C 中的参数个数少一个.
使用方式:把最重要的参数提到括弧外,以.传递.同理,若有 t * p;的声明,则可以t->f(...); 传递.
定义方式:在成员函数的实作中,想像消失的参数其实是以隐含的参数t * this 来传递,因此可以透过this->...存取其数据成员(栏位).例如当f是透过af(...)传递时,可以想像进入副程序时,虽然没有写出来,但是发生了:
t const * this = &a;
成员函数的定义中, this->可以省略.
不同的类别中可以有signature相同的成员函数,为了区别,在定义成员函数时,必须加上:: (scope resolution operator)代表"某个类别的某某成员函数". ::前不冠任何类别,则表示"不属于任何类别的 ".
若主要参数x本来应该以t const * x 的方式传递,则变成成员函数后应将const置于函数的"前面".养成将所有member function声明成const的习惯,当你确定这个member function不适用const时才不要用.
成员函数的定义写在类别定义内者, 自动为inline 函数.
作业:修改stack.c 将所有相关的函数改写为成员函数.
作业:在date.cc中加入 operator ==, operator ++等成员函数.
static 成员函数: 没有隐含参数this 的成员函数.
static 这个keyword 只在声明时写出; 在定义时不应写出.
传递时, 因为static member fucntion 不作用于那一个特定的物件上(它是属于整个类别的函数!) 因此不应透过. 或-> 传递, 而应使用::
例: date.cc中的is_leap_year可考虑改声明为static member function.
static 数据成员: 这个类别的所有instances 共用的一份数据.
主要用在统计等记录与整个类别相关的资讯. 例: 记录目前身份证发到第几号.
除了声明(用static) 之外要记得定义(不加static)!
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
