zoukankan      html  css  js  c++  java
  • C++ 类 & 对象

    C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型。

    类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。



    1 C++ 类定义

    类定义是以关键字 class 开头,后跟类的名称。类的主体是包含在一对花括号中。类定义后必须跟着一个分号或一个声明列表。例如,我们使用关键字 class 定义 Box 数据类型,如下所示:

    class Box
    {
       public:
          double length;   // 盒子的长度
          double breadth;  // 盒子的宽度
          double height;   // 盒子的高度
    };
    

    关键字 public 确定了类成员的访问属性。在类对象作用域内,公共成员在类的外部是可访问的。您也可以指定类的成员为 privateprotected,这个我们稍后会进行讲解。



    2 定义 C++ 对象

    类提供了对象的蓝图,所以基本上,对象是根据类来创建的。声明类的对象,就像声明基本类型的变量一样。下面的语句声明了类 Box 的两个对象:

    Box Box1;          // 声明 Box1,类型为 Box
    Box Box2;          // 声明 Box2,类型为 Box
    


    3 访问数据成员

    类的对象的公共数据成员可以使用直接成员访问运算符 (.) 来访问。为了更好地理解这些概念,让我们尝试一下下面的实例:

    #include <iostream>
     
    using namespace std;
     
    class Box
    {
       public:
          double length;   // 长度
          double breadth;  // 宽度
          double height;   // 高度
    };
     
    int main( )
    {
       Box Box1;        // 声明 Box1,类型为 Box
       Box Box2;        // 声明 Box2,类型为 Box
       double volume = 0.0;     // 用于存储体积
     
       // box 1 详述
       Box1.height = 5.0; 
       Box1.length = 6.0; 
       Box1.breadth = 7.0;
     
       // box 2 详述
       Box2.height = 10.0;
       Box2.length = 12.0;
       Box2.breadth = 13.0;
     
       // box 1 的体积
       volume = Box1.height * Box1.length * Box1.breadth;
       cout << "Box1 的体积:" << volume <<endl;
     
       // box 2 的体积
       volume = Box2.height * Box2.length * Box2.breadth;
       cout << "Box2 的体积:" << volume <<endl;
       return 0;
    }
    

    当上面的代码被编译和执行时,它会产生下列结果:

    Box1 的体积:210
    Box2 的体积:1560
    

    需要注意的是,私有的成员和受保护的成员不能使用直接成员访问运算符 (.) 来直接访问。我们将在后续的教程中学习如何访问私有成员和受保护的成员。



    4 类 & 对象详解

    到目前为止,我们已经对 C++ 的类和对象有了基本的了解。下面的列表中还列出了其他一些 C++ 类和对象相关的概念,可以点击相应的链接进行学习。

    概念 描述
    类成员函数 类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。
    类访问修饰符 类成员可以被定义为 public、private 或 protected。默认情况下是定义为 private。
    构造函数 & 析构函数 类的构造函数是一种特殊的函数,在创建一个新的对象时调用。类的析构函数也是一种特殊的函数,在删除所创建的对象时调用。
    C++ 拷贝构造函数 拷贝构造函数,是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。
    C++ 友元函数 友元函数可以访问类的 private 和 protected 成员。
    C++ 内联函数 通过内联函数,编译器试图在调用函数的地方扩展函数体中的代码。
    C++ 中的 this 指针 每个对象都有一个特殊的指针 this,它指向对象本身。</span
    C++ 中指向类的指针 指向类的指针方式如同指向结构的指针。实际上,类可以看成是一个带有函数的结构。
    C++ 类的静态成员 类的数据成员和函数成员都可以被声明为静态的。


    5 扩展

    C++中的struct与class的区别

    C++ 中的 struct 对 C 中的 struct 进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它既能包含成员函数,又能继承,还能实现多态。

    既然这些它都能实现,那它和 class 还能有什么区别?

    最本质的一个区别就是默认的访问控制,体现在两个方面:

    1)默认的继承访问权限。struct是public的,class是private的。

    你可以写如下的代码:

    struct A
    {
        char a;
    };
    struct B : A
    {
        char b;
    };
    

    这个时候 B 是 public 继承 A 的。如果都将上面的 struct 改成 class,那么 B 是 private 继承 A 的。这就是默认的继承访问权限。

    当然,到底默认是 public 继承还是 private 继承,取决于子类而不是基类。我的意思是,struct 可以继承 class,同样 class 也可以继承 struct,那么默认的继承访问权限是看子类到底是用的 struct 还是 class。如下:

    struct A{}; 
    class B : A{}; //private继承
    struct C : B{}; //public继承
    

    2)struct 作为数据结构的实现体,它默认的数据访问控制是 public 的,而 class 作为对象的实现体,它默认的成员变量访问控制是 private 的。

    其实,到底是用 struct 还是 class,完全看个人的喜好,你可以将你程序里所有的 class 全部替换成 struct,它依旧可以很正常的运行。但我给出的最好建议,还是:当你觉得你要做的更像是一种数据结构的话,那么用 struct,如果你要做的更像是一种对象的话,那么用 class。

    其实它们确实还有另一个区别,虽然那个区别我们平时可能很少涉及。那就是:“class” 这个关键字还用于定义模板参数,就像 “typename”。但关键字 “struct” 不用于定义模板参数。


    趣味图

    img

  • 相关阅读:
    LeetCode 109 Convert Sorted List to Binary Search Tree
    LeetCode 108 Convert Sorted Array to Binary Search Tree
    LeetCode 107. Binary Tree Level Order Traversal II
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode 103 Binary Tree Zigzag Level Order Traversal
    LeetCode 102. Binary Tree Level Order Traversal
    LeetCode 104. Maximum Depth of Binary Tree
    接口和多态性
    C# 编码规范
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/10390457.html
Copyright © 2011-2022 走看看