例子问题
问题21:面向对象程序设计
考虑下面的代码:
私有静态类哲人{
私人字符串名称;
私人字符串favoriteSubject;
公共哲学家(字符串n,字符串f) {
name = n;
favoriteSubject = f;
}
字符串getName() {
返回名称;
}
getfavoritsubjject () {
返回favoriteSubject;
}
公共无效说话(){
system . out。println(“Hello, World !我的名字是“+name +”。我最喜欢的主题是“+ favoritsubject”);
}
}
私有静态类Nominalist扩展了哲人{
布尔方济会的;
public Nominalist(字符串n,布尔frank) {
超级(n,“逻辑”);
方济会修士=弗兰克;
}
公共无效说话(){
super.speak ();
如果(方济会修士){
system . out。println(“我是方济会修士”);
其他}{
system . out。println(“我不是方济会修士”);
}
}
字符串(){
如果(方济会修士){
返回“也许是奥卡姆的威廉?....”;
其他}{
“也许是圣Pourçain的杜兰杜斯——可耻的,一个多明尼加的名义主义者!”
}
}
}
如果你想做一个toString ()方法对两哲学家而且唯名论的,使用与每个类的电流相同的输出说话()方法,组织代码的最佳方法是什么?
我有toString()调用类的说()方法。
2有说()方法调用新的toString()方法。
3创建一个新的子类并编写toString ()方法。
3
我
2
我和第三
2
的toString ()方法必须返回字符串值。因此,让这个方法生成当前在中生成的输出是最有意义的说()。然后,你可以说()调用toString ()方法来输出相同的字符串数据。
例子问题1:使用功能分解
给定一个类Thing和代码:
事thingOne thingTwo;
下面的函数调用相当于什么?
thingTwo = thingOne;
运算符= (thingTwo thingOne);
thingOne使用thingTwo的复制构造函数
ostream& Thing::operator=(const things & rhs);
thingTwo。运算符= (thingOne);
以上都不是
thingTwo。运算符= (thingOne);
我们得到的是thing1和thing2已经被创建了,这是一个至关重要的信息。让我们看一下每一个选项
运算符= (thingTwo thingOne);
这行代码毫无意义,而且语法错误。
ostream& Thing::operator=(const things & rhs);
这行代码说要从"Thing"类中访问"operator="方法并将其放到ostream中,这与将thingOne赋值给thingTwo没有任何关系。
当我们遇到复制构造函数的选择时,我们必须记住,复制构造函数只在对象使用to创建另一个对象时使用,例如,我们有一个给定的类Foo:
Foo Foo;
Foo foobar = Foo;
在本例中,我们使用foo来创建foobar。
唯一可行的选择是:
thingTwo.operator = (thingOne);
这行代码意味着thingOne对象被赋值给thingTwo。
例子问题1:识别类层次结构
看看以下流行编程语言的历史:
PHP
Java
objective - c
Python
下列哪项是所有这些语言共有的最接近的祖先?
Smalltalk
艾达
Ruby
C
口齿不清
C
所有这些语言都是基于c的语言。
- Ruby发明于1995年,与PHP同年,因此它不可能影响早期的语言,如Objective-C和Python。
- Lisp至少影响了一种语言,Python,但没有影响其他任何语言。
- Ada直接影响了Java,因为它影响了C语言,所以可以说它是这些其他语言的祖先;然而,正因为如此,艾达并不是最接近的祖先。
- Smalltalk影响了Objective-C,但没有影响这个列表上的其他语言。
一个线索是答案“目标-”C它是C语言的一个严格的超集,添加了面向对象功能。
例子问题1:识别类层次结构
运行以下代码后,字符串kitchen的值是多少?
- 班回家
- {
- 公众:
- 回家(字符串);
- 空白searchhome ();
- int buyhome ();
- 私人:
- 字符串厨房();
- };
- ::家庭(字符串)
- {
- 厨房= c;
- }
- int main ()
- {
- str =“大”;
- 回家(str);
- }
c
“小”
“大”
str
无效
“大”
类定义的第4行中的构造函数是棘手的地方。在构造函数的初始化过程中,我们注意到输入是一个字符串。
下到第10行,在定义构造函数的地方,我们看到一个输入为c(定义为字符串)的构造函数将把kitchen的值设置为c。
最后,查看我们的主代码,我们看到main中的构造函数值为'big',在str中定义。
所以厨房=‘大’。
问题31:面向对象程序设计
将一个函数声明为void和将它声明为int有什么区别?
int函数需要在函数内部声明一个整型变量,而void函数则不需要。
void函数可以有任何返回类型,而int函数只能有一种返回类型。
void声明不期望函数的输出,而int函数声明期望函数的输出是一个整数值。
void函数没有输入,int函数至少有一个整数输入。
没有区别。
void声明不期望函数的输出,而int函数声明期望函数的输出是一个整数值。
函数声明非常重要,因为必须定义函数的返回类型。void函数不需要返回类型,而int函数必须有一个整数值作为返回类型。
问题#301:计算机科学
下面的代码有什么问题?
空白printsometext ()
{
cout < <“印刷文本\ n”;
(int i = 0; < 3;我=我+ 1)
{
我cout < < < <“\ n”
}
返回2;
}
循环格式不正确。
void函数不能返回输出。
字符\n不存在。
在函数声明之后需要分号。
Cout不能输出数字。
void函数不能返回输出。
在创建函数时,选择返回类型是非常重要的。如果你想让你的函数返回一个整数,你可以在你的函数前面加上"int"来表示这个函数期望一个整数输出。在本例中,函数被声明为void,这意味着没有输出。然而,代码指示返回值为2,这与void关键字冲突。要解决这个问题,要么删除return语句,要么将void更改为int。
例子问题2:程序设计
选择循环
想象一下,我想为一家银行写一个代码,询问用户他/她是想取款、存钱还是取款。最好使用哪种类型的循环,以确保用户能够做尽可能多的事务,直到他们按quit结束程序?
一个延伸的循环。
一个无限循环。
一个为循环。
一个而循环。
一个延伸的循环。
在我们的问题中,程序必须至少运行一次,以便将所有选项呈现给用户。由于这个原因,最好的选择是do-while循环,因为该循环中的语句至少执行一次,而退出循环的条件是在循环结束时。在这种情况下,退出条件是如果用户按下quit(在选项至少显示一次之后)。
在这种情况下,while循环可能有效;然而,这并不一定是最明智的选择。这是因为在循环中执行任何操作之前要对条件进行测试。这意味着无论while循环中的内容是什么,都不一定要执行。
对于这个问题,for循环也不是一个好的选择,因为for循环执行的次数是固定的。在这种情况下,我们不知道用户想要做1个事务还是10个事务。因此,for循环不是最好的选择。
无限循环也不是我们想要的,因为它永远运行。在我们的例子中,我们希望代码停止提示用户,并在“quit”之后结束。
例子问题311:计算机科学
使用指针
研究下面的伪代码。
int * var1;
Int foo = 63;
var1 = foo;
var2 = * var1;
var1和var2的值是多少?
Var1被赋值为63
Var2被赋值为63
Var1被分配给foo的内存地址值
Var2被分配给var1的内存地址值
Var1被赋值为63
Var2被分配给var1的内存地址值
Var1被分配给foo的内存地址值。
Var2被赋值为63
Var1被分配给foo的内存地址值。
Var2被赋值为63
指针存储另一个变量的地址。指针是通过命名类型,然后是星号,然后是变量名来声明的。在我们的例子中,var1被声明为一个指向整数的指针:
int * var1;
在接下来的代码中,我们看到一个名为“foo”的整型变量被创建,并被赋值为63。
然后使用地址操作符(&)来获取变量的地址。现在让我们看看下一行代码:
var1 = foo;
这里使用&号来获取foo在内存中的地址。这意味着var1包含foo存储在内存中的地址值。
接下来在代码中,我们有以下语句:
var2 = * var1;
这里使用的是解引用操作符(*)。每当我们想要获取指针所指向的变量的值(而不是地址)时,就使用这个操作符。在本例中,var1存储foo的地址。然而,通过使用解引用操作符,我们可以得到其地址存储在var1中的变量的实际值。在本例中,对var1解引用,我们得到foo的实际值是63。因此,var2 = 63。
问题91:标准的数据结构
二维数组
给定以下初始化的数组:
int第四;
int[][] myArray = {{1,2,3},
{4、5、6},
{7,8,9}};
使用myArray,我如何存储在变量“第四”,数字4?
第四= myArray [0] [1];
第四= myArray [1] [0];
第四= myArray [2] [1];
第四= myArray [1] [1];
第四= myArray [1] [0];
在创建和初始化二维数组时,访问矩阵内项的方法是调用带有行和列的数组(即myArray[row][column])。请记住,数组从0开始,数字4将位于第1行第0列。因此,为了将这个数字保存到变量“fourth”中,我们将执行以下操作:
第四= myArray [1] [0];
*注意:myArray[1][0]和myArray[0][1]不一样。
myArray[1][0] =4,因为它是位于行=1和列= 0的项。
myArray[0][1] =12,因为它是位于行=0和列=1的项。
例子问题2:选择合适的数据结构
库的最佳数据结构是什么?数据以标题和标题的多个副本的形式存在。
ArrayList
数组
散列映射
静态值
散列映射
哈希映射-键是标题,值是副本的数量
哈希映射是(键、值)对的集合。
哈希映射具有O(1)访问权限,因此这将是存储数据的最快和最好的方法。