C++知识点复习

  对于这些问题的回答,可以按照思维导图的结构来组织答案,然后再进行回答。

C++11用过哪些特性?

(首先,要回答好这个问题,需要注意问题的层次,不要一上来就说新增了某某关键字和语法,在这里我们可以分为五个层次来跟面试官讲解:语法,std容器,多线程,智能指针,右值引用)

(这里可以对照着思维导图跟面试官说,聊到某个方面的细节还需要自行搞清楚)

动态库和静态库的区别?

 首先来看动态库和静态库的演示:

先创建一个头文件

里面定义了方法,但是还未实现。

实现两个方法的实现分别在add.cc和del.cc中。

 

然后在创建一个main程序,来调用这两个函数 

接着,再将add.cc和del.cc分别生成.o文件(机器代码)

用g++的-c选项

g++ -c add.cc -o add.og++ -c del.cc -o del.o

 

无论是动态库还是静态库,第一步都是需要先生成这样的目标文件。

 先来看看静态库的生成:

使用命令:

ar rcs libapi.a del.o add.o

关于这个命令的了解:

这里就生成了一个libapi.a的静态库

然后再是动态库的生成:
我们只要用g++把目标文件编译进去就行了 

这里顺便说下,在linux下,静态库的后缀是.a,动态库的后缀是.so。而在Windows下,静态库的后缀是.lib,动态库的后缀是.dll。

 使用命令

g++ -shared -fPIC -o libapi.so del.o add.o

如果出现报错:

那么我们可以再重新把add.cc和del.cc重新编译一下:

g++ -fPIC -c del.cc -o del.og++ -fPIC -c add.cc -o add.o

 然后再执行:

g++ -shared -o libapi.so del.o add.o

其中

 

这下两个库就都有了

静态库的使用:

g++ -static main.cc -o static_main -L./ -lapi  -I./

编译是默认链接动态库的,如果要链接静态库,那么需要使用-static选项, -L表示我们要在哪个目录下搜索这个库,后面再接这个库的名字,-I(大写的i)表示头文件在哪里搜索。

执行效果:

再来使用一下动态库:

g++ main.cc -o dynamic_main -L./ -lapi  -I./

 主要就是去掉-static选项即可。

看一下两种链接方式生成的程序的大小:

可以看到,链接静态库生成的程序大小明显要大很多。

运行dynamic_main:

 发现报错了,原因大致是找不到这个库。

原因是当我们在链接动态库的时候,编译器仅仅只是对我们调用的函数进行了语法检查,还并没有调用相对应的库。在linux下,需要我们指定一个搜索路径,这是一个宏定义。

linux默认只会在/lib 和/usr/lib这两个目录中搜索,我们的动态库并没有安装在这两个目录中。

这里我们可以用export来设置,把这个库所在的目录设置进去:

export LD_LIBRARY_PATH=/home/chika/lib-test

这个设置在会话重启后就失效了。

此时就可以运行dynamic_main了:

这就是生成动态库和静态库,以及使用的过程了。

思维导图总结:

 另外静态库的可移植性也强一些,链接动态库的程序在移植后需要确保能够找到动态库。

说下面向对象的三大特征?

在继承的继承权限那里,对于基类的private权限成员,无论采用何种继承方式,在子类中都是不可见的。

在回答这个问题的时候,我们就以这个框架来回答,简略说明每个特性的目的和特性,如果还要聊到细节的部分那就再细说。 

左值引用和右值引用有什么区别?右值引用有什么意义? 

 这里可以把左值和右值的区别,以及能解决什么问题给回答上来,不过有时候面试时会再深入到什么是左值,什么是右值,此时就需要再对左值和右值进行一个详细的介绍了。

什么是左值?什么是右值?

 

简述多态的原理 

怎么解决菱形问题? 

关键字 override 和 final的作用?

 

C++类型推导的用法

 

使用示例:

 如果用auto同时定义多个变量,那么这些变量必须同一个类型:

 exp是左值时,推导出左值引用:

decltype用来推导表达式的类型,不会进行运算 

function lambda bind之间的关系 

代码验证:

