【类和对象】类的引入 | 类的定义 | 类的访问及封装

目录

1.面向过程和面向对象初步认识

2.类的引入

3.类的定义

3.1类的定义规则 

3.2关键字class和struct的区别

3.3两种定义方式(声明和定义分离否)

3.4成员变量命名规则

4.类的访问限定符及封装

4.1访问限定符

4.2封装


1.面向过程和面向对象初步认识

  • 面向过程(Procedure Oriented 简称 PO):把事情拆分成几个步骤(相当于拆分成一个个的方法和数据),然后按照一定的顺序执行。
  • 面向对象(Object Oriented 简称 OO):面向对象会把事物抽象成对象的概念,先抽象出对象,然后给对象赋一些属性和方法,然后让每个对象去执行自己的方法。
  • 对象:对象是类的实例,一个对象必须属于一个自己的类,因此在定义对象前,必须要定义好自己所属的类。
  • (Class)是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础。类是一种用户定义的引用数据类型,也称类类型。每个类包含数据说明和一组操作数据或传递消息的函数。类的实例称为对象。(类似C语言中的结构体)
  • C语言是面向过程的,关注的是过程/步骤,分析出求解问题的步骤,通过函数调用逐步解决问题。
  • C++是基于面向对象的,关注的是对象/对象和对象之间的关系,将一件事情拆分成不同的对象,靠对象之间的交互完成。

举例:以洗衣服和晒衣服这件事为例。

  • C语言更加关注的是整个过程/步骤。
  • C++更加关注的是对象,然后才是过程。 

2.类的引入

C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如:之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现,会发现struct中也可以定义函数。

  • C with class
  • C++兼容C,所以C++同时兼容struct 的用法,但结构体同时升级成了类。
  • C++类就是C中的结构体
  • 类内不仅可以定义变量,也可以定义函数(成员函数)
  • 类的实例化可以直接使用类名(类 对象)
  • 一个类就是一个域(类域),不同类的相同函数名就不用区分了
  • 访问类的成员变量/函数(无论对象/指针 访问方式和结构体一样 )
  • 除了指针的访问,成员函数有点特殊后面讲解

一个类怎么设计,取决于类(成员变量/属性)要实现什么功能,方法。(成员函数)

#include<stdlib.h>
#include<iostream>
using namespace std;

typedef int DataType;
struct Stack
{
   //成员函数
	void Init(size_t capacity)
	{
		_array = (DataType*)malloc(sizeof(DataType) * capacity);
		if (nullptr == _array)
		{
			perror("malloc申请空间失败");
			return;
		}
		_capacity = capacity;
		_size = 0;
	}
	void Push(const DataType& data)
	{
		// 扩容
		_array[_size] = data;
		++_size;
	}
	DataType Top()
	{
		return _array[_size - 1];
	}
	void Destroy()
	{
		if (_array)
		{
			free(_array);
			_array = nullptr;
			_capacity = 0;
			_size = 0;
		}
	}
    //成员变量
	DataType* _array;
	size_t _capacity;
	size_t _size;
};
int main()
{
	Stack s;
	s.Init(10);
	s.Push(1);
	s.Push(2);
	s.Push(3);
	cout << s.Top() << endl;
	s.Destroy();
	return 0;
}

 上面结构体的定义,在C++中更喜欢用class来代替。class和struct这两个关键字有什么区别呢?

3.类的定义

3.1类的定义规则 

class为定义类的关键字,ClassName为类的名字,{ }中为类的主体,注意类定义结束时后面分号不能省略。
类体中内容称为类的成员

  • 类中的变量称为类的属性成员变量;
  • 类中的函数称为类的方法或者成员函数
class className
{
// 类体:由成员函数和成员变量组成
};  // 一定要注意后面的分号

【日期类】是我们后面讲解常用的例子。 

class Date
{
  //
};
//称"日期类"

3.2关键字class和struct的区别

class和struct有两个不一样,其他均一样

  • struct兼容C/C++的用法,class不兼容只能使用C++的用法。
  • 关于类的访问限定符:struct默认是公有的public,class默认是私有的private(因为struct要兼容C)>>?访问限定符后面细讲

3.3两种定义方式(声明和定义分离否)

