C++每日选择题—Day1

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: C++每日选择题—Day1

第一题

以下C++代码会输出什么?

#include <iostream>
using namespace std;
class A 
{
public:
    A() 
    {}
    ~A() 
    {}
private:
    static int a;
};
int main() {
    cout << sizeof(A) << endl;
    return 0;
}

A:0

B:1

C:4

D:8

答案及解析 B

首先,成员函数不存在于实例化对象 中,其次static定义的静态成员变量不属于任何一个对象,是属于整个类的,也不存在实例化对象中。所以这个类其实啥都没有,记住,什么都没有存的类是默认一个字节的,所以选择B

相关博客:C/C++内存对齐规则(结构体、联合体、类)-CSDN博客

第二题

不考虑任何编译器优化(如:NRVO),下述代码第10行会发生()

#include <stdio.h>
class B
{};
B func(const B& rhs)
{
  return rhs;
}
int main()
{
  B b1, b2;
  b2 = func(b1);  //10
}

A:一次默认构造函数,一次拷贝构造函数,一次析构函数,一次(拷贝赋值运算符)operator=

B:二次拷贝构造函数,一次析构函数

C:一次(拷贝赋值运算符)operator=,一次析构函数

D:一次拷贝构造函数,一次析构函数,一次(拷贝赋值运算符)operator=

答案及解析 D

注意说的是第十行,所以不用考虑B b1,b2;

而第十行,首先是调用函数func,由于是引用传参,不需要拷贝构造,但是在返回值这里需要拷贝一个临时变量tmp,用临时变量tmp来返回,所以b2 = tmp;所以这里就是调用的赋值运算符重载函数,然后tmp调用析构函数,因为这个临时变量他tmp完成它的任务来,就会被销毁;


在这里需要注意的是,拷贝构造函数和赋值运算符重载;

当两个类对象都存在时,= 是赋值运算符重载

当只有一个类对象存在,比如B b3 = b2;这调用的就是拷贝构造函数

第三题

3. 在32位系统中,关于下面程序说法正确的是()

class Item 
{
private:
    char *desc;
    int storage;
public:
    Item()
{
        desc = new char[51];
    }
    void setInfo(char *dsrc, int num) 
{
        strcpy(desc,dsrc);   
        storage = num;
    }
};
int main() 
{
    Item stock;   
    stock.setInfo("pen",20);
    return 0;
}

A:main函数定义了一个stock对象占8个字节

B:storage和desc成员各占4个字节

C:存在内存泄漏的问题

D:存在编译错误

答案及解析 ABC

A:stock是Item这个类的实例化对象,占了8个字节,指针在32位机器上是4字节,int是4字节,通过内存对齐,为8字节; 不懂的可以看这篇博客: C/C++内存对齐规则(结构体、联合体、类)-CSDN博客BB


B:正确,int类型4字节,32位的指针类型为4字节


C:存在内存泄漏,因为我们在构造函数这里开辟了空间,没有释放


D:不存在编译错误

第四题

4. 对静态成员的正确描述是()?


A:静态数据成员要在类外定义和初始化

B:非静态成员函数也可以操作静态数据成员

C:全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区

D:调用静态成员函数时要通过类或对象激活,所以静态成员函数拥有this指针

答案及解析  B C

A:静态成员变量,在类里面声明,在类外面定义;

B:因为静态成员变量,是属于整个类的,所以并不需要this指针,非静态成员函数可以不使用this指针直接用静态成员变量;

C:全局变量,静态变量存在静态区,局部变量存在栈;

D:静态成员函数是没有this指针的,因为也是属于整个类的;

第五题

5. 以下程序打印的两个字符分别是()

#include<stdio.h>
#include<iostream>
using namespace std;
struct object 
{
    char data[3];
};
int main() 
{
    object obj_array[3] = {{'a', 'b', 'c'}, {'d', 'e', 'f'}, {'g', 'h', 'i'}};
    object *cur = obj_array;
    printf("%c %c\n", *(char *)((char *)(cur) + 2), *(char *)(cur + 2));
    return 0;
}

A:c g

B:b d

C:g g

D:g c

答案及解析 A

本题是考查对指针的加整数的考查;

obj_array[3] 这个是存放的字符串的结构体数组,数组每个元素都是字符串;

我们用cur指针指向这个结构体数组的首元素;

我们(char*)cur 是强制类型转换成char类型,目的就是在+2的时候,移动的是两个字节;

所以移动到c位置,(char*) 再强制类型转换一下,是为了解引用的时候取的也是一个char类型,所以就是c,下一个同理;

用图表示:


相关文章
|
2月前
|
C语言 C++
C++:每日选择题--Day3
C++:每日选择题--Day3
|
2月前
|
C++
C++ -- 每日选择题 -- Day2
C++ -- 每日选择题 -- Day2
|
2月前
|
编译器 C语言 C++
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题
32 2
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
|
2月前
|
算法 C语言 C++
从C语言到C++_14(vector的常用函数+相关选择题和OJ题)(中)
从C语言到C++_14(vector的常用函数+相关选择题和OJ题)
59 1
|
2月前
|
算法 编译器 C语言
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(上)
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题
29 3
|
2月前
|
编译器 C语言 C++
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(中)
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题
26 1
|
2月前
|
存储 编译器 C语言
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题(下)
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题
28 0
|
2月前
|
Java 编译器 定位技术
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题(中)
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题
25 0
|
2月前
|
安全 程序员 C语言
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题(上)
从C语言到C++_22(继承)多继承与菱形继承+笔试选择题
25 0
|
2月前
|
存储 算法 C语言
从C语言到C++_14(vector的常用函数+相关选择题和OJ题)(下)
从C语言到C++_14(vector的常用函数+相关选择题和OJ题)
22 0