C ++ 中的 类 是用户定义的数据类型。 它可以有数据和函数。这听起来有点抽象,所以让我们看一个类的例子。让我们创建一个名为 'Student' 的类型。我们希望获得与每个学生相关的信息。 所以我们说我们的学生数据类型有:
- a name
- an id number
- a graduation date
这三个是 学生类 的成员:
class Student
{
string name;
int id;
int gradDate;
};
关于C ++类的好处,默认是使所有成员都是私有的。这意味着只有该类的其他成员才能访问该数据。听起来很糟糕....我们的数据类型包含我们无法访问的数据。 但是,请记住,我说过C ++类可以有 函数 和 数据 。
我们可以使用函数来访问类中的数据。
访问 和 修改类中数据值的函数称为 mutators 。mutator 顾名思义,就是指能够改变类成员数据的类成员函数。说到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"。然后我们直接调用来使用,运行结果:
有编过程的人的代码,比那些无知的人使用的软件更有价值。