面向对象程序设计作业易错点
面向对象程序设计作业4:类和对象的基础
1. 结构体类型本身不占用内存空间,结构体变量占用内存空间。T
2. 对于结构数组s
,既可以引用数组的元素s[i]
,也可以引用s[i]
中的结构成员。T
3. 假设结构指针p
已定义并正确赋值,其指向的结构变量有一个成员是int
型的num
,则语句 *p.num = 100;
是错误的。T
*(p).num = 100; p->num;
4. C++程序中,一个类的构造函数可以被重载 一个类的析构函数不可以被重载 T
5. point (*p)[3];point是类名,p为定义指向对象数组的指针 。T
point *p[3];point是类名,p为对象指针数组。T
point (*p)[3];
//这里point是类名,p是指向对象数组的指针
//因为这里的p和*是结合在一起的,是一个指针
point* p[3];
//这里point是类名,p是一个指针数组(有三个元素,每个元素是point对象指针)
//因为[]的优先级大于*的优先级!string name;
int age;//方法 Ⅰ
Student *p[3];//这里的p是指针数组,是一个数组
for(int i=0;i<3;i++){
cin>>name>>age;
p[i] = new Student(name,age);//p[i]是指针
p[i]->AvgScore();
}//方法 Ⅱ
Student *p = new Student[3];//这里的p是指针
for(int i=0;i<3;i++){
cin>>name>>age;
p[i] = Student(name,age);//这里的p[i]是数组中的元素,即对象。
p[i].AvgScore();
}
++p->str
中的++
加在____。A
struct {
int len;
char *str;
} *p;
CSample array[2] = {12};
有如下程序:请写出程序输出结果。
class Test
{
public:
Test(){cout<<"构造函数"<<endl;}
~Test(){cout<<"析构函数"<<endl;}
};
void myfunc(){
Test obj;
}
int main()
{
cout<<"main开始"<<endl;
myfunc();
cout<<"main结束"<<endl;
return 0;
}
面向对象程序设计作业5:构造函数、析构函数、静态成员、友元
静态成员static
同一个类不同成员间可以公用一个变量/函数
即 静态数据成员(用时需要在类体外声明) 静态成员函数
静态成员用以解决同一个类的不同对象之间成员,包括数据成员和函数成员的共享问题。
常成员const
常数据成员的值必须初始化,且不能改变
常成员函数不能修改任何数据成员
类名 const t1; const 类名 t1; void t1() const; const int t1;
常量指针 const int *p = &a p地址可改,指向的值不可改
指针常量 int* const p = &a p地址不可改,指向的值可改
在什么情况下系统会调用拷贝构造函数:(三种情况)
(1)用类的一个对象去初始化另一个对象
(2)当函数的形参是类的对象时(也就是值传递时),如果是引用传递则不会调用
(3)当函数的返回值是类的对象或引用时
MyClass(const MyClass& x);
1. 如果A是B的友元类,那么B的成员函数可以访问A的私有成员。F
2. 常量对象可以使用常量成员函数。T
3. 当用一个对象去初始化同类的另一个对象时,要调用拷贝构造函数。T
4. 对象间赋值将调用拷贝构造函数。F
5. 若new一个对象数组,那么用delete释放时应该写[],否则只delete一个对象(调用一次析构函数)。T
6. 静态成员变量的访问控制权限没有意义,静态成员变量均作为公有成员使用。F
7. 静态成员函数的实现必须在类体外实现,不能在类体内实现。F
8. 常成员函数既可以被常对象调用,也可以被非常对象调用。T
9. 当将一个类S定义为另一个类A的友元类时,类S的所有成员函数都可以直接访问类A的所有成员。T
10.每个对象都有一个指向自身的指针,称为 this 指针,通过使用它来确定其自身的地址。T
11. 在下面有关静态成员函数的描述中,正确的是()。A
12. 对于常成员函数,下面描述正确的是()A
13. 假定MyClass为一个类,则该类的复制构造函数的声明语句为()C
14. 以下对类A的定义,哪个是正确的? B
class A{ private:int v; public:void fun(){} }
class A{ int v; A * next; void fun(){} };
class A{ int v; public: void fun(); }; A::void fun(){}
class A{ int v; public: A next; void fun(){} };
15. 给定以下类声明,哪个成员函数可能改变成员变量data? D
class A {
public:
void f1 (int d);
void f2 (const int &d);
void f3 (int d) const;
private:
int data;
};
16. 设类AA已定义,假设以下语句全部合法,哪些语句会触发调用拷贝构造函数( )。D
AA a, b; //1
AA c(10, 20); //2
AA d(c); //3
AA e = d; //4
17. 不能作为函数重载判断依据的是( )A
18. 对于C++结构体中定义的成员,其隐含的访问权限为( )A
面向对象程序设计作业6:运算符重载
1. 多数运算符可以重载,个别运算符不能重载,运算符重载是通过函数定义实现的。T
2. 对每个可重载的运算符来讲,它既可以重载为友元函数,又可以重载为成员函数,还可以重载为非成员函数。F
3. 对单目运算符重载为友元函数时,可以说明一个形参。而重载为成员函数时,不能显式说明形参。T
4. 重载为成员函数时,参数个数为运算符数目减一。重载为友元函数时,参数个数为运算符数目。T
5. 赋值运算符“ =”只能重载为成员函数。T
6. 重载运算符()、[]、->或者=赋值运算符,运算符重载函数必须声明为类的成员函数。T
7. 下列运算符中,( )运算符不能重载。C
8. 为了能出现在赋值表达式的左右两边,重载的"[]"运算符应定义为:B
9. 能用友元函数重载的运算符是()。A
10. 如何区分自增运算符重载的前置形式和后置形式?B
面向对象程序设计作业7:继承和多态
1. 将构造函数说明为纯虚函数是没有意义的。T
2. 动态绑定是在运行时选定调用的成员函数的。T
3. 因为静态成员函数不能是虚函数,所以它们不能实现多态。T
4. 如果函数的参数是基类对象或基类对象的引用,函数调用时的实参可以是派生类对象。T
5. 在多继承中,派生类的构造函数需要依次调用其基类的构造函数,调用顺序取决于定义派生类时所指定的各基类的顺序。T
6. 派生类中的虚函数,不仅可以覆盖基类的虚函数,还会隐藏基类中同名函数的所有其它重载形式。T
7. 类的组合关系可以用“Has-A”描述;类间的继承与派生关系可以用“Is-A”描述。T
8. 通过基类指针调用基类和派生类中的同名虚函数时,若该指针指向一个基类的对象,那么被调用的是基类的虚函数。T
9. 通过基类引用调用基类和派生类中的同名虚函数时,若该引用引用的是一个基类的对象,那么被调用的是基类的虚函数。T
10.通过基类引用调用基类和派生类中的同名虚函数时,若该引用引用的是一个派生类的对象,那么被调用的是派生类的虚函数。T
11.虚函数既可以在函数说明时定义,也可以在函数实现时定义。F
只能在函数说明时定义
12. 关于动态绑定的下列描述中,( )是错误的。D
13. 多继承是指()。A
14. 下面函数原型声明中,()声明了fun为普通虚函数。C
15. 在创建派生类对象时,构造函数的执行顺序是( )。B
16. 在公有继承的情况下,在派生类中能够访问的基类成员包括 D
17. 下面叙述不正确的是 A
18. 下面关于类的继承与派生的程序,其输出结果是 D
#include<iostream>
using namespace std;
class A
{
public:
A(){cout<<"A";}
};
class B
{
public:
B(){cout<<"B";}
};
class C:public A
{
B b;
public:
C(){cout<<"C";}
};
int main(){
C obj;
return 0;
}
19. 下列有关类型兼容规则的描述中,错误的是:D
20. 以下说法不正确的是(假设在公有派生情况)?A
21. 类定义如下:
class A{
public: virtual void func1( ){ }
void func2( ){ } };
class B:public A{
public: void func1( ) {cout<<”class B func1”<<endl;}
virtual void func2( ) {cout<<”class B func2”<<endl;} };
则下面正确的叙述是( )C