C++ 基础知识

由于最近在准备去外头看看新世界,整理了一下C++常问的知识点,肯定是不如教材里那么全。

1、C++ 可执行程序的内存分布

BSS:Block Started by Symbol
存放程序中未初始化的全局变量
数据段:
存放已初始化的全局变量,静态内存分配
代码段:
存放执行代码
堆heap:
存放运行中动态分配的内存段,可扩张或缩减
栈stack:
存放程序的局部变量,在函数被调用时,栈还用来传递参数和返回值

2、C++编译原理

1、预编译:宏展开过程
2、编译:inline在此时展开,从C++代码到汇编语言
3、汇编:汇编语言到机器语言
4、链接
引申:内联函数和宏:
两者都可以节省函数栈的开销,提高运行效率。因为函数在运行时需要保持现场和上下文后恢复现场,有时间和空间的开销
宏在调用时直接展开,更有效率,但不能使用私有成员,不能调试,容易产生二义性
内联函数由编译器展开

3、C++ extern关键字的作用

加在变量或函数前,表明该内容的定义在其他文件中。
extern “C” 提示C++编译器按C语言的规则编译函数,举例:
C++生成的动态库.so文件,如果按C++命名,则函数的名称会因为继承等原因变化,比如func()会变成func_%20(),其他程序调用dlopen动态打开该库时,按照func名称会搜索不到相应的函数。

4、static关键字的作用

在全局变量中加static,称为静态全局变量有以下特点:
在数据段中存放
会被自动初始化成0
在文件之外不可见

另外,static修饰函数,可以使其成为类的静态成员函数,成员变量和类相关,和类的对象无关。
及时没有具体对象,也能调用类的静态成员函数——单例模式

5、const关键字的作用

主要有四个方面:常量、函数输入、函数输出、成员函数,都是为了让被修饰的内容受到保护,防止意外修改
1、const修饰常量,最常用,常量不让修改
2、const修饰输入参数:
void StringCopy(char dest,const char source),函数体内任何修改source的行为都会报错
3、如果输入参数采用值传递,由于函数会在栈中自动产生临时变量的复制(拷贝构造函数),因此参数不用加const
void func(int x)不能用void func(const int x)
4、引用传递比值传递效率高,但是缺点是参数可能被修改,因此也可以加const修饰
void func(A& a) –> void func(const A& a)
5、用const修饰函数的返回值
如果以指针传递的方式返回,且被const修饰,则赋值给其他指针变量的时候,要求指针也得用const声明:
const char * GetString();
char * str=GetString();——报错
const char *str=GetString();——正确

如果是值传递,由于函数会自动复制的关系,加const没用

6、const修饰成员函数

任何不会修改数据成员的函数都应声明为const类型
1、在const成员函数中,不慎修改了数据成员,会报错
2、在const成员函数中,不慎调用了其他非const成员函数,报错

7、static、const、static const的初始化

1、在类里创建一个const类型变量时,不能给他初值
理由:编译器必须为const类型变量分配存储空间,但类的声明又不占用存储空间
class foo
{
private:
const int a= 100;——报错
}
只能在构造函数的初始化列表里初始化:
A::A(int a):bb(a),其中bb的声明为 const int bb;
2、static修饰的类成员变量,既不能在类定义中初始化,也不能在初始化列表里初始化,只能在外头
int foo::a=100;
3、static const也是在类外初始化

8、C++中,new和malloc的区别

new是c++的操作符,malloc是c中的函数
new可以调用构造函数 delete调用析构函数
malloc只是单纯的分配内存,不会初始化成员

9、关于C++ 多态和函数表的关系

多态的定义:一个接口,多种方法
多态和非多态的区别,可以理解为静态编译(重载)和动态编译(虚函数)
多态是通过虚函数表来实现的,重载在编译时就确定了函数的地址,虚函数的运行地址只能在运行过程中才能确定

10、C++虚函数与构造、析构函数的关系

1、构造函数不能使虚的
理由:存在虚函数的话,会存在虚函数表vtable,构建的对象会有一个vptr指向虚函数表,所以不能把构造函数放虚函数里
2、析构函数一般都是虚的
如果是实的,那么当有一个基类指针指向派生类,那么析构时只会析构基类的成员,造成派生类的成员没有正确释放
只有是虚的,才会先在虚函数表中找到派生类,再找基类

