c++ 基础三

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

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

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

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

而“sizeof”无法被重载是因为不少内部操作,比如指针加法,都依赖于它。

全局变量和static修饰的局部变量默认初始化为 0 。因为全局变量和static静态局部变量存储在静态数据区。在静态数据区,内存中所有的字节默认值都是 0x00。

以下程序统计给定输入中每个大写字母的出现次数(不需要检查输入合法性)

复制代码

1

2

3

4

5

6

7

8

void AlphabetCounting(char a[],int n){

  int count[26] = {}, i, kind = 10;

  for(i = 0;i < n;++i) (1);

  for(i = 0;i < 26;++i){

    if(++kind > 1) putchar(';');

    printf("%c=%d", (2));

   }

}

以下能补全程序,正确功能的选项是()

正确答案: D   你的答案: D (正确)

++count[a[i]-'Z'];'Z'-i,count['Z'-i]

++count['A'-a[i]];'A'+i,count[i]

++count[i];i,count[i]

++count['Z'-a[i]];'Z'-i,count[i]

++count[a[i]];'A'+i,count[a[i]]

备注:若参与运算的数据类型不同,则首先应该转化成同一类型的数据,转化按照精度增加或者不变的方向进行,以保证精度不会降低。

字符集为每个字符分配了唯一的编号,每个字符除了用它本身的实体表示外,还可以用转义字符来表示

转义字符以\开始,如果是\x(注意是小写,C语言是区分大小写的)开头,后面接16进制数,如果以\开头,后面接八进制数。

转移字符表示的数据范围有限,因此对\x开头的 ,只能是\xxx(后面两位表数据)这种格式的,意思是只能接两位数据,最大值为\x7f

对\开头的,后面可以接三位数据,即\xxx(后三位均为数),最大值为\177

另外,还有其他几个常见的转义字符,

\t ,\n,\a,\b,\r,\f,\v

下面程序运行结果为()

1

2

3

4

5

void main() {

    char c = 'a'

    if ('a' < c <= 'z'printf ("Low”);

    else printf("UP");

}

正确答案: A   你的答案: D (错误)

LOW

UP

LOWUP

程序语法错误

【解释】关系运算符具有左结合性,所以表达式(’a'<c<=’z’)将先求’a'<c的值,即为

0(假),再求0<=’z’的值,即为1(真),所以执行if后面的语句printf("LOW");故正确

答案为A。

#include <iostream>       

#include <vector>

using namespace std;

int main(void)

{

    vector<int>array;

    array.push_back(100);

    array.push_back(300);

    array.push_back(300);

    array.push_back(300);

    array.push_back(300);

    array.push_back(500);

    vector<int>::iterator itor;

    for(itor=array.begin();itor!=array.end();itor++)

    {

        if(*itor==300)

        {

            itor=array.erase(itor);

        }

    }

    for(itor=array.begin();itor!=array.end();itor++)

    {

            cout<<*itor<<"";

    }

  return 0;

}

下面这个代码输出的是()

正确答案: C   你的答案: E (错误)

100 300 300 300  300 500

100 3OO 300 300 500

100 300 300 500

100 300 500

100 500

程序错误

vector::erase():从指定容器删除指定位置的元素或某段范围内的元素
vector::erase()方法有两种重载形式
如下:
iterator erase(   iterator _Where);
iterator erase(   iterator _First,   iterator _Last);
如果是删除指定位置的元素时:
返回值是一个迭代器,指向删除元素下一个元素;

如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;

在本题中,当 *itor==300成立时,删除第一个值为300的元素,同时itor指向下一个元素(即是第二个值为300的元素),

                            在for(;;itor++)执行itor,itor指向第三个值为300的元素,进入下一个循环

         进入循环满足*itor==300,重复上面的过程,执行完循环,itor执行值为500的元素。

所有整个过程中,只删除了2个值为300的元素。

下列格式控制符,既可以用于输入,又可以用于输出的是()

正确答案: A   你的答案: D (错误)

setbase

setfill

setprecision

setw

setw(n)用法: 通俗地讲就是预设宽度
   如 cout<<setw(5)<<255<<endl;
   结果是:
   (空格)(空格)255
   ▲setfill(char c) 用法 : 就是在预设宽度中如果已存在没用完的宽度大小,则用设置的字符c填充
   如 cout<<setfill('@')<<setw<<255<<endl;
   结果是:
   @@255
   ▲setbase(int n) : 将数字转换为 n 进制.
   如 cout<<setbase(8)<<setw(5)<<255<<endl;
    cout<<setbase(10)<<setw(5)<<255<<endl;
    cout<<setbase(16)<<255<<endl;
   结果是:
   (空格)(空格)377
   (空格)(空格) 255
   (空格)(空格) ff
   ▲ setprecision用法
   使用setprecision(n)可控制输出流显示浮点数的数字个数。C++默认的流输出数值有效位是6。
   如果setprecision(n)与setiosflags(ios::fixed)合用,可以控制小数点右边的数字个数。setiosflags(ios::fixed)是用定点方式表示实数。
   如果与setiosnags(ios::scientific)合用, 可以控制指数表示法的小数位数。setiosflags(ios::scientific)是用指数方式表示实数。
   例如,下面的代码分别用浮点、定点和指数方式表示一个实数:

#include <iostream> 

#include <iomanip> 

 

int main()

{

    double amount = 22.0/7;

 

    cout << amount << endl;

    cout << setprecision(0) << amount << endl

           << setprecision(1) << amount << endl

           << setprecision(2) << amount << endl

           << setprecision(3) << amount << endl

           << setprecision(4) << amount << endl;

 

    cout << setiosflags(ios::fixed);

    cout << setprecision(8) << amount << endl;

    cout << setiosflags(ios::scientific) << amount <<endl;

    cout <<setprecision(6); //重新设置成原默认设置 

 

    return 0;

}

   运行结果为:
   3.14286
   3
   3
   3.1
   3.14
   3.143
   3.14285714
   3.14285714e+00

在上下文及头文件均正常的情况下,以下代码打印的结果是(假设运行在 64 位计算机上):

1

2

3

4

5

6

7

8

struct st_t {

    int status;

    short *pdata;

    char errstr[32];

};

st_t st[16];

char *p = (char *)(st[2].esstr + 32);

printf("%d", (p - (char *)(st)));

正确答案: D   你的答案: C (错误)

32

120

114

144

根据字节对齐,在64位系统下struct st_t 结构体占用的字节为48个。

struct st_t {

int status;  //占用8个(后面的4个为对齐位)

short *pdata;//占用8个

char errstr[32];//占用32个

};

char *p=(char *)(st[2].esstr+32),p实际指向了st[3]

则p-(char *)(st)),即为&st[3]-&st[0],占用空间为3个结构体的大小,即3*48=144,选D

下面哪些函数不能被声明为虚函数(      )

正确答案: A B C D   你的答案: A B D (错误)

构造函数

静态成员函数

内联函数

友元函数

以上几类函数都不可声明为虚函数:

构造函数:虚函数是运行时绑定,需要对象,所以要先调用构造函数

静态成员函数:只有一份大家共享

内联函数:编译时就展开,而虚函数是运行时绑定

友元函数:友元函数不能被继承,所以不存在虚函数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值