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


相关文章
|
13天前
|
存储 安全 编译器
【c++】深入理解别名机制--引用
本文介绍了C++中的引用概念及其定义、特性、实用性和与指针的区别。引用是C++中的一种别名机制,通过引用可以实现类似于指针的功能,但更安全、简洁。文章详细解释了引用的定义方式、引用传参和返回值的应用场景,以及常引用的使用方法。最后,对比了引用和指针的异同,强调了引用在编程中的重要性和优势。
29 1
WK
|
19天前
|
机器学习/深度学习 人工智能 算法
那C++适合开发哪些项目
C++ 是一种功能强大、应用广泛的编程语言,适合开发多种类型的项目。它在游戏开发、操作系统、嵌入式系统、科学计算、金融、图形图像处理、数据库管理、网络通信、人工智能、虚拟现实、航空航天等领域都有广泛应用。C++ 以其高性能、内存管理和跨平台兼容性等优势,成为众多开发者的选择。
WK
40 1
|
1月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
69 5
|
1月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
52 1
|
1月前
|
Rust 资源调度 安全
为什么使用 Rust over C++ 进行 IoT 解决方案开发
为什么使用 Rust over C++ 进行 IoT 解决方案开发
68 7
WK
|
18天前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
35 0
WK
|
19天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
28 0
|
1月前
|
NoSQL API Redis
如何使用 C++ 开发 Redis 模块
如何使用 C++ 开发 Redis 模块
|
1月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
22 0
|
9天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
36 4