如果类中有虚函数,不管有多少个,它派生出来的对象大小都会多4字节,是vptr:指向虚函数表的指针

11、C++ 构造函数、拷贝构造函数、赋值函数

1、构造函数、拷贝构造函数
特点都是“无中生有”
A a——通过默认构造函数创建一个对象
2、拷贝构造函数
用一个类的对象去初始化另一个对象时:
A b=a;
A b(a);
都使用的拷贝构造函数
浅拷贝:复制一个指针,指向同一个地址空间
深拷贝:在内存中开辟新的空间,两个对象独立
拷贝构造函数的声明:
A(const A& a)

赋值运算函数:
A& operator=(const A& a)

Linux技术
1、epoll和select
当一个程序要读两个以上IO时,如果使用阻塞式IO,那么一个文件描述符阻塞,另一个文件描述符有数据却读不出来,效率很低。
解决方案有以下几个:
1、开一个描述符就起一个线程,维护起来比较复杂
2、用非阻塞IO,得一直轮询
3、用异步IO,通过信号量或者回调触发
4、IO多路复用(epoll和select)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在C编程语言的基础知识面试中,通常会涉及以下几个方面的问题: 1. C语言的特点与用途:C语言是一种通用的高级程序设计语言,可以用来开发底层操作系统、嵌入式系统、游戏开发等应用。它具有简洁、效率高、可移植性强等特点。 2. C语言的数据类型与变量:C语言支持不同的数据类型,包括整型、浮点型、字符型等。使用变量来存储数据,变量需要先声明后使用,并且可以进行各种运算。 3. C语言的控制流程:C语言中的控制流程有条件判断语句、循环语句和跳转语句。条件判断语句通过判断条件的真假来决定执行哪个分支;循环语句可以重复执行一段代码,直到满足退出条件;跳转语句可以改变代码的执行顺序。 4. C语言的函数与库:C语言支持函数的定义和调用,可以将一段代码封装成函数,提高代码的复用性。此外,C语言还提供了一些标准库,包括输入输出库、数学库等,可以在程序中使用这些库函数来完成各种操作。 5. C语言的指针和内存管理:C语言具有灵活的指针操作功能,可以通过指针来直接访问内存中的数据。指针可以用于动态内存分配和释放,通过调用malloc()和free()函数来进行操作。 除了以上几个方面的基础知识,面试中可能还会涉及到关于C语言的编程题,例如要求解决某个具体的问题或者实现某个算法等。在面试中,不仅要掌握C语言的基础知识,还需要具备解决问题的思路和能力,能够独立分析和编写C程序。 ### 回答2: C基础知识面试主要涉及面向过程的编程语言C的基础概念、语法和应用。在面试中,通常会涉及以下几个方面的问题: 1. C语言的基本概念和特性:要求候选人能够解释C语言的起源、用途和特点,了解C语言的运行环境和编译过程。 2. C语言的数据类型:面试官可能会问到C语言中的基本数据类型,如int、char、float等,以及它们在内存中的存储方式和占用空间大小。 3. C语言的控制结构:掌握C语言中的分支语句(if-else、switch-case)和循环语句(for、while、do-while),并能够解答相关的应用题。 4. C语言的函数:了解函数的定义、声明和调用规则,理解函数的参数传递和返回值机制,能够编写简单的函数。 5. C语言的指针:熟悉指针的基本概念和用法,了解指针和数组、指针和函数之间的关系,能够解决指针相关的问题。 6. C语言的内存管理:了解动态内存分配(malloc、free)和静态内存分配(全局变量、局部变量)的区别和用法,了解内存泄漏和内存溢出的概念。 7. C语言的文件操作:熟悉文件的打开、读写、关闭等基本操作,能够读写文本文件和二进制文件,了解文件指针的概念和用法。 8. C语言的预处理器:了解预处理器的作用和常用指令(如#define、#include等),理解宏定义的概念和用法。 在C基础知识面试中,除了回答问题,面试官可能还会要求候选人编写简单的C代码,以检测其编程能力和解决问题的能力。所以,在准备面试时,应该复习C语言的基础概念、语法和应用,并进行代码练习,提高自己的实践能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值