一.类的引入
众所周知,生活中我们会遇到许多的事物,我们通常把这些东西叫作对象。
当然,生活中的那些“对象”都会有属于它的属性或者行为(或者叫方法),比如说,学生就是一个对象,它具有身高、体重、爱好等属性,同时也拥有要去上学,学习知识的这类行为。
而在信息学竞赛中,我们常常会用类这个概念来描述这些对象
二.类的概念
类是一种用户自定义的数据结构。(对对对) 并且该类型的数据具有一定的行为能力, 也就是类中说描述的方法。通常来说, 一个类的定义包含两部分的内容, 一是该类的属性, 另一部分是它所拥有的方法。
以 “人类” 这个类来说, 每个人都有自己的姓名、年龄、出生日期、体重等, 为人类的属性部分, 此外,人能够吃饭、睡觉、行走、说话等属于人类所具有的行为。
上面举例中所描述的 “人” 类仅仅是具有人这种对象的最基础的一些属性和行为, 可以称之为人的”基类“。
假设我们现在定义了一个学生类,学生类可以看做是基类的一个扩展, 因为他具有基类的所有属性和行为, 并且在此基础上增加了一些基类所没有的属性和行为, 像”学生”这样的类称为”人类”这个基类的”派生类“或者”子类“。在学生的基础上海可以进一步的扩展出其他更高级的类, 如”研究生”类。
三.类的使用示例
不多说,直接上代码。
首先是定义一个类。
class 类名{
public:
//公共的属性和行为
private:
//私人的属性和行为
};
public与private为属性/方法限制的关键字, private 表示该部分内容是私密的, 不能被外部所访问或调用, 只能被本类内部访问; 而 public 表示公开的属性和方法, 外界可以直接访问或者调用。(就是字面意思)
一般来说类的属性成员都应设置为private, public只留给那些被外界用来调用的函数接口, 但这并非是强制规定, 可以根据需要进行调整;
好的,类的定义方法就说完了,接下来是类的应用实例。
假设我们现在定义一个X类,X类中含有两个参数(也就是X类的一个属性),现在要我们输出这个类的参数。
显然我们可以直接输出对吧。但是既然本文的主题是类,我们能不能采用类的方法去输出呢?
当然可以,下面我来附上代码
class X{
public:
void set_part(int x,int y){
xpos=x;
ypos=y;
}
void printout(){
cout<<xpos<<'\n';
cout<<ypos<<'\n';
}
private:
int xpos;
int ypos;
};
当然你也可以在类外定义函数,在类外定义成员函数通过在类内进行声明, 然后在类外通过作用域操作符 :: 进行实现。(个人不喜欢这种写法)
下面我们来看看类的赋初值的操作:
class A{
private:
int n2;
int n1;
public:
A() :n2(34), n1(n2+1) {}
void Print() {
cout << "n1:" << n1 << ", n2: " << n2 << endl;
}
};
int main(){
A a;
a.Print();
getchar();
return 0;
}
不过我们再来比较比较下面这个代码
class A{
private:
int n1;
int n2;
public:
A() :n2(34), n1(n2+1) {}
void Print() {
cout << "n1:" << n1 << ", n2: " << n2 << endl;
}
};
int main(){
A a;
a.Print();
getchar();
return 0;
}
经实验证明,后者是错的,前者是对的。
那是什么原因呢?
通过实验结果分析,前者的结果是完全正确的,而后者的结构却是一个绝对值极大的负值。
这启示我们,构造函数中,变量初始化的顺序,是以变量定义的顺序来定的,而不是简单的以构造函数中变量出现的顺序来定的
当然你也可以用参数构造一个类
public:
A(int k1,int k2) :n1(k1), n2(k2) {}
当然上诉做法也有等效做法:
public:
A(int k1,int k2) {
n1 = k1;
n2 = k2;
}