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


相关文章
|
14天前
|
机器学习/深度学习 算法 算法框架/工具
为什么使用C++进行机器学习开发
C++作为一种高性能语言,在某些性能要求极高或资源受限的场景下也具有非常重要的地位。C++的高效性和对底层硬件的控制能力,使其在大规模机器学习系统中发挥重要作用,尤其是当需要处理大数据或实时响应的系统时。
29 3
|
8天前
|
存储 算法 C++
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
文章详细探讨了C++中的泛型编程与STL技术,重点讲解了如何使用模板来创建通用的函数和类,以及模板在提高代码复用性和灵活性方面的作用。
24 2
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
|
8天前
|
存储 安全 编译器
【C++核心】一文理解C++面向对象(超级详细!)
这篇文章详细讲解了C++面向对象的核心概念,包括类和对象、封装、继承、多态等。
11 2
|
9天前
|
物联网 C# C语言
物联网开发中C、C++和C#哪个更好用
在物联网(IoT)开发中,C、C++和C#各有优缺点,适用场景不同。C语言性能高、资源占用低,适合内存和计算能力有限的嵌入式系统,但开发复杂度高,易出错。C++支持面向对象编程,性能优秀,适用于复杂应用,但学习曲线陡峭,编译时间长。C#易于学习,与.NET框架结合紧密,适合快速开发Windows应用,但性能略低,平台支持有限。选择语言需根据具体项目需求、复杂性和团队技术栈综合考虑。
|
14天前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
54 1
|
2月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
75 2
|
2月前
|
存储 算法 编译器
[C++] STL简介
[C++] STL简介
23 1
|
2月前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
36 2
|
1月前
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
48 0
|
2月前
|
安全 编译器 容器
C++STL容器和智能指针
C++STL容器和智能指针
下一篇
无影云桌面