牛客C++专项 5.24 数组+函数指针+lanbda+union

这篇博客探讨了C++编程中的数组操作,指针用法,函数指针和默认参数,以及lambda表达式。文章通过实例解释了如何遍历数组并打印偶数元素,函数指针的使用,以及C++11中lambda表达式的功能。此外,还讨论了C++的类型安全性和构造函数中调用虚函数的行为。最后,涉及了联合体(union)的使用及其内存布局。
摘要由CSDN通过智能技术生成

1.看如下代码:

int arr[8] = {1,6,3,3,8,0,7,4};
int *p = arr;

若要输出数组中数值为偶数的元素,下列哪些方法可行?

正确答案: A B C   你的答案: A C

A  for( int i=0; i<8; i++)
    if(arr[i] % 2 == 0)
    printf("%d", arr[i]);

B  for( int i=0; i<8; i++)           p指向一个数组,*p是首地址的值,*p相当于arr[0], *p+1就相当于a[0]+1, 而*(p+1)就相当于a[1]
    if(p[i] % 2 == 0)
    printf("%d", p[i]);

C int i=0;
    while(i<8)
   {
      if(*(p+i) % 2 == 0)
      printf("%d", *(p+i));
      i++;
   }

D  int i=0;
    while(i<8)
    {
      if((arr+i) % 2 == 0)
      printf("%d", arr+i);
      i++;
    }

 

2.What will be the output of the following program?(单选)

#include<iostream.h> 

typedef void(*FunPtr)(int);   // 函数指针
int sum(int = 10, int = 20);    //默认参数
void output(int);            //声明函数 
int main()
{
    FunPtr ptr = output;
    (*ptr)(30);         //x=30 y=20
    return 0;
}
int sum(int x, int y)
{
    return(x + y % 20);
}
void output(int x)
{
    cout<< sum(x) << endl;
}

正确答案: B   你的答案: C

A20

B30

C31

D40

函数的默认参数值,即在定义参数的时候同时给它一个初始值。在调用函数的时候,我们可以省略含有默认值的参数。也就是说,如果用户指定了参数值,则使用用户指定的值,否则使用默认参数的值。

 

3.若有“ float a[3]={1.5,2.5,3.5},*pa=a;*(pa++)*=3; ”,则 *pa 的值是()。

正确答案: B   你的答案: 空

A1.5

B2.5

C3.5

D4.5

*pa=a[0]    *(pa++)=a[0]  a[0]*=3,则啊a[0]=4.5 这时*pa为自加后的值即a[1]

 

4.以下代码的输出为:

struct A {
  A() { std::cout << "A"; }
};
struct B {
  B() { std::cout << "B"; }
};

class C {
 public:
  C() : a(), b() { std::cout << "C"; }

 private:
  B b;                 //注意声明顺序
  A a;
};

int main()
{
    C();             //调用顺序取决于声明顺序,而不是初始化列表的声明顺序
}

正确答案: C   你的答案: C

ABC

CBA

BAC

ACB

 

5.以下程序输出结果是____

class A
{
  public:
    A ():m_iVal(0){test();}       //构造函数中调用虚函数,虚函数表现为该类中虚函数的行为,即在父            
                              //类构造函数中调用虚函数,虚函数的表现就是父类定义的函数的表现。
    virtual void func() { std::cout<<m_iVal<<‘ ’;}
    void test(){func();}
  public:
      int m_iVal;
};
class B : public A
{
  public:
    B(){test();}
    virtual void func()
    {
      ++m_iVal;
      std::cout<<m_iVal<<‘ ’;
      }
};
int main(int argc ,char* argv[])
{
  A*p = new B;       //先调用A类的构造函数,然后调用B类的构造函数
  p->test();
  return 0;
}

正确答案: C   你的答案: 空

A 1 0

B 0 1

C 0 1 2

D 2 1 0

E 不可预期

F 以上都不对

B 继承自 A, 先 A 构造函数,输出 0 ,然后 B 构造函数, B 的 test 继承自 A ,然后找 func 函数找到 B 自己的,所以输出 1 ,然后 p->test() 再执行一次,输出 2

在《C++ Primer》556页中讨论了构造函数和析构函数中调用虚函数的效应,得出的结果是:在构造或析构函数中调用虚函数会执行与之所属类型相对应的虚函数版本。

 

6.请问以下说法,哪个是正确的:

正确答案: C   你的答案: C

A每个类都有一个无参数的构造函数。

B每个类都有一个拷贝构造的函数。

C每个类能有多个构造函数。

D每个类能有多个析构函数。

A:当定义了有参数的构造函数时,编译器不会提供无参数的默认构造函数,这时如果自己不定义,类就没有无参数的构造函数。

B:拷贝构造函数可以定义为删除的,就是没有,不允许拷贝,标准库中IO流类是不允许拷贝的。

C:正确,构造函数可以有多个。

D:析构函数最多只能有一个,没有析构函数的类是无法定义对象的。

 

7.下面是对s的初始化,其中不正确的是(        )

正确答案: D   你的答案: A

A char s[5]={"abc"};      会自己拆成B的形式

B char s[5]={'a','b','c'};

C char s[5]=" ";           会用/0结束符填充

D char s[5]="abcdef";     越界,长度不足,会自动截取5个字符,因为这样就没有/0

 

8.c++11中提供了lambda特征,语法为
[=] (int x) mutable throw() -> int
{
// 函數內容
int n = x + y;
return n;
}
请问以下哪些正确

正确答案: A B C D   你的答案: B C D

A  lambda常用于封装传给算法的数行简短代码,或是用于解决重复代码的问题

B  []表示不捕获任何外部变量,[=]表示通过拷贝捕获所有外部变量

C  (int x)表示此lambda需要传入一个int参数

D  lambda在c++14后开始可以支持泛型

C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。

 

9.定义数组int A[6][9],若将其作为参数传入方法中,则对应的形参可以定义为()

正确答案: A D   你的答案: A D

A int(*s)[9]              二维数组指针,指向大小为9的数组 

B int *s[9]                指针数组,一个数组里面存放的元素是指针

C int D[6][]

D int D[][9]                编译器会忽略数组第一维的长度,所以参数数组中第一维的长度可以省略,第二维不可以。

 

 

10.X定义如下,若存在X a; a.x=0x11223344;则a.y[1]的值可能为()
union X{
    int x;
    char y[4]; 
};

正确答案: B C   你的答案: D

A11

B22

C33

D44

联合体采用的是共享同一内存地址,且对齐,,int型为4个字节,char为1个字节,且大小为4,则该联合体一共占用4个字节的空间

而对于int型赋值之后,即4个字节的空间上已经有了内容。

大端:低字节在高地址,0x44,0x33,0x22,0x11

小端:高字节在高地址,0x11,0x22,0x33,0x44

 

11.C++是不是类型安全的?

正确答案: B   你的答案: A

A是

B不是

类型之间可以进行强制转换 表示类型不安全

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值