类的两种定义方式:

  • 1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
  • 2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::
  • 一般情况下,更期望采用第二种方式。注意:上课为了方便演示使用方式一定义类,大家后序工作中尽量使用第二种。

【方法1:声明和定义不分离】

声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内
联函数处理。

 

【方法2:声明和定义分析】

 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::

  • 类域:类里面也是一个域(花括号里面也是一个域)
  • 类域可以顺便解决解决命名冲突的问题
  • 搜索原则:1.局部优先  2.再类域 3.全局域
  • 注意:缺省参数只在声明里面(类域),不在定义里面。
  • 注意:成员函数名前需要加类名::

//test.h
#pragma once
#include<stdlib.h>
#include<iostream>
using namespace std;
class Date
{
public:
	void Init(int year = 7, int month = 7, int day = 7);

public:
	int _year;
	int _month;
	int _day;
};

//test.cpp
#include"test.h"
void Date::Init(int year=8, int month, int day)//❌
{
	_year = year;//代码的可读性不高
	_month = month;
	_day = day;
}


//project.cpp
#include"test.h"
int main()
{
	Date s;
	s.Init();
	return 0;
}

3.4成员变量命名规则

 一般像下面这种代码不好区分,代码的可读性不高。

所有为了区分:(只列举两种,根据实际情况区分,不强制要求,只要能区分即可)

  • 可以在成员变量前加下划线
  • 可以在成员变量前加D
class Date
{
public:
	void Init(int year, int month, int day)
	{
		year = year;//代码的可读性不高
	}
	int year;
	int month;
	int day;
};

int main()
{
	Date s;
	s.Init(7, 7, 7);
	return 0;
}
class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	int _year;
	int _month;
	int _day;
};
// 我们看看这个函数,是不是很僵硬?
class Date
{
public:
	void Init(int year)
	{
		// 这里的year到底是成员变量,还是函数形参?
		year = year;
	}
private:
	int year;
};
// 所以一般都建议这样
class Date
{
public:
	void Init(int year)
	{
		_year = year;
	}
private:
	int _year;
};
// 或者这样
class Date
{
public:
	void Init(int year)
	{
		mYear = year;
	}
private:
	int mYear;
};
// 其他方式也可以的,主要看公司要求。一般都是加个前缀或者后缀标识区分就行。

4.类的访问限定符及封装

4.1访问限定符

C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

  • 【访问限定符说明】
  • 1. public修饰的成员在类外可以直接被访问
  • 2. protected和private修饰的成员在类外不能直接被访问
  • (此处protected和private是类似,后面继承有区别,现阶段更加喜欢私有private)
  • 3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  • 4. 如果后面没有访问限定符,作用域就到 } 即类结束。
  • 5. class的默认访问权限为private,struct为public(因为struct要兼容C)

  • class的默认访问权限为private(私有)
  • struct为public(公有)
  • 所以如果我们在使用class的时候。可以实例化类,但是如果要访问类中的成员必须加上访问限定符才可以。
  • ❗❗建议:无论关键字是class还是struct 都加上访问限定符。
  • 一般一个类的成员:成员变量都是私有;成员函数都是公有。

【面试题】

问题:C++中struct和class的区别是什么?

解答:

  • C++需要兼容C语言,所以C++中struct可以当成结构体使用。
  • 另外C++中struct还可以用来定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类默认访问权限是private。

注意:在继承和模板参数列表位置,struct和class也有区别,后序给大家介绍。

#pragma once
#include<stdlib.h>
#include<iostream>
using namespace std;
class Date//1.哪种类型的访问限定符取决于class / struct
{
public:
	void Init(int year = 7, int month = 7, int day = 7)
	{
		_year = year;//代码的可读性不高
		_month = month;
		_day = day;
	}
private:

	int _year;
	int _month;
	int _day;
};

int main()
{
	Date s;
	s.Init();
	return 0;
}

4.2封装

【面试题】
面向对象的三大特性:封装、继承、多态。
在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?

解答:

  • 封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
  • 封装本质上是一种管理,让用户更方便使用类。

举例:

  • 比如:对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日常事务。
  • 但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件。
  • 对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的等,用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。
  • 因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。
  • 在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用。

