c++基础

一、 简述一下什么是面向对象?它有哪些特性?

面向对象是一种编程思想,将属性和行为封装为一个对象,通过对象间的交互完成程序功能。

封装:将数据和方法隐藏在类内部,仅通过公共接口访问,实现信息隐藏和模块化。

继承:子类可以继承父类的属性和方法,实现代码复用,并可拓展新功能

多态:同一接口(如函数,方法)在不同对象上表现出不同行为;包括编译时多态(重载)和运行时多态(重写)

二、 请说说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.14f3.14F 精度约6位有效数字
double 8 字节 3.14 默认浮点类型
long double 12或16字节(依平台) 3.14l3.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

eE 表示"×10的幂",后面的数字可以带正负号。

字符串字面量与 const char*

C++ 中 "abc" 是一个 字符串常量,其类型为:

const char [4] // 包含 '\0' 结尾字符

在表达式中,它会退化为指针const char* p = "abc";


小陷阱

"abc" + 1; // ✅ 有效,结果指向 "bc"

"abc" + "def"; // ❌ 错误,不能两个指针相加

相关推荐
workflower3 小时前
微软PM的来历
java·开发语言·算法·microsoft·django·结对编程
人间乄惊鸿客3 小时前
python — day9
开发语言·python
妮妮喔妮4 小时前
Go的垃圾回收
开发语言·后端·golang
向上的车轮7 小时前
无需云服务的家庭相册:OpenHarmony 上的 Rust 实践
开发语言·后端·rust
Code_Shark8 小时前
AtCoder Beginner Contest 426 题解
数据结构·c++·算法·数学建模·青少年编程
仰泳的熊猫8 小时前
LeetCode:698. 划分为k个相等的子集
数据结构·c++·算法·leetcode
豐儀麟阁贵8 小时前
4.5数组排序算法
java·开发语言·数据结构·算法·排序算法
xlq223228 小时前
7(内存管理)(上)(了解)
c++
Jane-6667778 小时前
C语言——栈与队列
c语言·开发语言