• 14
  • 14
分享
  • c++笔试题及答案——软件测试圈
  • 恬恬圈 2022-03-10 11:46:36 字数 3811 阅读 1510 收藏 14

1.如何判断一个单链表是有环的?

struct ListNode
{
int key;
ListNode* next;
};
bool check(ListNode* head) //return false : 无环;true: 有环
{
}
答案:一种O(n)的办法就是(搞两个指针,一个每次递增一步,一个每次递增两步,如果有环的话两者必然重合,反之亦然):
bool check(ListNode* head)
{
if (head == NULL) return false;
ListNode *low = head, *fast = head->next;
while (fast != NULL && fast->next != NULL)
{
low = low->next;
fast = fast->next->next;
if (low == fast) return true;
}
return false;
}

2. C++的空类,默认产生哪些类成员函数?

class Empty
{
public:
Empty();                              //缺省构造函数
Empty(const Empty& );             //拷贝构造函数
~Empty();                             //虚构函数
Empty& operator(const Empty& )      //赋值运算符
Empty& operator&();                 //取址运算符
const Empty* operator&() const;     // 取址运算符 const
}

3. const常量与define宏定义的区别

答:(1) 编译器处理方式不同。define宏是在预处理阶段展开,生命周期止于编译期。

只是一个常数、一个命令中的参数,没有实际的存在。

#define常量存在于程序的代码段。const常量是编译运行阶段使用,const常量存在于程序的数据段.

(2)类型和安全检查不同。define宏没有类型,不做任何类型检查,仅仅是展开。

const常量有具体的类型,在编译阶段会执行类型检查。

(3) 存储方式不同。define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。

const常量会在内存中分配(可以是堆中也可以是栈中)

4. 进程和线程的差别?

答:线程是指进程内的一个执行单元,也是进程内的可调度实体.区别:

(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位

(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行

(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.

(4)系统开销:创建撤消进程,系统都要为之分配和回收资源,系统的开销明显大于创建撤消线程

多进程与多线程,两者都可以提高程序的并发度,提高程序运行效率和响应时间。

5. 在C++程序中调用C编译后的函数,为什么要加extern C的声明?

答:因为C++支持函数重载,而C不支持函数重载,函数被C++编译后在库中的名字与C语言的不同。

假设某个函数的原型为:void foo(int x, int y);该函数被C编译器编译后在库中的名字为_foo,

而C++编译器则产生像_foo_int_int之类的名字。 C++提供extern C来解决名字匹配问题

6. 拷贝构造函数相关问题,深拷贝,浅拷贝,临时对象等

答:在C++中,三种对象需要拷贝的情况:一个对象以值传递的方式传入函数体,

 一个对象以值传递的方式从函数返回,一个对象需要通过另外一个对象进行初始化。

执行先父类后子类的构造,对类中每一个数据成员递归地执行成员拷的动作.

深拷贝:如果一个类拥有资源,深拷贝意味着拷贝了资源和指针

浅拷贝:如果对象存在资源,而浅拷贝只是拷贝了指针,没有拷贝资源,

这样使得两个指针指向同一份资源,造成对同一份析构两次,程序崩溃。

临时对象:辅助一个表达式的计算 a + b + c ,或者间接构造的实参,函数返回非引用的时候,

都可能产生临时对象,临时对象生命周期,是单个语句,是右值。

临时对象的开销比局部对象小些。

7. 在main函数执行之前,还会执行什么代码和工作

答:运行全局构造器,全局对象的构造函数会在main函数之前执行

设置栈指针,初始化static静态和global全局变量,即数据段的内容

将未初始化部分的赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL等

将main函数的参数,argc,argv等传递给main函数

8. 静态成员函数能不能同时也是虚函数?

答案是不能。调用静态成员函数不要实例。但调用虚函数需要从一个实例中指向虚函数表的指针以得到函数的地址,因此调用虚函数需要一个实例。两者相互矛盾。

9. TCP/IP建立连接的过程

答:在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。

第一次握手:建立连接时,客户端发送连接请求到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到客户端连接请求,向客户端发送允许连接应答,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的允许连接应答,向服务器发送确认,客户端和服务器进入通信状态,完成三次握手

10. 类成员函数的重载、覆盖和隐藏的区别 

答案: 

成员函数被重载的特征: 

(1)相同的范围(在同一个类中); 

(2)函数名字相同; 

(3)参数不同; 

(4)virtual 关键字可有可无。 

覆盖是指派生类函数覆盖基类函数,特征是: 

(1)不同的范围(分别位于派生类与基类); 

(2)函数名字相同; 

(3)参数相同; 

(4)基类函数必须有virtual 关键字。 

“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下: 

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。 

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

11. 给出算法思路,从10亿个浮点数当中,选出其中最大的10000个。 

思路:先将数据进行分割成数据量小的一些文件,如1000000个数据为一个文件,然后将每个文件数据进行排序,用快速排序法排序,然后使用K路合并法将其合并到一个文件下,取出排序好的最大的10000个数据

12. 读程序

int func(int x)
{
int countx = 0;
char s[64] = { 0 };
while (x)
{
countx++;
x = x&(x - 1);
}
return countx;
}
 
int main()
{
printf("%d\n", func(9999));
}

答案:8

思路:将x 转化为2 进制,看含有的1 的个数。

13. New delete 与malloc free 的联系与区别?

答案:都是在堆(heap)上进行动态的内存操作。用malloc 函数需要指定内存分配的字节数并

且不能初始化对象,new 会自动调用对象的构造函数。delete 会调用对象的destructor,而

free 不会调用对象的destructor.

14.下面的代码有什么问题?

void DoSomeThing(...)
{
char* p;
...
p = malloc(1024); // 分配1K 的空间
if (NULL == p)
return;
...
p = realloc(p, 2048); // 重新分配到2K
if (NULL == p)
return;
...
}

答:

p = malloc(1024); 应该写成: p = (char *) malloc(1024);

没有释放p 的空间,造成内存泄漏。

15.执行结果

void main()
{// test1
char str[] = "world"; cout << sizeof(str) << ": ";
char *p = str; cout << sizeof(p) << ": ";
char i = 10; cout << sizeof(i) << ": ";
void *pp = malloc(10); cout << sizeof(p) << endl;
}

答:6:4:1:4

16. main 主函数执行完毕后,是否可能会再执行一段代码,给出说明?

答:可以用_onexit 注册一个函数,它会在main 之后执行int fn1(void), fn2(void)

int fn1(void)
{
printf("fn1()\n");
return 0;
}
int fn2(void)
{
printf("fn2()\n");
return 0;
}
 
int main()
{
_onexit(fn1);
_onexit(fn2);
printf( "This is executed first.\n" );
}

17.  i最后等于多少?

int i = 1;
int j = i++;
if((i>j++) && (i++ == j)) i+=j;

答:i = 5


文章来源:百度文库

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 背景T-Box是实现汽车车联网的一个关键环节,从起初单纯的实现车辆信息采集,已发展到具有车辆信息监测及信息交互(V2X)、车辆远程控制、安全监测和报警、远程诊断、边缘计算等多种离线和在线的应用功能的载体。为保障T-Box功能的正常运转,对其进行功能测试就尤为重要。T-Box作为“边缘节点”,与车内控制器通过传统总线或车载以太网进行信息交互,与车外TSP(Telematics Service Platform)通过蜂窝基站无线技术进行信息交互。从测试实现的角度,针对T-Box功能测试而言,由于自动化测试所需的“Input仿真”与“Output监测”的闭环存在一定难度,故基本通过手动或半自动化的传...
            14 14 3637
            分享
          •   据报道,测试了很久的iOS16.4更新包含了比之前更多的小功能:新的通话语音隔离功能、照片应用中加入副本相册扩展(包含共享iCloud照片库),还针对iPhone14优化了车祸检测功能。  语音隔离功能是几年前针对FaceTime语音通话开发的,它使用软件算法来更好地隔离外界噪音,让对方能够清楚地听到用户的声音。苹果(160.25,1.32,0.83%)现在要将该功能扩展到电话通话中,对于经常打电话的用户来说,这可能会成为一大福音。  此外,iOS16.4终于要进入“发布候选”阶段。这意味着该系统最早有望在未来一周发布。目前比较受关注的功能包括已经大幅推迟的一系列新的金融产品,包括储蓄账号...
            0 0 991
            分享
          •   埃隆·马斯克周四晚间起诉他十年前参与创立的生成式人工智能公司 OpenAI,此举震惊业界。据最新报道,周五晚间 OpenAI 向员工发送了一份备忘录,驳斥了马斯克的指控,并对其提起诉讼的原因提出了另一种解释。  马斯克在诉讼文件中表示,OpenAI 违背了协议,不再像非营利组织那样开发 ChatGPT 等生成式人工智能产品。他指控该公司现在正在开发软件服务只是为了给微软赚钱,而微软此前向 OpenAI 投资了数十亿美元,并利用 OpenAI 帮助其开发 Copilot 等人工智能产品。  据 CNBC 报道,OpenAI 首席战略官 Jason Kwon 在周五向其在职员工发送了一份备忘录...
            0 0 740
            分享
          • 面试中,针对“用户登录”界面设计测试用例这个题目可以说是非常的耳熟能详了!可能你会说,“用户登录”这个测试对象也有点太简单了吧,我只要找一个用户,让他在界面上输入用户名和密码,然后点击“确认”按钮,验证一下是否登录成功就可以了。的确,这构成了一个最基本、最典型的测试用例,这也是终端用户在使用系统时最典型的 Happy Path 场景。但是作为测试工程师,你的目标是要保证系统在各种应用场景下的功能是符合设计要求的,所以你需要考虑的测试用例就需要更多、更全面,于是你可能会根据“用户登录”功能的需求描述,结合等价类划分和边界值分析方法来设计一系列的测试用例。那什么是等价类划分和边界值分析方法呢?首先...
            14 15 3381
            分享
          • 性能测试工具可以帮助我们构造一些数据和脚本以便于自动执行,除此之外,还有一些监测小工具方便我们了解系统运行情况,包括:系统负载、系统I/O读写、mysql占用情况等。一、系统I/O读写(在web上)(尤其适合搭配jmeter使用)./nmon_x86_64_ubuntu1104 -fT -s 5 -c 100000000000000000000000000000ltest:这次监控记录的标题与生产的文件名称l-s 30:每30秒进行一次数据采集l-c 180:一共采集180次输入命令后,将自动在当前目录生成一个hostname_timeSeries.nmon的文件,如:lhosname为tes...
            1 1 10644
            分享
      • 51testing软件测试圈微信