求proxyee-break down一定是核吗最新资源

现在要开发一个系统管理对多種汽车的收费工作。 给出下面的一个基类框架

Car的收费公式为: 载客数*8+重量*2

Truck的收费公式为:重量*5

Bus的收费公式为: 载客数*3

生成上述类并编写主函数

主函数根据输入的信息相应建立Car,Truck或Bus类对象,对于Car给出载客数和重量Truck给出重量,Bus给出载客数假设载客数和重量均为整数

输入格式:第一行输入测试用例数。接着每个测试用例占一行每行给出汽车的基本信息,第一个数据为当前汽车的类型:1为car2为Truck,3为Bus第二个数據为它的编号,接下来Car是载客数和重量Truck要求输入重量,Bus要求输入载客数

要求输出各车的编号和收费。


关键字const用来定义常量如果一个變量被const修饰,那么它的值就不能再被改变我想一定有人有这样的疑问,C语言中不是有#define吗干嘛还要用const呢,我想事物的存在一定有它自己嘚道理所以说const的存在一定有它的合理性,与预编译指令相比const修饰符有以下的优点:

1、预编译指令只是对值进行简单的替换,不能进行類型检查

2、可以保护被修饰的东西防止意外修改,增强程序的健壮性

3、编译器通常不为普通const常量分配存储空间而是将它们保存在符号表中,这使得它成为一个编译期间的常量没有了存储与读内存的操作,使得它的效率也很高

下面我们从几个方面来说一下const的用法:

这兩种写法是一样的,都是表示变量n的值不能被改变了需要注意的是,用const修饰变量时一定要给变脸初始化,否则之后就不能再进行赋值叻

接下来看看const用于修饰常量静态字符串,例如:

如果没有const的修饰我们可能会在后面有意无意的写str[4]=’x’这样的语句,这样会导致对只读內存区域的赋值然后程序会立刻异常终止。有了const这个错误就能在程序被编译的时候就立即检查出来,这就是const的好处让逻辑错误在编譯期被发现。

二、常量指针与指针常量

常量指针是指针指向的内容是常量可以有一下两种定义方式。

需要注意的是一下两点:

1、常量指針说的是不能通过这个指针改变变量的值但是还是可以通过其他的引用来改变变量的值的。

2、常量指针指向的值不能改变但是这并不昰意味着指针本身不能改变,常量指针可以指向其他的地址

指针常量是指指针本身是个常量,不能在指向其他的地址写法如下:

需要紸意的是,指针常量指向的地址不能改变但是地址中保存的数值是可以改变的,可以通过其他指向改地址的指针来修改

区分常量指针囷指针常量的关键就在于星号的位置,我们以星号为分界线如果const在星号的左边,则为常量指针如果const在星号的右边则为指针常量。如果峩们将星号读作‘指针’将const读作‘常量’的话,内容正好符合int const * n;是常量指针,int *const n;是指针常量

是以上两种的结合,指针指向的位置不能改变并且也不能通过这个指针改变变量的值但是依然可以通过其他的普通指针改变变量的值。

根据常量指针与指针常量const修饰函数的參数也是分为三种情况

1、防止修改指针指向的内容

2、防止修改指针指向的地址

指针p1和指针p2指向的地址都不能修改。

如果给以“指针传递”方式的函数返回值加 const 修饰那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针

如下语句将出现编譯错误:

全局变量的作用域是整个文件,我们应该尽量避免使用全局变量因为一旦有一个函数改变了全局变量的值,它也会影响到其他引用这个变量的函数导致除了bug后很难发现,如果一定要用全局变量我们应该尽量的使用const修饰符进行修饰,这样防止不必要的人为修改使用的方法与局部变量是相同的。

1.浅复制与深复制概念

被复制对潒的所有变量都含有与原来的对象相同的值而所有的对其他对象的引用仍然指向原来的对象。换言之浅复制仅仅复制所考虑的对象,洏不复制它所引用的对象

被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象换言之,深复制把要复制的对象所引用的对象都复制了一遍

⑴clone方法将對象复制了一份并返回给调用者。一般而言clone()方法满足:
①对任何的对象x,都有x.clone() !=x//克隆对象与原对象不是同一个对象

⑵Java中对象的克隆

①為了获取对象的一份拷贝我们可以利用Object类的clone()方法。
②在派生类中覆盖基类的clone()方法并声明为public。
④在派生类中实现Cloneable接口

//修改学生2后,不影响学生1的值

①为什么我们在派生类中覆盖Object的clone()方法时,一定要调用super.clone()呢在运行时刻,Object中的clone()识别出你要复制的是哪一个对象然后为此对潒分配空间,并进行对象的复制将原始对象的内容一一复制到新对象的存储空间中。

那应该如何实现深层次的克隆即修改s2的教授不会影响s1的教授?代码改进如下
改进使学生1的Professor不改变(深层次的克隆)

//对引用的对象也进行复制 //学生1的教授不 改变。

3.利用串行化来做深复淛

(主要是为了避免重写比较复杂对象的深复制的clone()方法也可以程序实现断点续传等等功能)
把对象写到流里的过程是串行化(Serilization)过程,但是在Java程序师圈子里又非常形象地称为“冷冻”或者“腌咸菜(picking)”过程;而把对象从流中读出来的并行化(Deserialization)过程则叫做 “解冻”戓者“回鲜(depicking)”过程
应当指出的是,写在流里的是对象的一个拷贝而原对象仍然存在于JVM里面,因此“腌成咸菜”的只是对象的一个拷贝Java咸菜还可以回鲜。
在Java语言里深复制一个对象常常可以先使对象实现Serializable接口,然后把对象(实际上只是对象的一个拷贝)写到一个流里(醃成咸菜)再从流里读出来(把咸菜回鲜),便可以重建对象

这样做的前提是对象以及对象内部所有引用到的对象都是可串行化的,否则就需要仔细考察那些不可串行化的对象或属性可否设成transient,从而将之排除在复制过程之外上例代码改进如下。

Teacher t;//学生1和学生2的引用值嘟是一样的 //学生1的老师不改变

参考资料

 

随机推荐