欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++ 类(Class)的定义与实现示例(一)

程序员文章站 2022-07-16 23:02:22
...

一、“类” 的介绍

在C++中, 用 "类" 来描述 "对象", 所谓的"对象"是指现实世界中的一切事物。那么类就可以看做是对相似事物的抽象, 找到这些不同事物间的共同点, 如自行车和摩托车, 首先他们都属于"对象", 并且具有一定得相同点, 和一些不同点, 相同点如他们都有质量、都有两个*, 都是属于交通工具等。"都有质量"、"两个*"属于这个对象的属性, 而"都能够当做交通工具"属于该对象具有的行为, 也称方法。

类是属于用户自定义的数据类型, 并且该类型的数据具有一定的行为能力, 也就是类中说描述的方法。通常来说, 一个类的定义包含两部分的内容, 一是该类的属性, 另一部分是它所拥有的方法。以 "人类" 这个类来说, 每个人都有自己的姓名、年龄、出生日期、体重等, 为 人类 的属性部分, 此外, 人能够吃饭、睡觉、行走、说话等属于人类所具有的行为。

上面举例中所描述的 "人" 类仅仅是具有人这种对象的最基础的一些属性和行为, 可以称之为人的"**基类**"。 再说说一些具有一些职业的人, 例如学生, 一个学生还具有"基类"中所没有的属性, 如学校、班级、学号; 也可以具有基类所不具有的行为, 如每天需要去上课, 需要考试等。

学生类可以看做是**基类的一个扩展**, 因为他具有基类的所有属性和行为, 并且在此基础上增加了一些基类所没有的属性和行为, 像"学生"这样的类称为"人类"这个基类的**"派生类"**或者**"子类"**。在学生的基础上海可以进一步的扩展出其他更高级的类, 如"研究生"类。

到此, 我们不再更深的去介绍类的其他相关知识。

二、C++类的定义

C++中使用关键字 class 来定义类, 其**基本形式**如下:
class 类名
{
public:
//公共的行为或属性
private:
//公共的行为或属性
};

在网上看到的另一种讲解感觉很好:

在public: 下的成员,是类的公有成员,别的类或者主函数可以申明个对象直接访问,而private: 下的是私有成员,只有类的内部能访问,类的外部无法访问的.
class A
{
public:
int a;
private:
int b;
};
main()
{
A aa;
aa.a=1;
//aa.b=2会出错,说无法访问私有成员
}

补充:
在《C++类成员的访问范围》一节中介绍过类的成员可以是私有成员(private)公有成员(public)。实际上,类的成员还可以用 protected 访问范围说明符修饰,从而成为“保护成员”。
保护成员的可访问范围比私有成员大,比公有成员小。能访问私有成员的地方都能访问保护成员。

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

引入保护成员的理由是:基类的成员本来就是派生类的成员,因此对于那些出于隐藏的目的不宜设为公有,但又确实需要在派生类的成员函数中经常访问的基类成员,将它们设置为保护成员,既能起到隐藏的目的,又避免了派生类成员函数要访问它们时只能间接访问所带来的麻烦。

不过需要注意的是,派生类的成员函数只能访问所作用的那个对象(即this指针指向的对象)的基类保护成员,不能访问其他基类对象的基类保护成员。来看下面的例子:

class CBase {
    private: int nPrivate;   //私有成员
    public:  int nPublic;    //公有成员
    protected: int nProtected;   // 保护成员
};
class CDerived :public CBase
{
    void AccessBase ()
    {
        nPublic = 1;      // OK
        nPrivate = 1;    // 错,因为在派生类的成员函数中不能访问基类的私有成员。
        nProtected = 1;  // OK,在派生类的成员函数中可以访问基类的保护成员。
        CBase f;
        f.nProtected = 1; //错,因为 f 不是 this 指针所指向的对象,即不是 AccessBase 函数所作用的 对象,所以不能访问其保护成员。
    }
};
int main()
{
    CBase b;
    CDerived d;
    int n = b.nProtected ;  //错,不在派生类成员函数内,因为在类的成员函数外部,不能访问对象的私有成员和保护成员。

    n = d.nPrivate;          //错,因为在类的成员函数外部,不能访问对象d的私有成员和保护成员。

    int m = d.nPublic;      //OK
    return 0;
}

引自http://c.biancheng.net/view/252.html
说明:
①. 类名 需要遵循一般的命名规则;

    ②. public 与 private 为属性/方法限制的关键字, private 表示该部分内容是私密的, 不能被外部所访问或调用, 只能被本类内部访问; 而 public 表示公开的属性和方法, 外界可以直接访问或者调用。
        一般来说类的属性成员都应设置为private, public只留给那些被外界用来调用的函数接口, 但这并非是强制规定, 可以根据需要进行调整;
        
    ③. 结束部分的分号不能省略。

三、C++类的实现

在上面的定义示例中我们只是定义了这个类的一些属性和方法声明, 并没有去实现它, 类的实现就是完成其方法的过程。类的实现有两种方式, 一种是在类定义时完成对成员函数的定义, 另一种是在类定义的外部进行完成。

1>. 在类定义时定义成员函数
    成员函数的实现可以在类定义时同时完成, 如代码:
#include <iostream>
using namespace std;
class Point
{
public:
    void setPoint(int x, int y) //实现setPoint函数
    {
        xPos = x;
        yPos = y;
    }
    void printPoint() //实现printPoint函数
    {
        cout<< "x = " << xPos << endl;
        cout<< "y = " << yPos << endl;
    }
private:
    int xPos;
    int yPos;
};
int main()
{
    Point M; //用定义好的类创建一个对象 点M
    M.setPoint(10, 20); //设置 M点 的x,y值
    M.printPoint(); //输出 M点 的信息
    return 0;
}

运行输出:

x = 10
y = 20

与类的定义相比, 在类内实现成员函数不再是在类内进行声明, 而是直接将函数进行定义, 在类中定义成员函数时, 编译器默认会争取将其定义为 inline 型函数 2>. 在类外定义成员函数
在类外定义成员函数通过在类内进行声明, 然后在类外通过作用域操作符 :: 进行实现, 形式如下:

返回类型 类名::成员函数名(参数列表)
{
//函数体
}

#include <iostream>
using namespace std;
class Point
{
public:
    void setPoint(int x, int y); //在类内对成员函数进行声明
    void printPoint();
private:
    int xPos;
    int yPos;
};
void Point::setPoint(int x, int y) //通过作用域操作符 '::' 实现setPoint函数
{
    xPos = x;
    yPos = y;
}
void Point::printPoint() //实现printPoint函数
{
    cout<< "x = " << xPos << endl;
    cout<< "y = " << yPos << endl;
}
int main()
{
    Point M; //用定义好的类创建一个对象 点M
    M.setPoint(10, 20); //设置 M点 的x,y值
    M.printPoint(); //输出 M点 的信息
    return 0;
}

依 setPoint 成员函数来说, 在类内声明的形式为 void setPoint(int x, int y); 那么在类外对其定义时函数头就应该是 void Point::setPoint(int x, int y) 这种形式, 其返回类型、成员函数名、参数列表都要与类内声明的形式一致。

四、对象的作用域、可见域与生存周期

类对象的作用域、可见域以及生存周期与普通变量的保持相同, 当对象生存周期结束时对象被自动撤销, 所占用的内存被回收, 需要注意的是, 如果对象的成员函数中有使用 new 或者 malloc 申请的动态内存程序不会对其进行释放, 需要我们手动进行清理, 否则会造成内存泄露。

这里是引用https://www.cnblogs.com/wkfvawl/p/10561032.html

相关标签: C++ c++