#include <iostream>
#include <functional>using namespace std;void hello(int count)
{cout << "hello count : " << count << endl;
}class Hello
{
public:static void hello(int x){cout << "static hello x : " << x << endl;}
};class CHello
{
public:void hello(int x){cout << "hello x : " << x << endl;}
};class AHello
{
public:void operator()(int x){i += x;cout << "op x : " << x << " i + x = " << i << endl;}
private:int i = 0;
};//  模式实现的[i](int x) mutable {
//         ++i;
//         cout << "i : " << i  << "x : " << x << endl;
//     };
class LambdaHello 
{
public:LambdaHello(int i) : _i(i) {} // 如果是引用捕获,那么这里就是引用,如果没有mutable,那么就有const属性void operator()(int x){++_i;cout << "_i : " << _i  << "x : " << x << endl;}
private:int _i;
};// auto hello9 = bind(&hello,9); 生成的仿函数对象大致如下:
class BindHello
{
public:BindHello(function<void(int)> fn,int x) : _fn(fn),_x(x){}void operator()(){_fn(_x);}
private:int _x;function<void(int)> _fn;
};int main()
{function<void(int)> hello1 = hello;hello1(1);// 也是可以是函数指针function<void(int)> hello2 = &hello;hello2(2);//也可以是类的静态函数(或者也可以是指针)function<void(int)> hello3 = Hello::hello;hello3(3);function<void(int)> hello4 = &Hello::hello;hello4(4);// 类的非静态函数CHello c;function<void(CHello*,int)> hello5 = &CHello::hello; // 此时这里就必须要取地址了hello5(&c,5);// 仿函数function<void(int)> hello6 = AHello(); // 这里调用构造函数,生成仿函数对象hello6(6);    hello6(6);  // 发现的i的值会变化,这种状态会变化的函数称为闭包// lambda表达式int i = 0;auto hello7 = [i](int x) mutable {++i;cout << "i : " << i  << "x : " << x << endl;};hello7(2);hello7(2);cout << "i : " << i << endl; // 如果是值捕获,那么外面的i的值并没有发生改变// 模拟lambda的仿函数auto hello8 = LambdaHello(i);hello8(8);hello8(8);cout << "i : " << i << endl; // 发现是一样的效果auto hello9 = bind(&hello,9); // bind可以绑定参数来生成函数对象hello9();auto hello10 = bind(&CHello::hello,&c,10);auto hello11 = bind(&CHello::hello,&c,placeholders::_1); //可以固定参数hello10();hello11(11);auto hello12 = BindHello(&hello,12); // 模仿hello9 bind所生成的函数对象hello12();function<void(int)> hello13 = bind(&hello,placeholders::_1); // 与hello9类似hello13(13);return 0;
}

继承下,构造函数和析构函数的执行顺序 

 

虚函数表和虚函数表指针的创建时机 

 

虚析构函数的作用 

 

智能指针的种类以及使用场景 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/461257.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net framework 3.5sp1开启错误进度条不动如何解决

浏览器地址栏输入www.dnz9.com远程解决netframework问题 在Windows操作系统上安装或启用.NET Framework 3.5 SP1时&#xff0c;如果遇到进度条不动的问题&#xff0c;可能由多种原因引起。以下是一些可能的解决方案&#xff1a; 1. 使用Windows功能对话框 1.打开“控制面板”。…

openpnp - 在openpnp中单独测试相机

文章目录 openpnp - 在openpnp中单独测试相机概述笔记END openpnp - 在openpnp中单独测试相机 概述 底部相机的位置不合适, 重新做了零件&#xff0c;准备先确定一下相机和吸嘴的距离是多少才合适。 如果在设备上直接实验&#xff0c;那么拆装调整相机挺麻烦的。 准备直接在电…

Spring 框架中常见的注解(Spring、SpringMVC、SpringBoot)

1. Spring 中常见注解 还有Recourse&#xff1a;相当于AutowiredQualifier Value : 用于将配置文件中的值注入到Bean的字段中。 Bean : 用于在配置类中声明一个Bean。 Lazy : 用于延迟加载Bean。 2. SpringMVC 中常见注解 还有GetMapping PostMapping PutMapping DeleteMapp…

掌握分布式系统的38个核心概念

天天说分布式分布式&#xff0c;那么我们是否知道什么是分布式&#xff0c;分布式会遇到什么问题&#xff0c;有哪些理论支撑&#xff0c;有哪些经典的应对方案&#xff0c;业界是如何设计并保证分布式系统的高可用呢&#xff1f; 1. 架构设计 这一节将从一些经典的开源系统架…

OpenAI 的 Whisper:盛名之下,其实难副?

OpenAI 的 Whisper&#xff1a;盛名之下&#xff0c;其实难副&#xff1f; Whisper 的崛起与承诺 严重缺陷的曝光 风险分析 应对措施 结论 在人工智能的浪潮中&#xff0c;OpenAI 一直以其创新性和强大的技术实力备受瞩目。然而&#xff0c;最近 OpenAI 的语音转写工具 Wh…

【MySQL】可重复读级别下基于Next Key Lock解决幻读

昨天读到了一篇文章[1]&#xff0c;里面讲&#xff0c;面试官说mysql的可重复读级别下有解决幻读的方式&#xff0c;最后公布了答案&#xff0c;是在sql后面加for update。这么说倒是没错&#xff0c;但是这种问法给我一种奇怪的感觉&#xff0c;因为for update无论在哪个隔离级…

Kaggle “Reducing Commercial Aviation Fatalities” 比赛 生理数据分析