联系

  • 在前面学习操作系统中,我们学习了"管理"的本质是:先描述再组织。实际上 面向对象 的过程就是:先描述再组织。这里的封装就是:描述,把数据的属性信息封装起来。
  • C把数据和方法是分离的。
  • CPP是把数据和方法都放到类里面。
  • CPP的访问限定符取对成员进行限制,想要外界访问的就是公有的,不想要给到外界访问的就是私有的。
  • C++中成员变量一般用私有保护,成员函数大多公有保护,少数私有保护。

🙂感谢大家的阅读,若有错误和不足,欢迎指正。 

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本书为中南大学精品教材立项项目,分为上下两篇共21章,涵盖了面向对象技术中Java开发环境配置、程序设计基础、面向对象原理以及UML的知识。本书使用的开发环境是JDK 1.6+Eclipse 3.3+Rational Rose 2003,逐步引领读者从基础到各个知识点进行学习。全书内容由浅入深,并辅以大量的实例说明,书本阶段性地提供了一些实验指导。 本书提供了所有实例的源代码以及开发过程中用到的软件下载地址,供读者学习参考使用。 本书为学校教学量身定做,供高校面向对象技术相关课程使用,对于缺乏项目实战经验的程序员来说可用于快速积累项目开发经验。 本书是中南大学精品教材建设中的一本特色教材,为高校计算机相关专业提供面向对象技术和UML的讲解。本书采用Java语言进行描述,针对Java技术标准编程进行详细的讲解,以简单通俗易懂的案例,逐步引领读者从基础到各个知识点进行学习。本书涵盖了JavaSE开发环境配置、程序设计基础、面向对象相关技术、常用API、UML基础知识。在章节中穿插了上机习题,并提供了答案,用于对该章内容进行阶段性总结演练。 作者长期从事教学工作,积累了丰富的经验,其“实战教学法”取得了很好的效果。本书适合教学。书中章节安排适当,将习题融于讲解的过程中,教师可以根据情况选用,也可以进行适当增减。 本书的知识体系结构如下所示,遵循了循序渐进的原则,逐步引领读者从基础到各个知识点进行学习。 上篇面向对象技术 第1章Java入门 第2章程序设计基础: 变量及其运算 第3章程序设计基础: 流程控制和数组 第4章实验指导1 第5章、对象和成员 第6章封装 第7章继承和多态 第8章实验指导2 第9章异常处理 第10章Java常用API 第11章Java IO操作 第12章多线程开发 第13章反射技术 第14章实验指导3 下篇UML 第15章UML入门 第16章用例图 第17章图和对象图 第18章实验指导4 第19章顺序图、协作图、状态图和活动图 第20章包图、构件图和部署图 第21章实验指导5 本书提供了全书所有实例的源代码,供读者学习参考使用,所有程序均经过了作者精心的调试。 由于时间仓促和作者水平有限,书中的错误和不妥之处敬请读者批评指正。 有关本书的意见反馈和咨询,读者可在清华大学出版社相关版块中与作者进行交流。 郭克华 2013年11月 目录 上篇面向对象技术 第1章Java入门 1.1认识Java 1.1.1认识编程语言 1.1.2Java的来历 1.1.3Java为什么流行 1.1.4Java的三个版本 1.1.5编程前的准备工作 1.2安装JDK 1.2.1获取JDK 1.2.2安装JDK步骤 1.2.3安装目录介绍 1.2.4环境变量设置 1.3开发第一个Java程序 1.3.1如何编写源代码 1.3.2如何将源代码编译成.class文件 1.3.3如何执行.class文件 1.3.4新手常见错误 1.4用Eclipse开发Java程序 1.4.1Eclipse的概念 1.4.2安装Eclipse 1.4.3如何建立项目 1.4.4如何开发Java程序 1.4.5如何维护项目 1.5小结 第2章程序设计基础:变量及其运算 2.1认识变量 2.1.1变量的定义 2.1.2变量有哪些型 2.2如何使用变量 2.2.1如何使用整型变量 2.2.2如何使用浮点型变量 2.2.3如何使用字符型变量 2.2.4如何使用布尔型变量 2.2.5基本数据型之间的型转换 2.2.6基本数据型和字符串之间的转换 2.2.7变量的作用范围 2.3注释的书写 2.4Java中的运算 2.4.1算术运算 2.4.2赋值运算 2.4.3关系运算 2.4.4逻辑运算 2.4.5运算符的优先级 2.5小结 第3章程序设计基础:流程控制和数组 3.1判断结构 3.1.1为什么需要判断结构 3.1.2if结构 3.1.3switch结构 3.2认识循环结构 3.2.1为什么需要循环结构 3.2.2while循环 3.2.3dowhile循环 3.2.4for循环 3.2.5循环嵌套 3.2.6break和continue 3.3数组 3.3.1为什么需要数组 3.3.2如何定义数组 3.3.3如何使用数组 3.3.4数组的引用性质 3.3.5数组的应用 3.3.6多维数组 3.4小结 第4章实验指导1 4.1关于变量和数据型的实践 4.2流程控制和数组的综合实践 第5章、对象和成员 5.1认识类和对象 5.1.1为什么需要 5.1.2如何定义 5.1.3如何使用实例化对象 5.1.4如何访问对象中的成员变量 5.1.5对象的引用性质 5.2认识成员函数 5.2.1为什么需要函数 5.2.2如何定义和使用成员函数 5.2.3函数参数的传递 5.2.4认识函数重载 5.3认识构造函数 5.3.1为什么需要构造函数 5.3.2如何定义和使用构造函数 5.4静态变量和静态函数 5.4.1为什么需要静态变量 5.4.2静态变量的常见应用 5.4.3认识静态函数 5.4.4静态代码块 5.5小结 第6章封装 6.1使用封装 6.1.1为什么需要封装 6.1.2如何实现封装 6.2使用包 6.2.1为什么需要包 6.2.2如何将放在包中 6.2.3如何访问包中的 6.3使用访问控制修饰符 6.3.1什么是访问控制修饰符 6.3.2访问控制修饰符 6.3.3成员的访问控制修饰符 6.4使用 6.5小结 第7章继承和多态 7.1使用继承 7.1.1为什么需要继承 7.1.2如何实现继承 7.1.3继承的底层本质 7.2成员的覆盖 7.2.1什么是成员覆盖 7.2.2成员覆盖有何作用 7.3使用多态性 7.3.1什么是多态 7.3.2如何使用多态性 7.3.3父子对象的型转换 7.4抽象和接口 7.4.1为什么需要抽象 7.4.2为什么需要接口 7.5其他内容 7.5.1final关键字 7.5.2Object 7.6一些工具的使用 7.6.1将字节码打包发布 7.6.2文档的使用 7.7小结 第8章实验指导2 8.1单例模式的设计 8.1.1需求简介 8.1.2不用单例模式的效果 8.1.3最原始的单例模式 8.1.4首次改进 8.1.5再次改进 8.1.6思考题 8.2利用继承和多态扩充程序功能 8.2.1需求简介 8.2.2实现方法 8.2.3出现的问题 8.2.4改进 8.2.5测试 第9章异常处理 9.1认识异常 9.1.1生活中的异常 9.1.2软件中的异常 9.1.3为什么要处理异常 9.1.4异常机理 9.1.5常见异常 9.2异常的就地捕获 9.2.1为什么要就地捕获 9.2.2如何就地捕获异常 9.2.3如何捕获多种异常 9.2.4用finally保证安全性 9.3异常的向前抛出 9.3.1为什么要向前抛出 9.3.2如何向前抛出 9.4自定义异常 9.4.1为什么需要自定义异常 9.4.2如何自定义异常 9.5小结 第10章Java常用API 10.1数值运算 10.1.1用Math实现数值运算 10.1.2实现随机数 10.2用String进行字符串处理 10.3用StringBuffer进行字符串处理 10.4基本数据型的包装 10.4.1认识包装 10.4.2通过包装进行数据转换 10.5认识Java集合 10.5.1为什么需要集合 10.5.2Java中的集合 10.6使用一维集合 10.6.1认识一维集合 10.6.2使用List集合 10.6.3使用Set集合 10.6.4使用Collections对集合进行处理 10.6.5使用泛型简化集合操作 10.7Java中的二维集合 10.7.1使用Map集合 10.7.2使用Hashtable和Properties 10.8小结 第11章Java IO操作 11.1认识IO操作 11.2用File操作文件 11.2.1认识File 11.2.2使用File操作文件 11.2.3使用File操作目录 11.3字节流的输入输出 11.3.1认识字节流 11.3.2如何读写文件 11.3.3如何读写对象 11.4字符流的输入输出 11.4.1认识字符流 11.4.2如何读写文件 11.4.3如何进行键盘输入 11.5和IO操作相关的其他 11.5.1用RandomAccessFile进行文件读写 11.5.2使用Properties 11.6小结 第12章多线程开发 12.1认识多线程 12.1.1为什么需要多线程 12.1.2继承Thread开发多线程 12.1.3实现Runnable接口开发多线程 12.1.4两种方法有何区别 12.2控制线程运行 12.2.1为什么要控制线程运行 12.2.2传统方法的安全问题 12.2.3如何控制线程的运行 12.3线程同步安全 12.3.1什么是线程同步 12.3.2一个有问题的案例 12.3.3如何解决 12.3.4小心线程死锁 12.4认识定时器 12.4.1为什么需要定时器 12.4.2如何使用定时器 12.5小结 第13章反射技术 13.1为什么要学习反射 13.1.1引入配置文件 13.1.2配置文件遇到的问题 13.2认识Class 13.2.1什么是Class 13.2.2如何获取一个对应的Class对象 13.2.3如何获取中的成员信息 13.3通过反射机制访问对象 13.3.1如何实例化对象 13.3.2如何给成员变量赋值 13.3.3如何调用成员函数 13.4何时使用反射 13.5动态异常处理框架 13.5.1框架功能简介 13.5.2重要技术 13.5.3框架代码编写 13.5.4使用该框架 13.6小结 第14章实验指导3 14.1字符频率统计软件 14.1.1软件功能简介 14.1.2重要技术 14.1.3项目结构 14.1.4代码编写 14.1.5思考题 14.2文本翻译软件 14.2.1软件功能简介 14.2.2重要技术 14.2.3项目结构 14.2.4代码编写 14.2.5思考题 14.3用享元模式优化程序性能 14.3.1为什么需要享元模式 14.3.2重要技术 14.3.3代码编写 14.3.4思考题 下篇UML 第15章UML入门 15.1认识UML 15.1.1为什么需要UML 15.1.2UML的来历 15.2用Rational Rose进行UML建模 15.2.1什么是Rational Rose 15.2.2安装Rational Rose 15.2.3如何使用Rational Rose 15.2.4UML图的种 15.3小结 第16章用例图 16.1认识用例图 16.1.1为什么需要用例图 16.1.2什么是用例图 16.2详解用例图 16.2.1系统边界 16.2.2参与者 16.2.3用例 16.2.4箭头 16.2.5注释 16.2.6用Rational Rose画用例图 16.2.7用例规约 16.3一个案例 16.3.1案例描述 16.3.2画出用例图 16.3.3写出用例描述 16.4小结 第17章图和对象图 17.1认识图 17.1.1为什么需要图 17.1.2什么是图 17.2详解图 17.2.1 17.2.2箭头 17.2.3注释 17.2.4用Rational Rose画图 17.3对象图 17.4小结 第18章实验指导4 18.1用例图练习 18.1.1软件功能简介 18.1.2识别系统中的参与者和用例 18.1.3画出用例图 18.1.4用例描述 18.2图练习 18.2.1练习1: 根据代码画出图 18.2.2练习2: 根据需求构建图 18.3思考题 第19章顺序图、协作图、状态图和活动图 19.1顺序图 19.1.1什么是顺序图 19.1.2详解顺序图 19.1.3用Rational Rose画顺序图 19.2协作图 19.2.1什么是协作图 19.2.2详解协作图 19.2.3用Rational Rose画协作图 19.3状态图 19.3.1什么是状态图 19.3.2详解状态图 19.3.3用Rational Rose画状态图 19.4活动图 19.4.1什么是活动图 19.4.2详解活动图 19.4.3用Rational Rose画活动图 19.5小结 第20章包图、构件图和部署图 20.1包图 20.1.1什么是包图 20.1.2详解包图 20.1.3用Rational Rose画包图 20.2构件图 20.2.1什么是构件图 20.2.2详解构件图 20.2.3用Rational Rose画构件图 20.3部署图 20.3.1什么是部署图 20.3.2详解部署图 20.3.3用Rational Rose画部署图 20.4小结 第21章实验指导5 21.1顺序图、协作图练习 21.1.1功能简介 21.1.2创建顺序图 21.1.3创建协作图 21.2状态图、活动图练习 21.2.1功能简介 21.2.2创建状态图 21.2.3创建活动图 21.3包图、构件图和部署图练习
C+ + Bezier 曲线的构造X 中图法分号: TP302. 4 Bezier 曲线作为一种特殊的参数多项式曲线, 一经问世, 就曾受到CAGD 学术界的广泛重 视. 尽管如今在CAD 领域有许多种不同的自由型曲线和曲面的构造方法, 但使用Bezier 曲线 仍不失为一种重要的备选方案. 例如国内外多种矢量字库的构建, 仍然广泛使用Bezier 曲线技 术. Bezier 曲线的实现方法传统上主要求助于de Casteljau 算法. 但随着计算机硬件技术的不 断进步, 计算机的处理速度越来越快, 算法的高效尽管仍很重要, 但代码的易于维护性和可重 用性即显得日见重要. 本文利用C+ + 面向对象的特性, 将Bezier 曲线的定义和生成建立在矩 阵运算的基础上, 从而使描述和生成Bezier 曲线的代码变得简单明了, 且有着很好的可扩展 性. 1 Bezier 曲线的矩阵表示 记B n= [ Bn0 ( t ) , Bnn ( t ) ] , 其中B n i ( t ) = Ci nt i ( 1- t ) n- i , t I [ 0, 1] . Tn = [ 1 t , t n ] , Vn= b0 b 1 s bn 1 , Mn = m00 m01 , m0n m10 m11 , m1n , , , , mn 0 mn1 , mnn 其中mij = ( - 1) ij * Ci n * Cj i , 且当j > i 时, mij = 0, 则以b0, b 1, ,, bn 为控制顶点的Bezier 曲线 可以表为P( t ) = Tn * Mn * Vn . 2 几个通用模板的定义 为了能够方便地使用计算机来处理上述简便的Bezier 矩阵表达式, 从而大大简化计算机 图形软件的开发, 显然我们首先必须能够方便地使用计算机来处理矩阵和向量等对象, 为此目 的我们利用C+ + 中的最新特征引入了如下向量模板和矩阵模板的概念. 第21 卷 第2 期 江西师范大学学报( 自然科学版) Vol. 21 No. 2 1997 年5 月 JOURNAL OF JIANGXI NORMAL UNIVERSITY May 1997 X 收稿日期: 1997- 01- 20 2. 1 向量模板的定义 template 3class T4 class VectorTemplate { private: int numElement s; T * element s; protected: public: VectorTemplate( void) ; VectorTemlate( int) ; VectorTemplate( VectorTemplate3T4 &vSrc;) ; -VectorTemplate( void) ; T & operator[ ] ( unsigned int index ) { return elements [ index] ; } ; int size( void) { return numElement s; } ; void resize ( int sizeIn) ; VectorTemplate3T4& operator= ( VectorTemplate3T4 & ) ; VectorTemplate3T4& operator= ( T) ; float leng th( void) ; VectorTemplate3T4 &normalize;( void) ; friend T operator * ( VectorTemplate3T4 & v1, VectorT emplate3T4 & v2) ; friend VectorTemplate 3T 4 operator + ( VectorTemplate3T 4 & v1, VectorTemplate3T 4 &v 2) ; friend VectorTemplate3T4 operator-( VectorT emplate3T4 & v1, VectorTemplate3T4 & v2) ; friend VectorTemplate3T4 operator * ( VectorTemplate3T4 & v1, T scalar) ; friend VectorTemplate3T4 operator * ( T scalar, VectorTemplate3T4 & v1) ; VectorTemplate3T4 & operator+ = ( vectorTemplate3T4 & v) ; VectorTemplate3T4 & operator * = ( T scalar) ; VectorTemplate3T4 & operator- = ( VectorTemplate3T4 & v) ; VectorTemplae3T4 cross( VectorT emplate3T4 & v) ; } 在向量模板的定义中, 通过运算符的重载, 使我们能像对待普通的数学运算一样来引述两 个向量或向量与标量之间的四则运算. 例如: 对于两个向量V1、V2 的内积, 只须简单地表示为 V1* V2, 而对于一个标量s 与向量V1 的乘积亦只须记着s* V1, 而丝毫不会引起混淆. 2. 2 矩阵模板的定义 template 3class T4 class Mat rixTemplate { private: int numRow s; int numColumns; 1 28 江西师范大学学报( 自然科学版) 1997 年 VectorTemplate3T4 * element s; Void create( int , int ) ; protected: public: Mat rixTemplate( void) { numRow s= 0; numColumns= 0; elements= NULL; } ; Mat rixTemplate( int size) { create( size, size) ; } ; Mat rixTemplate( int, int ) ; Mat rixTemplate( Mat rixTemplate3T4 & mSrc) ; -Mat rixT emplate( void) ; VectorTemplate3T4& operator[ ] ( int row ) { return elements[ row ] ; } ; int nrows( void) { return numRows; } ; int ncols( void) { return numColumns; } ; void resize( int new-ncols, int new-nrows) ; friend Mat rixT emplate3T4 operator * ( Mat rixTemplate3T4 & , Mat rixTemplate3T4 & ) ; friend VectorTemplate3T4 operator * ( MatrixTemplate3T4 & , VectorTemplate3T4 & ) ; Mat rixTemplate3T4& operator * = ( Mat rixTemplate3T4 & m) { * this= m * ( * this) ; return * this; } ; Mat rixTemplate3T4& operator= ( MatrixT emplate3T4 & ) ; float determinant ( void) ; Mat rixTemplate3T4& t ranslate( VectorTemplate3T4 & ) ; Mat rixTemplate3T4& scale( VectorTemplate3T4 & ) ; Mat rixTemplate3T4& t ranslate( float , float ) ; Mat rixTemplate3T4& scale( f loat, f loat) ; Mat rixTemplate3T4& rotate( f loat ) ; Mat rixTemplate3T4& t ranslate( float , float , f loat) ; Mat rixTemplate3T4& scale( f loat, f loat, float) ; Mat rixTemplate3T4& rotate( f loat , f loat, f loat) ; Mat rixTemplate3T4& setIdent ity( void) ; Mat rixTemplate3T4& ident ity( void) { return set Identity( ) ; } ; } ; typedef Mat rixTemplate3f loat4 Matrix; 在矩阵模板中, 我们不但定义了各种常用的运算, 而且还封装了平移、缩放、旋转等成员函 数, 这一切都是为了使图象的生成和处理变得更简便些. 但仅有这两个当然还不够. 我们的 目的是要生成Bezier 曲线, 然而我们知道, 在计算机表示中曲线是由折线来逼近的, 而折线又 是由线段组成的. 此外, 两点决定一条线段. 因此, 为了一般的表示一条Bezier 曲线, 我们需要 先对点、线段和折线有一个统一的描述, 同时, 这也是为了符合GKS-3D 图形标准. 第2 期 陈国华 C+ + Bezier 曲线的构造 12 9 点的功能无非是用来确定空间的一个坐标, 所以我们不难从向量中来派生一个点, 如: ( 1) 点 Class SplinePoint: public Vector{ public ,, void setCoord( Vector & v) ; void getCoord( Vector & v) ; ,, } 有了点定义, 我们可以把折线看成是由一系列顶点控制确定的, 但为了使这一系列顶 点的排列有一定的顺序, 并且便于索引访问, 我们又不得不增加一个简单的线性表来对之加 以管理. ( 2) 简单表 template 3class T4 class SimpleTable{ private: int curSize; T * * items; ,, public: ,, T & operator[ ] ( int ) ; ,, } ( 3) 折线 class SplinePolyline{ protected: SimpleT able3SplinePoint4 point s; public: SplinePolyline( void) ; SplinePolyline( int np) ; SplinePoint & operator[ ] ( unsigned int index) ; void draw ( ) ; } 3 Bezier 曲线的构造 如上所述, 计算机所表示的曲线实际上只是一条折线, Bezier 曲线也不例外, 只不过根据 用户的精度要求不同增加插值点的个数有所不同而已. 据此, 我们不难从折线来派生我们所 1 30 江西师范大学学报( 自然科学版) 1997 年 要求的Bezier 曲线. class BezCurve: public SplinePolyline { private: int smooth; public: BezCurve( void) { } ; BezCurve( int numPoint In) : SplinePolyline( numPoint In+ 1) { smooth= 5; } void set smooth( int s In) { smooth= s In; } int getsmooth( void) { return smooth; } void draw( void) ; void draw( class SplinePerspective& ) ; } 在上述构造中, 我们缺省地取光滑度smooth= 5, 即在每两个顶点之间加5 个插值点, 其 中令人感兴趣的当然是draw ( ) 例程, 缺省情况下按2 维的要求来绘制Bezier 曲线, 如果给出 适当的透视参数( 由class Spline Perspective 定义) , 则可按透视要求来绘制Bezier 曲线. 4 应用 在以往的基于C 或Pascal 等语言的Bezier 曲线的生成过程中, 往往是一面定义一条Bez-i er 曲线, 然后调用一外部过程来绘制它, 因此涉及复杂的参数传递等问题, 而在此处, 每一条 Bezier 曲线都被定义为知道如何绘制自己了. 因此, 要定义一条Bezier 曲线并实际地画出它, 只须简单地遵循以下几步即可. 第一步: 定义一条Bezier 曲线 BezCurve bezcurve( n) ; 如果欲使该曲线更光滑, 则可进一步设置其光滑度 bezcurve. set smooth( sIn) ; 第二步: 设定n 个顶点的坐标 bezcurve. setCoord( x , y ) 或bezcurve. setCoord( x , y , z ) ; 或bezcurve. setCoord( vec) ; 第三步: 绘制曲线 bezcurve. draw( ) ; 或对空间曲线bezcurve. draw ( proj) ; 即可完成整条曲线的定义和绘制过程. 第2 期 陈国华 C+ + Bezier 曲线的构造 13 1 参 考 文 献 1 Marc Berger. Computer g raphics wit h Pascal. T he Benjamin/ Cummings Pub Inc, 1986. 1~ 340 2 易忠亮. C+ + 矩阵运算与Windows 应用软件. 北京: 清华大学出版社, 1995. 1~ 380 3 罗振东, 廖光裕. 计算机图示学原理和方法. 上海: 复旦大学出版社, 1993. 120~ 140 4 蔡士杰等. 三维图形系统PHIGS 的原理与技术. 南京: 南京大学出版社, 1993. 62~ 89 5 施法中. 计算机辅助几何设计与非均匀有理B 样条. 北京: 北京航空航天大学出版社, 1994. 121~ 173 The Construction of C+ + Bezier Curve Class Chen Guohua ( Department of Comput er Science, Guangdong Inst itut e for Nat ionalities, Guangzhou 510633) Abstract: In this paper, we have used the C+ + OOP feature to encapsulate the procedure of both defining and draw ing of a Bezier curve, so greatly simplifed the programming of draw ing a Bezier curve. Key words: OOP, class, template, Bezier curve ( 上接第120 页) 参 考 文 献 1 刘余善. 实用管理系统工程. 杭州: 浙江人民出版社, 1983. 266~ 268 2 魏国华, 傅家良, 周仲良. 实用运筹学. 上海: 复旦大学出版社, 1987. 363~ 365 3 王俊峰. 确定有批量价格折扣问题的经济订购批量的最大利润法. 系统工程理论与实践, 1996, ( 5) : 60 ~ 63 EOQModels Concerning the Questions of Permissible Shortage and Quantity Discount Wan Baozhen ( Commercial College of Jiangxi Normal University, Nanchang 330027) Abstract: With a study of the improvement on the broadening of sphere of applicat ion and the re-establishment of cost project, the paper presents a new SDEOQ model that is more suitable to the pract ices in the area of product ion and circulat ion under the condit ions of socialist market economy and a discussion about the opt imality of SDEOQ model w ith both it s part ial and whole opt imal solut ions being achieved. Key words: economic order quant ity( EOQ) , permissble shortage, quant ity discount , opt imal-i ty

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐唐思

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值