C++ STL开发温习与总结(四): 4.C++面向对象机制的实现

简介: C++ STL开发温习与总结(四): 4.C++面向对象机制的实现

原博主博客地址:http://blog.csdn.net/qq21497936

本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78105316


C++ STL开发温习与总结(四):

4.C++面向对象机制的实现

     对比与C语言的函数,C++增加了重载(Overloaded)、内联(Inline)、const和virtual四种新机制。

     本篇将探究重载、内敛和virtual的优点和局限性。

1类的继承技术

     对象(Object)是类(Class)的一个实例(Instance)。如果将对象比作房子,那么类就是设计房子的图纸。   对象是类的实现,类是对这一类对象的抽象。

     对于C++而言,设计孤立的类是比较容易的,难的是正确设计基类及其派生类。

class A
{
public:
       voidFunc1(void);
};
class B : public A
{
public:
       voidFunc2(void);
}
void main()
{
       B b;
       b.Func1();// B从A继承了函数Func1
       b.Func2();
}

     此例说明了一个事实:C++的“继承”特性可以提高程序的可复用性。

1-1单继承技术

     在单继承中,每个类可以有多个派生类,但是每个派生类只能有一个基类,从而形成树形结构

class A
{
public:
       A();
       voidAprint();
       int a;
protected:
       intaa;
private:
       intaaa;
}
class B : public A
{
public:
       B();
       voidBprint();
       int b;
protected:
       intbb;
private:
       intbbb;
}

访问权限说明如下:

l 类B的public函数允许访问类A的public数据成员a;

l 类B的public函数允许访问类A的projected数据成员aa;

l 类B的protected函数允许访问类A的public数据成员a;

l 类B的protected函数允许访问类A的protected数据成员aa;

l 类B的private函数允许访问类A的public数据成员a;

l 类B的private函数允许访问类A的protected数据成员aa;

l 类B的所有成员函数可以访问类B的private和protected数据成员;

l 类A的所有成员函数可以访问类A的private数据成员;

     以上是数public继承方式,若是private继承,则类A对于类B来说都是private,无法访问。缺省的继承方式是private,即可不使用关键字。

1-2多继承技术

     多继承可以看作是单继承的扩展,所谓多继承是指派生类具有多个基类,派生类与每个基类之间的关系仍可看作是一个单继承。多继承下派生类定义的格式如下:

      class<派生类名>: <继承方式1><基类名1>,<继承方式2><基类名2>,…

     在多继承下,派生类的构造函数如下:

      <派生类名>(<总参数表>):<基类名1>(<参数表1>),<基类名2>(<参数表2>),…

      {<派生类构造函数体>}

下面是示例,使用了域操作符,解决相同函数名冲突问题

class B1
{
public:
       voidprint() { cout << “b1” << endl; }
}
class B2
{
public:
       voidprint() { cout << “b2” << endl; }
}
class A : public B1, public B2
{
public:
       void print() { B1::print(); B2::print(); }
}
void main()
{
       A a(1,2);
       a.print();
}

程序输出为:

b1

b2

2函数重载技术

     函数重载是指同一个函数名可以对应多个函数的实现。函数重载要求编译器能够惟一地确定调用一个函数时应执行哪个函数代码。确定函数实现时,要求从函数参数的个数和类型上来区分,否则,将无法实现重载。

3运算符重载技术

     函数重载和运算符重载是简单的类多态性。所谓函数的重载简单地说就是赋值给同一个函数名多个含义。运算符重载允许C/C++的运算符在用户定义类型(类)上拥有一个用户定义的意义。

     下面稍微提及以下面向程序的三大特性:

     多态性是面向对象程序设计的重要特征之一,它与封装性和继承性构成了面向对象程序设计的三大特征。

     封装性:把对象的成员属性和成员方法结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节。

     继承性:继承性是子类自动共享父类之间数据和方法的机制

     多态性:多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说:允许将子类类型的指针赋值给父类类型的指针(一个接口,多种方法)。编译时多态性(静态多态):通过重载函数实现,,运行时多态性(动态多态):通过虚函数实现,有virtual才可能发生动态多态现象,无virtual调用就按原类型调用。

     重载的运算符是函数调用的语法修饰:

class Fred
{ public: // …};
#if 0
// 没有算符重载
Fred add(Fred, Fred);
Fred mul(Fred, Fred);
Fred f(Freda, Fred b, Fred c) { return add( mul(a,b), mul(b,c), mul(c,a)); )
#else
// 有运算符重载
Fred operator+ (Fred, Fred);
Fred operator* (Fred, Fred);
Fred f(Freda, Fred b, Fred c) { return a*b+b*c+c*a; }
#endif



     通过重载类上的标准算符,使得用户程序所有的语言是面向问题的,而不是面向机器的,最终目标是降低学习曲线并减少错误率。几乎所有的运算符都可用作重载。具体包含:

l  算术运算符:+、-、*、/、%、++、--;

l  位操作运算符:&、|、~、^、<<、>>;

l  逻辑运算符:!、&&、||;

l  比较运算符:<,>,>=,<=,==,!=;

l  赋值运算符:=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=;

l  其他运算符:[]、()、->、(逗号运算符)、new、delete、new[]、delete[]、->*;

下列运算符不允许重载:“.”、“*”、“::”、“?”、“:”;

     用户重载新定义运算符,不改变原运算符的优先级和结合性,也不改变运算符的结构,即单目运算符只能重载单目运算符类似的。

4纯虚函数和抽象类技术

     纯虚函数是一种特殊的虚函数,它的一般格式如下:

      class<类名>{ virtual <类型><函数名>()=0;… };

     在许多情况下,在积累中不能对虚函数给出有意义的实现,而把它说明为纯虚函数,它的实现留给基类的派生类去做,这就是纯虚函数的作用。

     带有纯虚函数的类成为抽象类。抽象类是一种特殊的类,它是为了抽象和设计的目的而简历的,它处于继承层次结构的较上层。抽象类是不能定义对象的,在实际中为了强调一个类是抽象类,可将该类的构造函数说明为保护的访问控制权限

     一般来说,抽象类只描述了这组子类共同的操作接口,而完整的实现留给子类自己来完成。

     抽象类只能作为基类来使用,其纯虚函数的实现是由派生类给出的。如果派生类没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类,不能使用;如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类,而是一个可以建立对象的具体类。

 

 

原博主博客地址:http://blog.csdn.net/qq21497936

本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78105316


相关文章
|
4月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
99 2
|
6月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
167 2
|
6月前
|
存储 算法 C++
【c++丨STL】map/multimap的使用
本文详细介绍了STL关联式容器中的`map`和`multimap`的使用方法。`map`基于红黑树实现,内部元素按键自动升序排列,存储键值对,支持通过键访问或修改值;而`multimap`允许存在重复键。文章从构造函数、迭代器、容量接口、元素访问接口、增删操作到其他操作接口全面解析了`map`的功能,并通过实例演示了如何用`map`统计字符串数组中各元素的出现次数。最后对比了`map`与`set`的区别,强调了`map`在处理键值关系时的优势。
318 73
|
7月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
6月前
|
存储 算法 C++
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
256 3
|
7月前
|
存储 算法 C++
【c++丨STL】priority_queue(优先级队列)的使用与模拟实现
本文介绍了STL中的容器适配器`priority_queue`(优先级队列)。`priority_queue`根据严格的弱排序标准设计,确保其第一个元素始终是最大元素。它底层使用堆结构实现,支持大堆和小堆,默认为大堆。常用操作包括构造函数、`empty`、`size`、`top`、`push`、`pop`和`swap`等。我们还模拟实现了`priority_queue`,通过仿函数控制堆的类型,并调用封装容器的接口实现功能。最后,感谢大家的支持与关注。
318 1
|
7月前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
105 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
7月前
|
存储 算法 C++
深入浅出 C++ STL:解锁高效编程的秘密武器
C++ 标准模板库(STL)是现代 C++ 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C++ 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知识、发展历史、核心组件、重要性和学习方法。
|
7月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
3月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
83 0