当前位置: 代码迷 >> 综合 >> 整理笔记-day04
  详细解决方案

整理笔记-day04

热度:28   发布时间:2023-12-06 10:58:22.0

1、哪些操作符能重载

大部分的操作符是可以被重载的,例外的只有“.”、“::”、“?:”和“sizeof”。没有什么非禁止operator?:重载的理由,只不过没有必要而已。另外,expr1?expr2:expr3的重载函数无法保证expr2和expr3中只有一个被执行。
而“sizeof”无法被重载是因为不少内部操作,比如指针加法,都依赖于它。

不能重载的运算符
    * sizeof运算符
    * :: 作用域解析运算符
    * ?: 条件运算符
    * .  直接成员运算符
    * .* 成员指针运算符
    * tpeid
    * const_cast
    * dynamstic_cast
    * reinterpret_cast

    * static_cast
只能通过成员函数进行重载

    * = 赋值运算符
    * () 函数调用运算符
    * [] 下标
    * -> 间接成员运算符

2、下列main()函数执行后的结果是——

int func(){ int i, j, k = 0;for(i = 0, j =- 1;j = 0;i++, j++){k++;}return k;
}
int main(){cout << (func());return 0;
}

对于for(;;)循环体,中间的表达式一般是个判定条件,返回布尔型,表达式j=0,对于int,除了0以外的所有都是true,如if(1)之类的,
所以这里返回false,循环体一次都不执行,因此k++这个语句不执行。

在C语言中,下列代码 执行之后,*p的值为()

void func(int *p){static int num = 4;p = &num;(*p)--;
}
int main(){int i = 5;int *p = &i;func(p);printf("%d", *p);return 0;
}

解析:在函数里,指针p又重新定位成num的地址空间 ,所以在函数中的自减是修改num的值;而当在main函数中的p指针依然指向i的地址空间,在func中没有被修改,那么值不变;

详细分析:

3、 以下程序运行时输入:123456789/ 则程序运行结果是()

#include <stdio.h>
int main()
{int x, y;scanf("%2d%*4s%2d", &x, &y);printf("%d", y - x);return 0;
}

解析:%*4s表示读取一个长度为四个字符的字符串,中间的*表示将读取到的字符串忽略,不赋给变量列表中的变量。

4、设有以下定义,值为5的枚举常量是()。

enum week{sun,mon,tue=3,wed,thu,fri,sat,}w

答案:thu

解析:第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加上1。第3个tue有了指定值为3的元素,以此类推后续值为前一元素加1.

5、假定有类AB,有相应的构造函数定义,能正确执行

AB a(4),b(5),c[3],*p[2]={&a,&b};

语句,请问执行完此语句后共调用该类的构造函数次数为——

解析:

只有给对象分配内存才调用构造函数 AB a(4)定义对象a,调用了带一个参数的构造

AB b(5)跟上面的性质类似,调用了带一个参数的构造

AB c[3]跟上面的性质类似,定义对象数组,调用无参构造3次

AB *p这只是一个指针,没有指向任何空间,妖魔有分配内存,不会调构造

a(4),一个对象a,调用1次构造函数;

b(5),一个对象b,调用1次构造函数;

c[3],三个对象c[0],c[1],c[2],调用3次构造函数;

*p[2],指针数组,其元素分别指向a和b,所以没有调用构造函数。

总共5次。

6、在C语言中,下面能正确进行字符串赋值操作的是()

A.char s[5]={"ABCDE"};

B.char s[5]={'A','B','C','D','E'};

C.char *s; s="ABCDE";

char *s;scanf("%s",s);

解析:

C语言中,字符串必须是以"\0"结尾。在答案A中,s定义为5个元素的字符型数组,即最多能存放5个字符,字符串结尾符"\0"无法存放,故A是错误的;答案B对数组赋值没错,但同A一样,没有字符串结尾符"\0",所以也是错误的;答案D是野指针赋值。

7、下列关于虚函数和函数重载的叙述不正确的是(A)

A.虚函数不是类的成员函数

B.虚函数实现了C++的多态性

C.函数重载允许非成员函数,而虚函数只针对与成员函数

D.函数重载的调用根据参数的个数、序列来确定,而虚函数根据对象确定

解释:

虚函数也是类的成员函数,A说法是不正确的;

虚函数和函数重载都实现了C+=的多态性,但表现形式不一样,函数重载调用根据参数个数、参数类型等进行区分,而虚函数则是根据动态联编来确定调用什么,故BD说法正确

函数重载可以是类的成员函数也可以是非成员函数,比如:

1

2

int fun(int a);

int fun(int a, int b);

这就是非成员重载,虚函数必须是成员函数了,否则就失效了, 所以C对。

对于以下代码,

char* p=new char[100];

说法正确的是()

A.p和new出来的内存都在栈上
B.p和new出来的内存都在堆上
C.p在堆上,new出来的在栈上
D.p在栈上,new出来的在堆上

答案:D