C++学习(31)

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容器是线程不安全的;

 当容量不够时,vector内部内存扩展方式是翻倍;
 std::bitset不是一个STL容器;
 std::stack默认是用deque实现的;
 std::string中可以存储多个’\0’字符

点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值