牛客网C++专项题目整理(1)

1. 若有定义语句:char s[3][10],(*k)[3],*p;则以下赋值语句错误的是

1.p = s;

2.p = k;

3.p = s[0]; 

4.k = s;

答案:124

char s[3][10]    s 是数组指针,类型为char (*)[3],所指向的每个数组长度为10;

char (*k)[3]    k是一个数组指针,类型也为 char (*)[3],但是所指向的每个数组的长度未知;

char *p    p是一个char*类型的指针

在没有强制类型转换的情况下,只有类型完全相同的指针才能相互复制。所以124是无法赋值的

s[0]是第一行数组的首元素地址,s[0]与s[0][0]相等,可以给char*类型的指针赋值。

2.函数即可以嵌套定义,又可以嵌套调用。请问这句话的说法是正确的吗?

错误,函数不可以嵌套定义,但可以嵌套调用

不过lambda表达式可以嵌套定义

3. 什么函数不能声明为虚函数?

A静态成员函数

B内联函数

C构造函数

D析构函数

答案:ABC

B 内联函数目的是在代码中直接展开(编译期),而虚函数是为了继承后能动态绑定执行自己的动作(动态绑定),因此本质是矛盾的,因此即使内联函数声明为虚函数,编译器遇到这种情况是不会进行inline展开的,而是当作普通函数来处理。因此声明了虚函数不能实现内敛的,即内敛函数可以声明为虚函数,但是毫无了内联的意义
作者:乖,让我摸摸头
链接:牛客网公司真题_免费模拟题库_企业面试|笔试真题
来源:牛客网

C 虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数
作者:v_xchen_v
链接:牛客网公司真题_免费模拟题库_企业面试|笔试真题
来源:牛客网

4. 

void Func(char str_arg[100]){

    printf("%d\n", sizeof(str_arg));

}

int main(void){

    char str[] = "Hello";

    printf("%d\n", sizeof(str));

    printf("%d\n", strlen(str));

    char*p = str;

    printf("%d\n", sizeof(p));

    Func(str);

}

32位系统下下面程序的输出结果为多少?

答案: 6544

数组在函数的参数中会退化成指针,再求长度就是4字节

5. 若变量已正确定义,要求程序段完成求5!的计算,不能完成此操作的程序段是()

Afor(i=1,p=1;i<=5;i++) p*=i;

Bfor(i=1;i<=5;i++){ p=1; p*=i;}

Ci=1;p=1;while(i<=5){p*=i; i++;}

Di=1;p=1;do{p*=i; i++; }while(i<=5);

答案:B

在循环中每次p都被设置成1,最后得到的是5

6 类B是类A的公有派生类,类A和类B中都定义了虚函数func(),p是一个指向类A对象的指针,则p->A::func()将()?

A调用类B中函数func()

B即调用类A中函数,也调用类B中的函数

C调用类A中函数func()

D根据p所指的对象类型而确定调用类A中或类B中的函数func()

答案:C 加了作用域就是A中的函数

父类指针如果指向的是子类对象,那么调用虚函数就是子类的虚函数,因为虚函数表上父类的虚函数被覆盖了。如果指向父类对象,调用虚函数将会调用父类的虚函数。

7 并发编程中通常会遇到三个问题:原子性问题,可见性问题,有序性问题, java/C/C++中volatile关键字可以保证并发编程中的()

A原子性, 可见性

B可见性,有序性

C原子性,有序性

D原子性, 可见性,有序性

答案:B

  • 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。(实现可见性)
  • 禁止进行指令重排序。(实现有序性)
  • volatile 只能保证对单次读/写的原子性。i++ 这种操作不能保证原子性。

作者:羽杰
链接:https://www.jianshu.com/p/ccfe24b63d87
来源:简书

8 对于代码段

1

2

t=0;

while (printf("*")) {t++; if (t<3) break;}

下面描述正确的是()

A其中循环控制表达式与0等价

B其中循环控制表达式与’0’等价

C其中循环控制表达式是不合法的

D以上说法都不对

答案B printf(“*”)返回的是字符的个数,为1(真)

scanf和printf都是有返回值的

scanf:返回值为参数的个数,输入不规范返回的是0,ctrl+z返回EOF

printf:返回输出的字符的个数

9 下列程序执行后的输出结果是 __________

1

2

3

4

5

6

7

8

9

10

11

12

#include <stdio.h>

void func(int *a, int b[]) { b[0] = *a + 6; }

main() {

    int a, b[5];

    a = 0;

    b[0] = 3;

    func(&a, b);

    printf("%d\n", b[0]);

}

A6

B7

C8

D9

答案 A  0+6,与b[0]原本的值无关

10 

设有如下定义:

1

2

3

4

5

6

struct ss

{

    char name[10];

    int age;

    char sex;

} std[3], *p = std;

下面各输入语句中错误的是____________

Ascanf("%d", &(*p).age);

Bscanf("%s", &std.name);

Cscanf("%c", &std[0].sex);

Dscanf("%c", &(p->sex));

答案 B 因为std.name是一个数组,而%s应该直接用于数组名,不需要再取地址。正确的写法应该是scanf("%s", &std[0].name);

