C ++ 类 | 类的创建和使用_1

 C ++ 中的 类 是用户定义的数据类型。 它可以有数据和函数。这听起来有点抽象,所以让我们看一个类的例子。让我们创建一个名为 'Student' 的类型。我们希望获得与每个学生相关的信息。 所以我们说我们的学生数据类型有:

  • a name
  • an id number
  • a graduation date

这三个是 学生类 的成员:

class Student
{
        string name;
        int id;
        int gradDate;
};

关于C ++类的好处,默认是使所有成员都是私有的。这意味着只有该类的其他成员才能访问该数据。听起来很糟糕....我们的数据类型包含我们无法访问的数据。 但是,请记住,我说过C ++类可以有 函数 和 数据 。

我们可以使用函数来访问类中的数据。

访问 和 修改类中数据值的函数称为 mutatorsmutator 顾名思义,就是指能够改变类成员数据的类成员函数。说到mutator,就要提到 accessor,C++的类 accessor 和 mutator,其实对应的分别就是 get 和 set 性质的函数;前者是只读性质的函数,而后者则是只写性质的。这也是C++类的封装特性的具体表现。 

现在让我们将 setName 函数(类中的函数也称为方法)添加到 Student 类中。 回想一下,类中成员的默认值是私有的。 我们希望访问函数是公有的。所以,我们添加了关键字 "public", 所有成员在 "public" 下面列出的都是可访问的:

class Student
{
        string name;
        int id;
        int gradDate;

    public:
        void setName(string name);

};

让我们创建一些函数来改变我们名为 Student 的类中的数据值,传统上,setDataName 是我们用来更改类中数据的。

在我们的例子中,我们有三个数据值:

  • name
  • id
  • gradDate

所以让我们创建一个函数来改变 name 的值:这只是通常的 C ++ 函数。 它接受输入字符串 并且 不返回任何内容。

注意,这个时候你可能会问,void 是什么?

答:void是空的意思,一般用来表示无参数或者无返回。

比如在函数定义的时候可以用 void func(void); 前面的表示函数无返回,括号里表示函数无参数。或者 void * 可以表示无类型指针,允许被强制转化成任意类型指针。

void setName(std::string nameIn)

 现在让我们添加一个函数来评估 Student类 中的每个数据值,一个类的示例:

class Student
{
        string name;
        int id;
        int gradDate;

    public:
        void setName(string nameIn);
        void setId(int idIn);
        void setGradDate(int dateIn);
};

因此,我们可以设置数据,但现在我们需要 "get" 数据。 传统上这些被称为 get-functions。它们的格式为 getDataValue。获取函数返回数据,因此 get 函数将变量类型作为返回变量。例如:要访问名为 name 的数据,函数声明将是:

string getName();

如果我们为每个数据成员执行 get 函数,则 Student类 应如下所示,一个类的例子:

class Student
{
        string name;
        int id;
        int gradDate;

    public:
        void setName(string nameIn);
        void setId(int idIn);
        void setGradDate(int dateIn);
        string getName();
        int getId();
        int getGradDate();
        void print();
};

我们已经声明了我们的 成员 和 函数 ,现在我们需要定义它们。 以下是我们的学生班:

class Student
{
        string name;
        int id;
        int gradDate;

    public:
        void setName(string nameIn);
        void setId(int idIn);
        void setgradDate(int dateIn);
        string getName();
        int getId();
        int getGradDate();
};

现在让我们先定义修改函数成员:

void Student::setName(string nameIn)
{
     name = nameIn;
}

void Student::setId(int idIn)
{
     id = idIn;
}

void Student::setGradDate(int gradDateIn)
{
     gradDate = gradDateIn;
}

然后让我们再来定义访问函数成员:

string Student::getName()
{
     return name;
}

int Student::getId()
{
     return id; 
}

int Student::getGradDate()
{
     return gradDate;
}

 让我们来看看我们到目前为止在学生班中所拥有的内容。

class Student
{
        string name;
        int id;
        int gradDate;

    public:
        void setName(string nameIn);
        void setId(int idIn);
        void setgradDate(int dateIn);
};

Student::setName(string nameIn)
{
     name = nameIn;
}

Student::setID(int idIn)
{
     id = idIn;
}

Student::setGradeDate(int gradDateIn)
{
     gradDate = gradDateIn;
}

我们的学生班已准备就绪。还有一个我想要添加到类中的函数成员,它不是必需的,但它很好。该函数称为打印。此函数将打印类中的所有数据值。

void print()
{
     cout<<name<<" "<<id<<" "<<gradDate;
}

请注意,此函数仅打印数据值,并在它们之间留一个空格。 它不会添加换行符或文本。 这是 C ++ 基本打印函数的标准配置。 我们必须认为其他人可能想要使用这个功能,我们应该尽可能保持中立。

class Student
{
        string name;
        int id;
        int gradDate;

    public:
        void setName(string nameIn);
        void setId(int idIn);
        void setGradDate(int dateIn);
        string getName();
        int getId();
        int getGradDate();
        void print();
};

void Student::setName(string nameIn)
{
     name = nameIn;
}

void Student::setId(int idIn)
{
     id = idIn;
}

void Student::setGradDate(int gradDateIn)
{
     gradDate = gradDateIn;
}