1、背景 Kaggle在2018 年 12 月 20 日举办“Reducing Commercial Aviation Fatalities” 比赛&#xff0c;通过收集飞行员的生理数据&#xff0c;判断飞行员何时会遇到麻烦吗&#xff1f;该比赛主要分析飞行员的问题&#xff0c;因为航班多、时间不固定&#xff0c;飞行员会出…

Python 字符串类型中 ``split(“\n“)`` 与 ``splitlines()`` 方法的一些区别

最近在以 self.__print("#" * 20 "\n") 调用自己写的 __print 接口时发现打印的时候 "\n" 没有打出来&#xff0c;进而发现了 split("\n") 与 splitlines() 方法的一些区别。 一个是参数上&#xff0c;split 需要传递一个字符串作为…

开源库 FloatingActionButton

开源库FloatingActionButton Github:https://github.com/Clans/FloatingActionButton 这个库是在前面这个库android-floating-action-button的基础上修改的&#xff0c;增加了一些更强大和实用的特性。 特性&#xff1a; Android 5.0 以上点击会有水波纹效果 可以选择自定义…

““ 引用类型应用举例

#include <iostream> //使能cin(),cout(); #include <stdlib.h> //使能exit(); #include <iomanip> //使能setbase(),setfill(),setw(),setprecision(),setiosflags()和resetiosflags(); //setbase( char x )是设置输出数字的基数,如输出进制数则用se…

无人机避障——2D栅格地图pgm格式文件路径规划代码详解

代码和测试效果请看上一篇博客&#xff1a; 无人机避障——使用三维PCD点云生成的2D栅格地图PGM做路径规划-CSDN博客 更换模型文件.dae&#xff1a; 部分模型文件可以从这里下载&#xff1a; https://github.com/ethz-asl/rotors_simulator/wiki 将原先代码中的car.dae文件…

科研项目:利用AI大模型获得基金资助的10个原则

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 以ChatGPT为代表的大语言模型的诞生后&#xff0c;在学术界这些大模型LLM驱动的聊天机器人已经成为大家撰写和修订论文、基金申请书的流行工具。这些LLM经过千亿文本训练&…

CVE-2022-0185

这是一个关于整型溢出的CVE。 static int legacy_parse_param(struct fs_context *fc, struct fs_parameter *param) {struct legacy_fs_context *ctx fc->fs_private; // [1] ctx 与文件描述符相关unsigned int size ctx->data_size; // [2] size —— 目前已经写…

【Linux网络】TCP_Socket

目录 TCP协议&#xff08;传输控制协议&#xff09; listen状态 accept和connect TCP_echo_server (1)创建套接字 &#xff08;2&#xff09;绑定 &#xff08;3&#xff09;设置listen状态 &#xff08;4&#xff09;loop &#xff08;5&#xff09;客户端 多线程远程…

摄像机实时接入分析平台LiteAIServer视频智能分析软件视频诊断中的抖动检测功能

在现代社会中&#xff0c;视频监控系统扮演着至关重要的角色&#xff0c;而视频质量直接影响到监控系统的可靠性和有效性。随着技术的不断进步&#xff0c;视频智能分析软件LiteAIServer作为一款领先的视频智能分析软件&#xff0c;通过引入抖动检测功能&#xff0c;进一步提升…

Excel重新踩坑4:快捷键;逻辑函数;文本函数;日期相关函数;查找与引用函数;统计类函数;数组公式

0、excel常用快捷键 基础快捷键&#xff1a; alt&#xff1a;快速区域求和&#xff1b; ★ altenter&#xff1a;强制换行&#xff08;因为在excel单元格中没法用enter换行&#xff09;&#xff1b;altj&#xff1a;强制换行符的替换删除&#xff0c;这里altj就是在替换中输入…

ABAP RFC SQL 模糊查询和多个区间条件

对于非选择屏幕的情况&#xff0c;RFC接口输入数据后&#xff0c;如何处理字符串模糊查询、日期区间查询、数字区间查询&#xff1a; 一、所有字符支持模糊查询&#xff0c;在SAP SQL中&#xff0c;使用 %S%来实现。 二、区间查询有3种情况&#xff1a; 1、没有值输入&#xf…

python通过pyperclip库操作剪贴板

pyperclip介绍 pyperclip是一个python库用于操作剪贴板&#xff0c;可以非常方便地将文本复制到剪贴板或从剪贴板获取文本。 通过pip进行安装&#xff1a;pip install pyperclip pyperclip的github地址 pyperclip使用 复制到剪贴板 import pypercliptext "Hello, Wo…

Golang | Leetcode Golang题解之第516题最长回文子序列

题目&#xff1a; 题解&#xff1a; func longestPalindromeSubseq(s string) int {n : len(s)dp : make([][]int, n)for i : range dp {dp[i] make([]int, n)}for i : n - 1; i > 0; i-- {dp[i][i] 1for j : i 1; j < n; j {if s[i] s[j] {dp[i][j] dp[i1][j-1] …