<think>好的,用户现在需要准备C++面试,想要整理一些面试题。首先,我需要确定用户的基础水平和面试的岗位要求。如果是初级职位,可能更侧重基础语法和常见概念;中高级可能涉及更深的内存管理、多线程、设计模式等。不过用户没有明确说明,所以应该覆盖全面,包括基础、进阶和高级题目。 接着,回想用户之前的提问是关于C++文件操作和代码组织,可能用户对C++有一定了解,但需要系统复习。所以面试题整理应该结构清晰,分门别类,涵盖常见考点。 用户可能希望问题覆盖广泛,并且有简要的答案提示,方便复习。但要注意不要过于冗长,每个问题点到为止,重点突出。另外,面试中常考的项目经验、设计题、算法题也需要提及,但用户可能更关注语言特性。 需要检查是否有遗漏的重要主题,比如C++11之后的新特性、智能指针、移动语义、多态实现、虚函数机制、STL容器等。这些都是常见的面试点。此外,内存管理、const用法、static关键字、指针和引用的区别等基础问题也很重要。 还要考虑用户可能需要一些实战题目或编程题的例子,比如手写单例模式、字符串操作、链表实现等。同时,编译链接过程、头文件作用、防止重复包含的方法也是常问的。 最后,应该给出一些准备建议,比如结合项目经验、刷题平台、书籍推荐等,帮助用户系统准备。确保回答结构清晰,层次分明,便于用户复习。</think>以下是针对C++面试的常见问题整理,覆盖**基础语法、内存管理、面向对象、STL、多线程、设计模式**等核心领域,帮助你系统复习: --- ### 一、基础语法与特性 1. **指针与引用的区别** - 指针可以重新指向,引用是别名且不可变;引用必须初始化,指针可以为空。 2. **`const` 关键字的用法** - 修饰变量(常量)、指针(`const int*` vs `int* const`)、成员函数(不修改对象状态)。 3. **`static` 的作用** - 修饰局部变量(生命周期延长)、类成员(共享)、全局变量/函数(限制作用域)。 4. **C++11 新特性** - 自动类型推导(`auto`)、范围`for`循环、`nullptr`、右值引用与移动语义、`Lambda`表达式。 --- ### 二、内存管理 1. **堆(Heap)与栈(Stack)的区别** - 栈自动分配/释放,大小固定;堆手动管理,灵活但需防内存泄漏。 2. **`new/delete` 和 `malloc/free` 的区别** - `new`会调用构造函数,返回类型指针;`malloc`仅分配内存,返回`void*`。 3. **内存泄漏的检测与避免** - 工具:Valgrind、智能指针(`shared_ptr`、`unique_ptr`)。 4. **智能指针的实现原理** - `shared_ptr`引用计数;`unique_ptr`独占所有权;`weak_ptr`解决循环引用。 --- ### 三、面向对象(OOP) 1. **虚函数与多态的实现原理** - 虚函数表(vtable)、动态绑定(运行时决议)。 2. **虚析构函数的作用** - 确保派生类对象被正确释放,避免内存泄漏。 3. **纯虚函数与抽象类** - 纯虚函数定义接口(`virtual void func() = 0;`),抽象类不可实例化。 4. **多重继承的菱形问题** - 虚继承(`virtual`关键字)解决重复基类成员的问题。 --- ### 四、STL(标准模板库) 1. **`vector` 的底层实现与扩容机制** - 动态数组,扩容时通常以2倍大小重新分配内存。 2. **`map` 与 `unordered_map` 的区别** - `map`基于红黑树(有序),`unordered_map`基于哈希表(查找O(1))。 3. **迭代器失效场景** - `vector`插入/删除元素可能导致迭代器失效;`map`删除元素仅影响当前迭代器。 4. **STL 中的仿函数(Functor)** - 重载`operator()`的类对象,用于自定义算法行为(如排序规则)。 --- ### 五、多线程与并发 1. **线程同步的方式** - 互斥锁(`mutex`)、条件变量(`condition_variable`)、原子操作(`atomic`)。 2. **死锁的产生条件与避免** - 互斥、请求与保持、不可剥夺、循环等待;使用锁顺序、`std::lock()`一次锁多个。 3. **`volatile` 的作用** - 禁止编译器优化(如变量缓存),常用于多线程或硬件寄存器访问。 4. **C++11 线程库的使用** - `std::thread`、`std::async`、`std::future`等。 --- ### 六、设计模式与编程题 1. **手写单例模式(线程安全)** ```cpp class Singleton { public: static Singleton& getInstance() { static Singleton instance; // C++11保证线程安全 return instance; } Singleton(const Singleton&) = delete; // 禁止拷贝 Singleton& operator=(const Singleton&) = delete; private: Singleton() = default; }; ``` 2. **实现一个线程安全的观察者模式** - 使用`std::mutex`保护观察者列表,异步通知避免阻塞。 3. **反转链表、二叉树遍历等算法题** - 需熟悉指针操作与递归/迭代实现。 --- ### 七、项目与实战 1. **项目中遇到的C++难点与解决方式** - 提前准备一个技术挑战案例(如性能优化、内存泄漏排查)。 2. **如何设计一个高性能的C++程序?** - 减少拷贝、使用移动语义、避免虚函数频繁调用、合理选择数据结构。 3. **熟悉哪些C++开源框架或库?** - 如Boost、Qt、OpenCV等,结合应聘岗位选择回答。 --- ### 八、编译与底层 1. **C++程序编译过程** - 预处理→编译→汇编→链接,`.h`和`.cpp`的作用。 2. **虚函数表(vtable)的内存布局** - 对象头部包含指向vtable的指针,vtable中存储虚函数地址。 3. **`extern "C"` 的作用** - 禁止C++的函数名修饰(Name Mangling),便于C语言调用。 --- ### 建议准备方向 1. **刷题平台**:LeetCode(标签:C++、算法)、牛客网C++专项题)。 2. **书籍**:《Effective C++》《深度探索C++对象模型》《C++ Primer》。 3. **实战演练**:手写代码(如智能指针、字符串类)、调试内存问题。 根据目标岗位调整重点(如嵌入式开发侧重内存/底层,后端开发关注多线程/性能优化)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值