<commit_before>---
title: C++学习笔记（1）
date: 2021-08-15 9:55:50
tags: C++-V
layout: post
---

## C++常见面试题



### 说一下static关键字的作用

从存储位置、初始化、生命周期三个角度来回答：

|          | 全局静态变量 | 局部静态变量 | 静态函数 | 静态成员变量 | 静态成员函数 |
| -------- | ------------ | ------------ | -------- | ------------ | ------------ |
| 存储位置 | 静态存储区   | 静态存储区   | /        |              | /            |
| 作用域   | 声明文件     | 局部作用域   | 声明文件 | 类及其对象   | 类及其对象   |
| 生命周期 | 程序运行期   | 程序运行期   |          |              |              |

**函数的定义和声明在默认情况下都是extern的，但静态函数只是在声明他的文件当中可见，不能被其他文件所用**

### 说一下C++和C的区别

3、说一说c++中四种cast转换

4、请说一下C/C++ 中指针和引用的区别？


7、请你说一下你理解的c++中的smart pointer四个智能指针：

8、请回答一下数组和指针的区别

9、请你回答一下野指针是什么？

10、请你介绍一下C++中的智能指针

11、请你回答一下智能指针有没有内存泄露的情况

12、请你来说一下智能指针的内存泄漏如何解决<commit_msg>Update 2021-09-02-cpp-advance.md<commit_after>---
title: C++学习笔记（1）
date: 2021-08-15 9:55:50
tags: C++-V
layout: post
---

## C++常见面试题



### 说一下static关键字的作用

从存储位置、初始化、生命周期三个角度来回答：

|          | 全局静态变量 | 局部静态变量 | 静态函数 | 静态成员变量 | 静态成员函数 |
| -------- | ------------ | ------------ | -------- | ------------ | ------------ |
| 存储位置 | 静态存储区   | 静态存储区   | /        |              | /            |
| 作用域   | 声明文件     | 局部作用域   | 声明文件 | 类及其对象   | 类及其对象   |
| 生命周期 | 程序运行期   | 程序运行期   |          |              |              |

**函数的定义和声明在默认情况下都是extern的，但静态函数只是在声明他的文件当中可见，不能被其他文件所用**

静态成员可以实现多个对象之间的数据共享，并且使用静态数据成员还不会破坏隐藏的原则，即保证了安全性。因此，静态成员是类的所有对象中共享的成员，而不是某个对象的成员。对多个对象来说，静态数据成员只存储一处，供所有对象共用

**静态成员函数不能访问非静态数据成员。原因很简单，非静态数据成员属于特定的类实例**



### 说一下C++和C的区别

- 设计思想上：
  C++是面向对象的语言，而C是面向过程的结构化编程语言

- 语法上：

  C++具有封装、继承和多态三种特性

  C++相比C，增加多许多类型安全的功能，比如强制类型转换、

  C++支持范式编程，比如模板类、函数模板等



### 说一说c++中四种cast转换



### 请说一下C/C++ 中指针和引用的区别？

- 引用被创建的同时必须被初始化（指针则可以在任何时候被初始化）。
- 不能有 NULL 引用，引用必须与合法的存储单元关联（指针则可以是 NULL）。
- 一旦引用被初始化，就不能改变引用的关系（指针则可以随时改变所指的对象）。

引用的主要功能是传递函数的参数和返回值。

C++ 语言中**，函数的参数和返回值的传递方式有三种：值传递、指针传递和引用传递**。

以下是"值传递"的示例程序。

由于 Func1 函数体内的 x 是外部变量 n 的一份拷贝，改变 x 的值不会影响 n, 所以 n 的值仍然是 0。

```C
void Func1(int x) 
{ 
    x = x + 10; 
} 
... 
int n = 0; 
Func1(n); 
cout << "n = " << n << endl; // n = 0 

```

以下是"指针传递"的示例程序。

由于 Func2 函数体内的 x 是指向外部变量 n 的指针，改变该指针的内容将导致 n 的值改变，所以 n 的值成为 10。

```c
void Func2(int *x) 
{ 
    (* x) = (* x) + 10; 
} 
... 
int n = 0; 
Func2(&n); 
cout << "n = " << n << endl; // n = 10 
```

以下是"引用传递"的示例程序。

由于 Func3 函数体内的 x 是外部变量 n 的引用，x 和 n 是同一个东西，改变 x 等于改变 n，所以 n 的值成为 10。

```c
void Func3(int &x) 
{ 
    x = x + 10; 
} 
... 
int n = 0; 
Func3(n); 
cout << "n = " << n << endl; // n = 10
```

对比上述三个示例程序，会发现"引用传递"的性质象"指针传递"，而书写方式象"值传递"。

实际上"引用"可以做的任何事情"指针"也都能够做，为什么还要"引用"这东西？

答案是"用适当的工具做恰如其分的工作"。




7、请你说一下你理解的c++中的smart pointer四个智能指针：

8、请回答一下数组和指针的区别

9、请你回答一下野指针是什么？

10、请你介绍一下C++中的智能指针

11、请你回答一下智能指针有没有内存泄露的情况

12、请你来说一下智能指针的内存泄漏如何解决
{'fraction_non_alphanumeric': 0.20021881838074398, 'fraction_numerical': 0.030634573304157548, 'mean_word_length': 2.3451219512195123, 'pattern_counts': {'":': 0, '<': 21, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 6, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1985243', 'n_tokens_mistral': 2044, 'n_tokens_neox': 2285, 'n_words': 200}