C++面向对象知识总结|类&对象&成员&修饰

前言

"面向对象编程上一种特殊的、设计程序的概念性方法,C++通关一些特性改进了C语言,使得应用这种方法更容易。"

"采用OOP方法时,首先从用户的角度考虑对象——描述对象所需的数据以及描述用户与数据交互所需的操作。完成对接口的描述后,需要确定如何实现接口和数据存储。最后,使用新的设计方案创建出程序。"

类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合成一个整洁的包。

类成员函数

成员函数定义与常规函数定义非常相似,它们有函数头和函数体,也可以有返回类型和参数。但是它们还有两个特殊的特征:

  • 定义成员函数时,使用作用域解析运算符(::)来标识函数所属的类;
    例如,update()是Stock类中的一个成员函数,它的表示法是:
    void Stock::update(double price) , 作用域解析运算符确定了方法定义对应的类的身份。所以我们说update()具有类作用域。
    不仅是定义,在调用类的静态方法时候也是使用这种表示法。我们之前一直写得std::cout 就是这样的,这种表示法意味着我们定义的cout属于std类中的一个静态方法。
  • 类方法可以访问类的private成员

访问控制

访问修饰符描述了对类成员的访问控制。公有修饰符(public)修饰着类或成员可以被使用类对象的程序直接访问,属于程序的公有部分,而私有修饰符(private)只能通过对象的公有成员函数(也称之为友元函数)来访问对象的私有成员。因此公有成员函数是程序和对象的私有成员之间的桥梁,提供了对象和程序之间的接口。防止程序直接访问数据,此限制被称之为数据隐藏。实际上,在C++中还提供了 protected (受保护的)访问范围修饰符,从而成为“保护成员”。

保护成员的可访问范围比私有成员大,比公有成员小。能访问私有成员的地方都能访问保护成员。

保护成员扩大的访问范围表现在:基类的保护成员可以在派生类的成员函数中被访问。

引入保护成员的理由是:基类的成员本来就是派生类的成员,因此对于那些出于隐藏的目的不宜设为公有,但又确实需要在派生类的成员函数中经常访问的基类成员,将它们设置为保护成员,既能起到隐藏的目的,又避免了派生类成员函数要访问它们时只能间接访问所带来的麻烦。需要额外注意的是,派生类的成员函数只能访问所作用的那个对象(即this指针指向的对象)的基类保护成员,不能访问其他基类对象的基类保护成员。来看下面的例子:

将实现细节放在一起并将它们与抽象分开被称之为封装。数据隐藏也是一种封装,将实现的细节隐藏在私有部分中。

示例:

class program
{
    int a;
    string m_name;
private:
    /* data */
public:
    program(/* args */);
    ~program();
    void SetName(string name)
    {
        m_name=name;
    }
    string GetName()
    {
        return m_name;
    }
};

int main()
{
    //struct programData d;
    program d2;
    // d2.a=10;
    d.a=10;
    d2.SetName("Miracle");
    cout<<"Name: "<<d2.GetName()<<endl;
    system("pause");
    return 1;
}

program::program(/* args */)
{
}

program::~program()
{
}

 

特性

C++面向对象的三大特性:

  • 封装
  • 继承
  • 多态

具有相同性质的对象,我们可以抽象为类。

封装

隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。

封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。

封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。

封装的意义

封装主要为实现代码复用,提供开发效率,节省开发时间

封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。

封装的另一个例子是,将函数定义和类声明放在不同的文件中。

2022/11/11 15:39 面向对象的概念太多了,改天再写吧。今天光棍节,对自己好一点。


2022/11/18 22:06 这段时间准备四级、期末,只好把C++先放下了。

结构体

在 C++ 中结构体和类的构造是相同的,只不过在结构中,默认可访问性是公共的,而在类中,默认值是私有的。

类和结构是用于定义你自己的类型的构造。 类和结构都可以包含数据成员和成员函数,使你可以描述类型的状态和行为。

三种类类型是结构、类和联合。 它们使用 struct、class  union 关键字进行声明。 下表显示三种类类型之间的差异。

有关联合的详细信息,请参阅联合。 有关 C++/CLI 和 C++/CX 中类和结构的信息,请参阅类和结构。

结构、类和联合的访问控制和约束

结构 Unions
类别键是 struct 类别键是 class 类别键是 union
默认访问是公共的 默认访问是私有的 默认访问是公共的
没有使用约束 没有使用约束 一次只使用一个成员

 

参考文献:

(美)史蒂芬·普拉达(Stephen Prata)著.C++ Primer Plus中文版:第6版[M](张海龙、袁国忠 译).北京:人民邮电出版社.2012.7

(美)弗里曼(Freeman,E.)著.Head First 设计模式[M](OreilyTaiwan公司 译).中国电力出版社.2002

对象

匿名对象

    vector<int> a;
    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
    printf("%d",vector<int>(a).at(1));

vector<int>(a)为一个匿名对象。匿名对象的生命周期仅在当前代码行,由系统自动回收。

 

参考文章:

C++ protected(受保护的)详解

类和结构 (C++) | Microsoft Learn

作者:Miracle
来源:麦瑞克博客
链接:https://www.unitymake.com/archives/programming-life/cpp/2322
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议,转载请注明!
THE END
分享
打赏
海报
C++面向对象知识总结|类&对象&成员&修饰
前言 "面向对象编程上一种特殊的、设计程序的概念性方法,C++通关一些特性改进了C语言,使得应用这种方法更容易。" "采用OOP方法时,首先从用户的角度考虑对象……
<<上一篇
下一篇>>
文章目录
关闭
目 录