一、 简述一下什么是面向对象?它有哪些特性?
面向对象是一种编程思想,将属性和行为封装为一个对象,通过对象间的交互完成程序功能。
封装:将数据和方法隐藏在类内部,仅通过公共接口访问,实现信息隐藏和模块化。
继承:子类可以继承父类的属性和方法,实现代码复用,并可拓展新功能
多态:同一接口(如函数,方法)在不同对象上表现出不同行为;包括编译时多态(重载)和运行时多态(重写)
二、 请说说new的实现原理以及与malloc的区别?
1、new是运算符,malloc是标准库函数
2、new会调用operator new函数分配内存(底层可通过malloc实现。)
自动调用构造函数初始化内存中的独享
返回值是带类型的指针,
内存失败会排除异常 释放需要配合delete(调用析构)
3、malloc 仅分配内存,不初始化
返回值是void*(需显示转换)
内存失败会返回空指针
释放需要配合free
三、 说说指针和引用的区别。
1、定义:指针是存储地址的变量,可指向不同对象 引用是对象的别名,必须初始化且绑定后不可更改指向。
2、空值: 指针可以为nullptr; 引用必须绑定有效对象,无空引用。
3、操作: 指针需要通过*解引用访问对象; 引用可直接使用(编译器自动处理地址)
4、sizeof: 指针大小为地址长度(如64位系统8字节) 引用大小为所绑定对象的大小
5、算术运算: 指针支持自增/自减(移动地址) 引用不支持算术运算
四、说说C++和C中struct的区别以及和class区别。
1、C和C++中sturct的区别
c的struct仅能包含数据成员,无成员函数 c++的struct可包含数据成员,成员函数,访问控制符(publivc/private)等,继承等;
c的struct定义后使用struct关键字(或通过typedef简化);c++可直接使用结构体名
2、c++中struct与class的区别
struct默认成员为public,class默认成员为private srtuct
默认继承为public,class默认继承为private
五、 说说左值、右值、左值引用、右值引用、右值引用的使用场景。
1、左值:可被取地址的表达式(如变量,地址)
2、右值:不可被取地址的表达式(如字面量,表达式结果,临时对象)
3、左值引用(T&):绑定到左值的引用,如int a=5; int& ref=a; 用于传递参数避免拷贝、返回左值等;
4、右值引用(T&&):绑定到右值的引用,如int&& ref=3+2; 用于识别临时对象
六、 说一说STL中有哪些常见的容器。
1、vector:动态数组
list:双向链表;任意位置插入/删除高效
deque:双端队列,支持随机访问;头尾插入/删除高效
2、set/multiset:set键唯一,multiset键可重复,默认升序。
map/multimap:存储键值对(key-value),map键唯一,multimap键可重复。
无序版本(c++11):unordered_set/unordered_map,基于哈希表,查找复杂度o(1)
3、stack(栈)(LIFO):默认基于deque实现。
queue(队列)(FIFO)默认基于deque实现。
priority_queue:优先队列(最大/小堆),默认基于vector实现、
题目1
在C语言中下面代码的运行结果是()
cpp
int main()
{
int i = 0;
while(++i > 0);
printf("正在输出\n");
printf("输出结束");
return 0;
}
A. 一直输出 "正在输出"
B. 编译错误
C. 输出 "输出结束"
D. 输出:
"
正在输出
输出结束
"
答案:D
1、while(++i > 0); 末尾的分号是一个空语句,即循环体是空的。
该循环会执行 ++i 不断增长,直到 i 溢出变为负数(C中 int 溢出未定义,但通常表现为负值),循环才结束。
当循环结束时,程序会执行 printf("正在输出\n");
⚠️ 题中缩进误导性强,要记得:C语言不靠缩进识别语句块,靠分号 {}!
题目2
cpp
下面代码片段在`GCC`编译器编译后的执行结果是( )。
double score[5] = {98,87,65,43,76};
double* ptrScore = &score[1];
ptrScore += 2;
cout << *ptrScore-- << *ptrScore;
A. 65 87
B. 65 65
C. 43 65
D. 43 43
答案:c
1、ptrScore 指向 score[3]=43
*ptrScore-- → 先取当前指向的值(43),然后指针后移一位(指向 score[2]=65)
下一个 *ptrScore → 取65
2、自增,自减有前置,后置之分
对于前置自增(++i)和前置自减(--i),执行顺序是先自增(减),再使用
对于后置自增(i++)和后置自减(i--),执行顺序则是先使用再自增(减)
题目3
cpp
设有函数模板
template<typename T>
T add(T x, T y)
{
return x + y;
}
则下列语句中对该函数模板错误使用的是()。
A. add("zero", "one");
B. add(19, 10);
C. add(5.0, 9.0);
D. add(10.f, 15.f);
对于A:两个参数类型是 字符串字面量,其类型是 const char[5] 和 const char[4]。
在传参时会退化(decay为 指针类型:
"zero" → const char*
"one" → const char*
模板推导结果:T = const char*
编译器尝试执行:return x + y; → 实际上是 const char* + const char*
**而指针之间不能直接相加,**只能:
指针 + 整数(移动位置)✅
指针 - 指针(求距离)✅
指针 + 指针 ❌
浮点数字面量总结
| 类型 | 占用字节(典型) | 字面量示例 | 特征 |
|---|---|---|---|
float |
4 字节 | 3.14f 或 3.14F |
精度约6位有效数字 |
double |
8 字节 | 3.14 |
默认浮点类型 |
long double |
12或16字节(依平台) | 3.14l 或 3.14L |
高精度浮点类型 |
cpp
float a = 1.23f; // float
double b = 1.23; // double
long double c = 1.23L; // long double
指数(科学计数法)表示
±mEn 或±m e ±n
| 示例 | 表示 |
|---|---|
1.2e3 |
1.2 × 10³ = 1200 |
5E-2 |
5 × 10⁻² = 0.05 |
3.0fE+2 |
3.0f × 10² = 300.0f |
1e0 |
1.0 |
e或E表示"×10的幂",后面的数字可以带正负号。
字符串字面量与 const char*
C++ 中 "abc" 是一个 字符串常量,其类型为:
const char [4] // 包含 '\0' 结尾字符
在表达式中,它会退化为指针 :const char* p = "abc";
小陷阱
"abc" + 1; // ✅ 有效,结果指向 "bc"
"abc" + "def"; // ❌ 错误,不能两个指针相加