1.
#include<iostream>
#include<string.h>
using namespace std;
int main() {
int n;
chary[10]="ntse";
char *x=y;
cout<<*x<<endl;//打印n
cout<<strlen(x)<<endl;//打印4
*x=y[n];//*x=y[4]=’\0’,即把x指向的字符串首元素改为\0,
cout<<*x<<endl;
x++;//x指向第二个字符t
printf("x=%s\n",x);//打印x=tse
printf("y=%s\n",y);//y遇到第一个字符就是‘\0’,所有输出为空
return 0;
}
2.
#include<iostream>
#include<string.h>
using namespace std;
int main() {
int s=0,n;
for(n=0;n<4;n++){
switch(n) {
default:s+=4;
case 1:s+=1;
case 2:s+=2;
case 3:s+=3;
}
}
cout<<s<<endl;
return 0;
}
分析:在switch-case语句中,多个case可以共用一条执行语句,如:
case 常量表达式1:
case 常量表达式2:
case 常量表达式3:
语句;
break;
由此可以看出case语句的作用:
case后面的常量表达式实际上只起语句标号作用,而不起条件判断作用,即“只是开始执行处的入口标号”。
因此,一旦与switch后面圆括号中表达式的值匹配,就从此标号处开始执行;
而且执行完一个case后面的语句后,若没遇到break语句,就自动进入下一个case继续执行,而不再判断是否与之匹配,直到遇到break语句才停止执行,退出switch语句。
因此,若想执行一个case分之后立即跳出switch语句,就必须在此分支的最后添加一个break语句。
3.this只能在成员函数中使用。
全局函数,静态函数都不能使用this。
类中的非静态函数默认是有this指针的,表明该类的对象所有,静态函数不属于任何类的对象,没有this指针,由类直接调用。
4.(1)抽象类中至少存在一个纯虚函数;存在纯虚函数的类一定是抽象类。存在纯虚函数是成为抽象类的充要条件。
(2)抽象类之所以不能被实例化,是因为它里面是抽象方法,实例化对象调用其里面的方法没有意义,我们需要做的就是覆写掉里面的抽象方法。 而这个抽象方法其实就是纯虚函数,通过派生类来override纯虚函数,定义N个方
(3)使用纯虚函数的意义是在很多情况下,基类本身生成对象是不合情理的。
1)、为了方便使用 多态 特性,我们常常需要在基类中定义虚函数。
2)、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀 等子类,但动物本身生成对象明显不合常理。
5.
#include<iostream>
#include<string.h>
using namespace std;
char fun(char *c) {
if(*c<='Z'&& *c>='A')
*c-='A'-'a';
return *c;
}
int main() {
char s[81],*p=s;
gets(s);
while(*p) {
*p=fun(p);
putchar(*p);
p++;
}
cout<<endl;
return 0;
}
分析:gets()函数用来从标准输入设备(键盘)读取字符串直到回车结束,但回车符不属于这个字符串。其调用格式为:gets(s);
其中s为字符串变量(字符串数组名或字符串指针)。
gets(s)函数与scanf("%s", s)相似,但不完全相同;使用scanf("%s", s),函数输入字符串时存在一个问题,就是如果输入了空格会认为输入字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串,直到回车为止。
6.
#include<iostream>
#include<string.h>
using namespace std;
char *f(char *str,char ch) {
char *it1=str;
char *it2=str;
while(*it2!='\0'){
while(*it2==ch){
it2++;
}
*it1++=*it2++;
}
*it1='\0';
return str;
}
int main() {
char *a=newchar[10];
strcpy(a,"abcdcccd");
cout<<f(a,'c');
return 0;
}
分析:首先指针a和指针it1,it2都指向“abcdcccd\0”,然后第一次循环,it2和it1都自增,指向下一位, 第二次循环,it2和it1也同时自增,指向下一位, 第三次循环,it2='c',所以it2指向下一位,it1不变第四次循环,将it2指向的字母'd'取出,赋值给it1指向的'c',用d覆盖c,且it2和it1分别指向下一位,即it2指向c,it1指向d, 第五次循环,it2指向c,所以it2指向下一位,it1不变 第六次循环,和第五次一样 第七次循环,和第四次一样,it2指向d,所以it1的位置赋值d,且it2和it1分别指向下一位最后一次,输出指针a,就得到了“abddcccd” 把图画出来就清晰多了。关键是要清楚*it1++=*it2++; 是取出it2指向的值赋给it1指向的值,且两个指针各自自增,再分别指向下一位,然后搞清楚逻辑关系就好了。
7.指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用的指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。
指针VS.引用
相同点:
1). 都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。
区别:
1). 指针是一个实体,而引用仅是个别名;
2). 引用使用时无需解引用(*),指针需要解引用;
3). 引用只能在定义时被初始化一次,之后不可变;指针可变;
4). 引用没有 const,指针有 const;
5). 引用不能为空,指针可以为空;
6). “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
7). 指针和引用的自增(++)运算意义不一样;
8).从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。
8.下列哪个选项可以争取描述sizeof(double)?(A)
A一个整型表达式 B一个双精度表达式
C一个不合法的表达式 D一种函数调用
sizeof是C语言中的一个操作符(operator),不是函数调用,简单的说其作用就是返回一个对象或者类型所占的内存字节数。由于结果是无符号整数,因此可以把它看作是无符号整型表达式。
9.关于STL的描述:
STL容器是线程不安全的;