第一题
以下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
第二题
不考虑任何编译器优化(如: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,下一个同理;
用图表示: