C++中的class的应用

  • Post author:
  • Post category:其他

一.类的引入

  众所周知,生活中我们会遇到许多的事物,我们通常把这些东西叫作对象
 当然,生活中的那些“对象”都会有属于它的属性或者行为(或者叫方法),比如说,学生就是一个对象,它具有身高、体重、爱好等属性,同时也拥有要去上学,学习知识的这类行为。
 而在信息学竞赛中,我们常常会用这个概念来描述这些对象

二.类的概念

是一种用户自定义的数据结构(对对对) 并且该类型的数据具有一定的行为能力, 也就是类中说描述的方法。通常来说, 一个类的定义包含两部分的内容, 一是该类的属性, 另一部分是它所拥有的方法。
 以 “人类” 这个类来说, 每个人都有自己的姓名、年龄、出生日期、体重等, 为人类的属性部分, 此外,人能够吃饭、睡觉、行走、说话等属于人类所具有的行为。
 上面举例中所描述的 “人” 类仅仅是具有人这种对象的最基础的一些属性和行为, 可以称之为人的”基类“。
  假设我们现在定义了一个学生类,学生类可以看做是基类的一个扩展, 因为他具有基类的所有属性和行为, 并且在此基础上增加了一些基类所没有的属性和行为, 像”学生”这样的类称为”人类”这个基类的”派生类“或者”子类“。在学生的基础上海可以进一步的扩展出其他更高级的类, 如”研究生”类。

三.类的使用示例

不多说,直接上代码。

首先是定义一个类。

class 类名{
	public:
		//公共的属性和行为 
	private:
		//私人的属性和行为 
};

publicprivate为属性/方法限制的关键字, 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;
    }

版权声明:本文为Lucas_FC_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。