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 = #
(*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 |
|
这就是非成员重载,虚函数必须是成员函数了,否则就失效了, 所以C对。
对于以下代码,
char* p=new char[100];
说法正确的是()
A.p和new出来的内存都在栈上
B.p和new出来的内存都在堆上
C.p在堆上,new出来的在栈上
D.p在栈上,new出来的在堆上
答案:D