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


相关文章
|
11天前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
27 7
|
28天前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
54 4
|
1月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
72 5
|
1月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
51 2
|
1月前
|
存储 算法 Linux
【c++】STL简介
本文介绍了C++标准模板库(STL)的基本概念、组成部分及学习方法,强调了STL在提高编程效率和代码复用性方面的重要性。文章详细解析了STL的六大组件:容器、算法、迭代器、仿函数、配接器和空间配置器,并提出了学习STL的三个层次,旨在帮助读者深入理解和掌握STL。
52 0
|
14天前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
27 0
|
1月前
|
存储 安全 编译器
【c++】深入理解别名机制--引用
本文介绍了C++中的引用概念及其定义、特性、实用性和与指针的区别。引用是C++中的一种别名机制,通过引用可以实现类似于指针的功能,但更安全、简洁。文章详细解释了引用的定义方式、引用传参和返回值的应用场景,以及常引用的使用方法。最后,对比了引用和指针的异同,强调了引用在编程中的重要性和优势。
39 1
WK
|
1月前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
63 0
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
104 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
92 4