void Student::print()
{
     cout<<name<<" "<<id<<" "<<gradDate;
}

string Student::getName()
{
     return name;
}

int Student::getId()
{
     return id; 
}

int Student::getGradDate()
{
     return gradDate;
}

总结,类的语法是:

class ClassName
{
      member1;
      member2;
      ...

public:
     return variable accessFunction1(function parameters);
     return variable accessFunction2(function parameters); 
      ...
} ;

returnVariable ClassName:: accessFunction1(function parameters)
{
    function statements;
}

returnVariable ClassName:: accessFunction2(function parameters)
{
    function statements;
}

...

另外,一些约定首先列出公共定义,包括谷歌C++ 样式指南,最好使用这种约定。

C ++ 约定是:

  • 大写类名的第一个字母。
    class ClassName
  •  私有成员首先列出。 如果您这样做,则无需使用 'private' 关键字。 如果您在 public 关键字后面列出它们,则需要使用private 关键字来标识它们。
    {
          member1;
          member2;
          ...
  • 使用 'getVariableName' 访问私有变量,使用 'setVariableName' 为私有变量赋值。
    public:
         return variable accessFunction1(function parameters);
         return variable accessFunction2(function parameters); 
          ...
    } ;
  •  您需要使用命名空间classname ::来表示函数是类定义的一部分。
    returnVariable ClassName:: accessFunction1(function parameters)
    {
        function statements;
    }
    
    returnVariable ClassName:: accessFunction2(function parameters)
    {
        function statements;
    }

通常将类放在头文件中。 对于这个例子,我们将把它们放在主文件中,这样我们就可以同时看到主程序 和 类。 希望这会让我们更容易看到程序中发生了什么。 请注意,我们需要使用 " . " 来访问公共成员。例如,要获取学生班级中毕业日期的值,我们需要输入:

studentVariableName.getGradDate();

还有另一个运算符( - >)用于访问类的指针成员。 我们将在二进制查找树中讨论该运算符。以下是完整例子:

#include<iostream>
using namespace std;


class Student
{
        string name;
        int id;
        int gradDate;

    public:
        void setName(string nameIn);
        void setId(int idIn);
        void setGradDate(int dateIn);
        string getName();
        int getId();
        int getGradDate();
        void print();
};

void Student::setName(string nameIn)
{
     name = nameIn;
}

void Student::setId(int idIn)
{
     id = idIn;
}

void Student::setGradDate(int gradDateIn)
{
     gradDate = gradDateIn;
}

void Student::print()
{
     cout<<name<<" "<<id<<" "<<gradDate;
}

string Student::getName()
{
     return name;
}

int Student::getId()
{
     return id; 
}

int Student::getGradDate()
{
     return gradDate;
}

int main()
{
    int integer1; 
    float float1;
    Student student1; 
    
    integer1 = 4; //assign a value to integer1
    float1 = 4.333; //assign a value to float1

    student1.setName("Catherine Gamboa"); //assign a value to the student name
    student1.setId(54345); //assign a value to the student id number
    student1.setGradDate(2017); //assign a value to the student grad date
    
    //Let's print the values of our variables
    cout<<"integer1 = "<<integer1<<"\n";
    cout<<"float1 = "<<float1<<"\n\n";
    
    //There are two ways we can print the values of our class:
    //The first is to call the print function we created.
    cout<<"Using the Student::print function\n";
    cout<<"Student1 = ";
    student1.print();
    cout<<"\n\n";
    
    //The second is to access each member of the class using the get functions
    cout<<"Using the student access functions\n";
    cout<<"Student1 name = "<<student1.getName()<<"\n";
    cout<<"Student1 ID = "<<student1.getId()<<"\n";
    cout<<"Student1 Grad Date = "<<student1.getGradDate()<<"\n";
    
    
    return 0; 
}

运行结果:

再来看另外一个例子,

#include<iostream>

using namespace std;

class Dog
{
    string name;
    int licenseNumber;
public:
    void setName(string nameIn);
    void setLicenseNumber(int licenseNumberIn);
    string getName();
    int getLicenseNumber();
    void printInfo();
};

void Dog::setName(string nameIn)
{
    //ToDo: finish this function
    name = nameIn;
}

void Dog::setLicenseNumber(int licenseNumberIn)
{
    //ToDo: finish this function
    licenseNumber = licenseNumberIn;
}

string Dog::getName()
{
    //ToDo: finish this function
    return name;
}

int Dog::getLicenseNumber()
{
    //ToDo: finish this function
    return licenseNumber;
}
 
void Dog::printInfo()
{
    //ToDo: finish this function
    cout<< name <<" "<< licenseNumber<<"\n";
}
    

上面这个例子的类作为头文件,头文件名为:main.hpp。

#include"main.hpp"

int main()
{
    Dog dog1;
    dog1.setName("Trixie");
    dog1.setLicenseNumber(1234);
    dog1.printInfo();
    
    Dog dog2;
    dog2.setName("Kali");
    dog2.setLicenseNumber(5678);
    dog2.printInfo();
    
    return 0;
}

这里使用头文件,#include"main.hpp"。然后我们直接调用来使用,运行结果:


 有编过程的人的代码,比那些无知的人使用的软件更有价值。

猜你喜欢

转载自blog.csdn.net/sw3300255/article/details/84813233