类设计回顾

来源:互联网 发布:jquery 二元数组 编辑:程序博客网 时间:2024/06/16 01:09

1、编译器生成的成员函数
1、默认构造函数:
默认构造函数要么没有参数,要么所有的参数都有默认值。
自动生成的默认构造函数的另一项功能是,调用基类的默认构造函数以及调用本身是对象的成员所属类的默认构造函数。
如果类包含指针成员,则必须初始化这些成员,因此,最好提供一个显式默认构造函数,将所有的类数据成员都初始化为合理的值。
2、复制构造函数:
复制构造函数接受其所属类的对象作为参数。在下述情况下,将使用复制构造函数:
一、将新对象初始化为一个同类对象
二、按值将对象传递给函数
三、函数按值返回对象
四、编译器生成临时对象
3、赋值运算符:
默认的赋值运算符用于处理同类对象之间的赋值。不要将赋值与初始化混淆了,如果语句创建新的对象,则使用初始化,如果语句修改已有的对象的值,则是赋值。
默认赋值为成员赋值,如果成员为类对象,则默认成员赋值将使用相应类的赋值运算符。

其它的类方法
1、构造函数:
构造函数创建新的对象,而其它类方法只是被现有的对象调用。这是构造函数不被继承的原因之一。构造函数在完成其工作之前,对象并不存在。
2、析构函数:
一定要定义显式析构函数来释放类构造函数使用new分配的所有内存,并完成类对象所需的任何特殊的清理工作。对于基类,即使它不需要析构函数,也应提供一个虚析构函数。
3、转换:
使用一个参数就可以调用的构造函数定义了从参数类型到类类型的转换。
要将类对象转换为其它类型,应定义转换函数。转换函数可以是没有参数的类成员函数,也可以是返回类型被声明为目标类型的类成员函数,即使没有声明返回类型,函数也应返回所需的转换值。使用explicit允许使用强制类型转换进行显式转换,但不允许隐式转换。
4、按值传递对象与传递引用:
按引用传递对象,首先是为了提高效率,另一个原因是,在继承使用虚函数时,被定义为接受基类引用参数的函数可以接受派生类。
5、返回对象和返回引用:
直接返回对象与按值传递对象相似:它们都生成临时副本。同样,返回引用与按引用传递对象相似:调用和被调用的函数对同一个对象进行操作。
然而,并不总是可以返回引用。函数不能返回在函数中创建的临时对象的引用,因为当函数结束时,临时对象将消失,因此这种引用将是非法的。在这种情况下,应返回对象,以生成一个调用程序可以使用的副本。
通用的规则是,如果函数返回在函数中创建的临时对象,则不要使用引用。
6、使用const:

公有继承的考虑因素
1、is-a关系:
表示is-a关系的方式之一是,无需进行显式类型转换,基类指针就可就可以指向派生类对象,基类引用就可以引用派生类引用。
2、什么不能被继承:
构造函数不能被继承,而派生类构造函数通常使用成员初始化列表语法来调用基类构造函数,以创建派生对象的基类部分。如果派生类构造函数没有使用成员初始化列表语法显式调用基类构造函数,将使用基类的默认构造函数。在继承链中,每个类都可以使用成员初始化列表将信息传递给相邻的基类。
析构函数也不能被继承。在释放对象时,程序将首先调用派生类的析构函数,然后调用基类的析构函数。通常,对于基类,其析构函数应设置为虚的。
3、赋值运算符:
如果类构造函数使用new来初始化指针,则需要提供一个赋值运算符,对于派生类的基类部分,C++将使用基类的赋值运算符,所以不需要为派生类重新定义赋值运算符,除非它添加了需要特别留意的数据成员。
然而,如果派生类使用了new,则必须提供显式赋值运算符。必须给类的每个成员提供赋值运算符,而不仅仅是新成员。
4、私有成员与保护成员:
对于派生类而言,保护成员类似于公有成员。对于外部而言,保护成员与私有成员类似。派生类可以直接访问基类的保护成员,但只能通过基类的成员函数来访问私有成员。
5、虚方法:
设计基类时,如果希望派生类能够重新定义方法,则应在基类中将方法定义为虚的,这样可以启用晚期联编(动态联编)。
6、析构函数:
基类的析构函数应当是虚的。这样,当通过指向对象的基类指针或引用来删除派生对象时,程序将先调用派生类的析构函数,然后调用基类的析构函数,而不仅仅是调用基类的析构函数。
7、友元函数:
友元函数非类成员,因此不能继承。然而可以通过强制类型转换,将派生类引用或指针转换为基类引用或指针,然后使用转换后的指针或引用来调用基类的友元函数。
也可以全用运算符dynamic_cast<>来进行强制类型转换。
8、有关使用基类方法的说明:
派生类对象自动使用继承而来的基类方法,如果派生类没有重新定义该方法。
派生类的构造函数自动调用基类的构造函数。
派生类的构造函数自动调用基类的默认构造函数,如果没有在成员初始化列表中指定其它构造函数。
派生类构造函数显式地调用成员初始化列表中指定的基类构造函数。
派生类方法可以使用作用域解析运算符来调用公有的和受保护的基类方法。
派生类的友元函数可以通过强制类型转换,将派生类引用或指针转换为基类引用或指针,然后使用该引用或指针来调用基类的友元函数。

0 0
原创粉丝点击