小夕Coding
大厂程序员,阿里P9
展开
-
利用cmake工具生成VisualStudio工程文件
对于习惯了 Visual Studio 强大的管理项目、编码和调试功能的读者来说,在 Linux 下使用 gcc/g++ 编译、使用 gdb 调试是一件何其痛苦的事情,对于大多数的开源 C/C++ 项目,如果我们不在意 Windows 和 Linux 在一些底层 API 接口上的使用差别,想熟悉该项目的执行脉络和原理,在 Windows 上使用 Visual Studio 调试该项目也未尝不可。文件),我们同样也可以利用 CMake 工具生成 Windows 上的 Visual Studio 工程文件。原创 2022-09-04 15:26:48 · 2343 阅读 · 0 评论 -
C++必须掌握的pimpl惯用法
这样的头文件,对于一些不想对使用者暴露核心技术实现的库和 sdk,是非常不好的。惯用法以后,这些私有成员变量被移动到当前类的 cpp 文件中,因此头文件不再需要包含这些成员变量的类型头文件,当前头文件变“干净”,这样其他文件在引用这个头文件时,依赖的类型变少,加快了编译速度。那有没有什么办法既能保持对外的接口不变,又能尽量不暴露一些关键性的成员变量和私有函数的实现方法呢?由于原来的头文件的一些私有成员变量可能是非指针非引用类型的自定义类型,需要在当前类的头文件中包含这些类型的头文件,使用了。原创 2022-09-04 15:23:42 · 221 阅读 · 0 评论 -
C++17结构化绑定
类型,由于 map 中的元素的 key 不允许重复,所以如果 insert 方法调用成功,T1 是被成功插入到 map 中的元素的迭代器,T2 的类型为 bool,此时其值为 true(表示插入成功);是绑定目标的一份拷贝,当绑定类型不是基础数据类型时,如果你的本意不是想要得到绑定目标的副本,为了避免拷贝带来的不必要开销,建议使用引用,如果不需要修改绑定目标建议使用 const 引用。类型,有了这个类型,我们就可以放任意个元素了,原来需要定义成结构体的 POD 对象我们可以直接使用。原创 2022-09-04 15:23:04 · 158 阅读 · 0 评论 -
C++面试题汇总
函数指针就是指向函数的指针变量,每个函数都有一个入口,该入口地址就是函数指针指向的地址。函数指针一般用于回调(callback)。野指针指的是指针指向的位置是随机的,不可知的,无法预料后果。产生野指针的原因一般是因为释放指针指向的内存后没有及时将指针置空。避免产生野指针的方法:初始化指针时置NULL;申请内存后判断是否为空;内存释放后指针置NULL;使用智能指针;养成良好的编程习惯。声明是告诉编译器变量或函数的类型和名字,不会为变量分配空间;...原创 2022-08-08 09:59:42 · 241 阅读 · 0 评论 -
C++开发面试之——C++11新特性20问
为了解决循环引用导致的内存泄漏,引入了弱指针weak_ptr,weak_ptr的构造函数不会修改引用计数的值,从而不会对对象的内存进行管理,其类似一个普通指针,但是不会指向引用计数的共享内存,但是可以检测到所管理的对象是否已经被释放,从而避免非法访问。为了解决循环引用导致的内存泄漏,引入了弱指针weak_ptr,weak_ptr的构造函数不会修改引用计数的值,从而不会对对象的内存进行管理,其类似一个普通指针,但是不会指向引用计数的共享内存,但是可以检测到所管理的对象是否已经被释放,从而避免非法访问。...原创 2022-08-08 09:57:35 · 1259 阅读 · 0 评论 -
C++ 的时间库:日历和时区
比如现在拿到了一个当前系统时间的时间点,现在想在一个 UI 界面上展示给用户是几点几分,大家能想到的就是先用 to_time_t() 转成 time_t 类型的秒的计数,然后再用 C 标准库提供的 localtime() 或 gmtime() 系列函数转成离散的时间数据结构 tm,这样就知道几点几分了。hh_mm_ss类的构造函数和主要的成员函数都是 constexpr 类型,这意味着可以声明 constexpr 类型的hh_mm_ss对象,同时也可以在其他常量表达式或常量函数中使用hh_mm_ss。..原创 2022-08-08 09:55:59 · 693 阅读 · 0 评论 -
C++强制类型转换
如果读者,看过小林之前推送C语言的文章,会发现C++的强制类型转换和C语言一样,因为C++编写者将C语言的优点保留了下来,除此之外C++还特别增加了。在C++的表达式中,不同的数据类型会自动地转换类型进行运算,但有的时候也需要程序员自己进行强制类型转换,将某个表达式转换成自己所需要的数据类型。如果进行强制类型转换的对象是一个变量,则该变量的括号可以省略;在强制类型转换时,会得到一个中间变量,原来变量的类型未发生变化,但是如果从高精度向低精度转换时,会丢失精度。强制类型转换的一般形式为(类型名) (表达式).原创 2022-08-08 09:29:48 · 1449 阅读 · 0 评论 -
《c++程序设计》谭浩强课后习题答案 第三章
* 将a和b中的大者存入temp中 */if (n>2) cout原创 2022-08-07 14:19:15 · 540 阅读 · 0 评论 -
《c++程序设计》谭浩强课后习题答案 第二章
2.3题int main()return 0;}2.4题int main()\""原创 2022-08-07 14:16:16 · 541 阅读 · 0 评论 -
《c++程序设计》谭浩强课后习题答案 第一张
第一章1.5题#include using namespace std;int main(){ cout原创 2022-08-07 14:13:46 · 162 阅读 · 0 评论 -
C++是如何工作的
假设我们有一些C++的源文件, 然后将这些源文件给编译器,编译器将其转变为二进制的东西,这些二进制的东西可能是某种库,或者是可执行的程序,这里主要讲可执行程序。我们以这个HelloWorld程序为例进行讲解,这是一个非常基础的程序,但也包含不少的知识点。...原创 2022-08-07 14:09:45 · 316 阅读 · 0 评论 -
【无标题】
堆区数据由程序员管理开辟和释放堆区数据利用new关键字进行开辟内存1.3 new操作符C++中利用 new 操作符在堆区开辟数据堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符 delete。原创 2022-08-07 14:02:46 · 74 阅读 · 0 评论 -
C++ 变量作用域
在 C++ 中,有两种简单的定义常量的方式:使用#define预处理器。使用const关键字。原创 2022-08-07 13:59:04 · 226 阅读 · 0 评论 -
C++ 数据类型
使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型(比如字符型、宽字符型、整型、浮点型、双浮点型、布尔型等)的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么。...原创 2022-08-07 13:55:21 · 76 阅读 · 0 评论 -
C++函数概述
和C语言一样,C++也是只能有一个main函数,而且程序也总是从main函数开始执行的,在执行过程中,由主函数调用其他函数,其他函数可以互相调用。在实际开发中,主函数写的都很简单,因为它的定位就是调用各个函数,程序的功能是一个个函数来实现的,在分别通过编译后,才能连接起来形成可执行文件。在C++中,主函数以外的函数大多是被封装在类中的,主函数相当于总指挥,负责调动各函数依次实现各个小功能。系统函数,即库函数,由编译系统提供,可以直接使用。有参函数,在调用函数时,要给出参数。从函数的形式看,函数分两类。...原创 2022-08-06 14:43:44 · 162 阅读 · 0 评论 -
C++scanf和printf
学过C语言的读者,对scanf函数和printf函数应该都不陌生,在C语言中最常见的输入输出就是用的这两个函数,同样在C++中也可以使用这两个函数进行输入和输出,但是在C++中,普遍使用的是cin和cout函数。C++的scanf输入函数和printf输出函数。一般格式是:printf(格式控制,输出表列)一般格式是:scanf(格式控制,输出表列)案例:使用printf函数输出一个整数。案例:使用scanf函数输入一个整数。执行本程序之后:输入1,会输出1。执行本程序之后:输入3,会输出3。...原创 2022-08-06 14:41:49 · 2274 阅读 · 0 评论 -
C++getchar和putchar
getchar函数的作用是从终端设备(通常就是键盘)输入一个字符,getchar()只能接受一个字符,且getchar函数得到的字符可以赋给一个字符变量或者整型变量。在C语言中用getchar和putchar来输入和输出单个字符,同样在C++中也可以使用这两个函数进行输入输出单个字符。这里需要注意一点a在ASCII码表里面的值是97,A在ASCII码表里的值是65,所以要减去32。putchar函数的作用是向终端(通常是电脑屏幕)输出一个字符,且可以用puchar输出转义字符。C++字符的输入输出。...原创 2022-08-06 14:40:32 · 1678 阅读 · 0 评论 -
C++强制类型转换运算符
在C++的表达式中,不同的数据类型会自动地转换类型进行运算,但有的时候也需要程序员自己进行强制类型转换,将某个表达式转换成自己所需要的数据类型。如果进行强制类型转换的对象是一个变量,则该变量的括号可以省略;如果要进行强制转换的对象是一个包含多项的表达式,则应该用小括号括起来表达式。在强制类型转换时,会得到一个中间变量,原来变量的类型未发生变化,但是如果从高精度向低精度转换时,会丢失精度。类型名 (表达式),类型名不加括号,但是变量或者表达式用括号括起来。强制类型转换的一般形式为(类型名) (表达式)...原创 2022-08-06 14:21:25 · 722 阅读 · 0 评论 -
C++常量
指数:浮点数可以写成指数形式,如2.133可以为0.2133*10的一次方,也可以写成0.2133e1,用 字母e表示其后的数是以10为底的幂,代表都是同一个数。因为A和B在ASCII码表为65和66,由此可以得出结果,在一定条件下,字符型数据和整型数据是可以通用的。常量:从字面意思理解就是不能改变值的,常量包括数值型常量和字符型常量两大类。符常量还有一种比较特殊的常量——转义字符常量,以\开头的字符序列。在C++中,也常用符号名代表常量,称为符号常量。用单引号括起来的单个字符就是字符常量。...原创 2022-08-06 13:58:13 · 200 阅读 · 0 评论 -
C++执行程序的过程
C++的源程序是以.cpp作为后缀的,C语言则是.c(.cpp保存也可以兼容),为了使计算机能够执行高级语言的代码,必须对源程序做个处理,用编译器把源程序处理成计算机可以识别的二进制目标程序,一般目标程序的后缀为.obj。读者最好尽快在自己的电脑上编译和运行C++程序,加深对C++的认识,初步掌握C++的上机操作,开发工具和C语言一样,Devc++,VS都可以,编译器在处理的过程中会对程序作出检查,如果编码的代码有错误,会提示error,在改正错误通过编译后,会得到目标文件。C++执行程序的过程。...原创 2022-08-06 13:36:40 · 936 阅读 · 0 评论 -
C++构成和编码规范
2.注释,不论哪种语言,一个好的、有价值的程序都应当加上注释,增加程序的可读性,相信我,如果不加注释,一个月回过头看自己写的程序,自己都不认识了。全局声明则是在函数外进行的声明;6.C++不同与C语言的一个重要部分:类,有了类可以实现面向对象的几个特性,比如封装、继承、多态,在一个类中可以包括数据成员和成员函数。3.一个函数由:函数首部、函数体组成,函数首部包括函数名、函数类型、函数属性、函数参数名、参数类型;5.和C语言一样C++程序也总是从main函数开始执行的,不论main函数在程序中的什么位置。..原创 2022-08-06 13:34:35 · 311 阅读 · 0 评论 -
C++ 面试题
惯例,这笔试题也是一个读者朋友发给我的,简单看了下,并不觉得这是一个非常困难的题目,最近是校招准备的时候,很多人给我说发面试题对大家有帮助。这个题目面试官强调了这个跑在64位系统下。代码如下: #define mal(x,y) (x*y)int main(){ int i = 3; int a; char **b[5][6]; a = mal(i++, sizeof(b) + 5); printf("%d", a); return 0;}怎么确定指针大小原创 2022-02-20 14:53:51 · 229 阅读 · 0 评论 -
一些经典的嵌入式C面试题汇总
#error的作用是什么?#error指令让预处理器发出一条错误信息,并且会中断编译过程。下面我们从Linux代码中抽取出来一小段代码并做修改得到示例代码:这段示例代码很简单,当RX_BUF_IDX宏的值不为0~3时,在预处理阶段就会通过#error指令输出一条错误提示信息:"Invalid configuration for 8139_RXBUF_IDX"下面编译看一看结果:推荐文章:认识认识#pragma、#error指令位操作的基本使用给一个32bit...原创 2022-02-20 14:15:42 · 203 阅读 · 0 评论 -
C/C++面试题,看这一篇就可以了
C和C++的区别1、C是一个面向过程的结构化语言,考虑如何通过一个过程对输入进行处理得到输出;C++是面向对象的语言,包含:封装、继承和多态特征。封装隐藏了实现细节,使得代码模块化;派生类可以继承父类的数据和方法,扩展了已经存在的模块,实现了代码重用;多态则是“一个接口,多种实现”,通过派生类重写父类的虚函数,实现了接口的重用。2、C和C++动态管理内存的方法不一样,C是使用malloc/free,而C++除此之外还有new/delete关键字。3、C++支持函数重载,C不支持函数重载4原创 2022-02-20 14:18:07 · 421 阅读 · 0 评论 -
如何在Qt中调用python脚本
Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。“前言大家如果学习过Qt的话,那么都应该明白,在Qt的目录下,有着和普通c++程序所不一样的一点,那就是Qt拥有一个.pro的文件,这个文件详细记录...原创 2022-01-27 13:05:30 · 5343 阅读 · 1 评论 -
C++ Qt控件
一、什么是Qt控件Qt 控件又称组件或者部件,指用户看到的所有可视化界面以及界面中的各个元素,比如按钮、文本框、输入框等。为了方便程序员开发,Qt 提供了很多现成的控件。打开某个带 ui 文件的 Qt Widgets Application 项目,ui 文件的 Widget Box 一栏展示了 Qt 提供的几乎所有控件:Qt 中的每个控件都由特定的类表示,每个控件类都包含一些常用的属性和方法,所有的控件类都直接或者间接继承自 QWidget 类。实际开发中,我们可以使用 Qt 提供的这些控件,也原创 2022-01-27 13:04:41 · 533 阅读 · 0 评论 -
QT教程1-简介及第一个QT
首先,本教程是基于C&C++的,所以学好C&C++非常有必要,对于不了解 C&C++的读者,建议大家先猛击阅读:C语言教程再阅读本教程。Qt 是一个跨平台的C、C++ 框架(C++库),目前最新的版本是Qt6。Qt还包含了很多小版本,其中推荐选择LTS 版本(即长期支持版本),Bug较少,相对稳定。Qt 除了支持界面设计(GUI编程),还封装了与网络编程、多线程、数据库连接、视频音频等相关的功能。这套 Qt 教程以Qt5.14为基础来介绍Qt开发,配有精美的图片以及完整的示例程序,几原创 2022-01-27 13:03:32 · 557 阅读 · 0 评论 -
CMake的简单使用
关于CMake根据makefile一文中所描述的那样,对于达到一定代码量的工程,使用makefile会简化编译,但是,工程的代码量变得更大,makefile的文件依赖关系会变得很复杂,写起来也会是一件很头疼的事情,make工具即在此基础上出现,它能根据一定的语法生成Makefile文件,并且无关乎平台,做到了一次编写,到处编译。make工具有很多,Qt的qmake就是其中一种,其能根据pro文件生成Makefile,但使用最多的是CMakeCMake是一个跨平台的编译工具,它不会直接编译代码,而原创 2022-01-27 13:01:42 · 469 阅读 · 0 评论 -
【CMake教程】CMake 配置install打包
(1)系列教程介绍 我们编译生成的可执行文件一般,会生成在当前的编译路径下,也就是build或者release路径下。那么如何将编译生成的可执行文件和库文件打包到一起进行发布那?本片教程我们将讲述如何在cmake中配置install的打包路径。下面我们将以mathlib库和头文件为例子进行配置。(2)CMake 的使用环境和安装本教程的使用环境为:ubutu18.04 ltsgcc version 7.5.0g++ version 7.5.0cmake version 3.10.2原创 2022-01-27 13:00:56 · 915 阅读 · 0 评论 -
CMake
平时开发中我们已经习惯了让IDE为我们做好一切,大部分情况下基本上不需要手动去编写项目的make文件,但是在规模较大的项目中,make其实非常重要,甚至可以说会不会make决定了你是否有能力驾驭一个大型项目。另外现在Android JNI开发中Google已经抛弃了传统的Android.mk,与时俱进用上了CMake,这也说明学习CMake的重要性,本文就为大家揭开CMake的面纱,让你与她相识相爱。为什么要用CMake大家可能发现现在CMake用的越来越多,就以Android为例,以前NDK开发时原创 2022-01-27 13:00:07 · 178 阅读 · 0 评论 -
CMake用法(一)基础使用:构建库
构建动态库和静态库代码演示新建项目目录test3_hello_lib和子目录lib,在项目根目录的CMakeLists.txt中写如下命令cmake_minimum_required(VERSION 3.16)project(LIBHELLO)add_subdirectory(lib out)在lib目录创建hello.h和hello.cpp文件hello.h:#pragmaonce#include<iostream>voidHelloFunc();...原创 2022-01-27 12:58:43 · 413 阅读 · 0 评论 -
程序员自我修养之CMake语法 1
1、cmake_minimum_required含义:CMake最低版本号要求cmake_minimum_required(VERSION 3.10) 最低版本是3.102、project含义:项目名称project(simple VERSION 1.0 LANGUAGES CXX C)项目名称 :simple版本号 :1.0支持语言 : CXX(C++)、C3、set含义:某一个变量赋值set(testVariables OFF)给testV...原创 2022-01-27 12:58:00 · 5957 阅读 · 0 评论 -
CLion + OpenCV 开发环境配置
What is CLion ? A cross-platform IDE for C and C++ 。习惯了 IDEA,如果要开始编写 C 或者 C++ 代码,CLion 应该是首选吧。Windows & CLion & OpenCV环境 WIndows 11 CLion 2021.1 OpenCV 4.5.3 CMake 3.16.0 MinGW 编译 OpenCV配置源代码路径和输出路径源代码路径和输出路径C原创 2022-01-27 12:50:43 · 2581 阅读 · 0 评论 -
C++进阶教程:C++逐行读取文件
不管使用哪种操作系统,文件都是程序员、计算机用户和学生日常生活中非常重要的一部分。这些文件帮助我们以不同的格式保存数据,具有安全性和冗余性。因此,在今天这个简单的教程中,我们将讨论在Ubuntu 20.04系统中逐行读取文件数据的 C++ 示例。让我们先从 Ubuntu 20.04 系统中安装名为“g++”的 C++编译器开始,因为我们正在用 C++ 语言编写代码。为此,我们按Ctrl+alt+T调出终端。安装g++,输入如下命令linuxmi@linuxmi:~/www.linux原创 2022-01-27 12:47:52 · 1954 阅读 · 0 评论 -
两万字读懂 C语言与 C++?
const作用 修饰变量,说明该变量不可以被改变; 修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer); 修饰引用,指向常量的引用(reference to const),用于形参类型,即避免了拷贝,又避免了函数对值的修改; 修饰成员函数,说明该成员函数内不能修改成员变量。 const 的指针与引用 指针 指向常量的指针(pointer to const) 自身是常原创 2022-01-22 19:43:39 · 109 阅读 · 0 评论 -
动态规划概念
一,动态规划概念动态规划比较适合用来求解最优问题,比如求最大值、最小值等等。它可以非常显著地降低时间复杂度,提高代码的执行效率。它和递归一样都非常难学,主要学习难点在于求解问题的过程不太符合人类常规的思维方式。二,0-1 背包问题对于一组不同重量、不可分割的物品,我们需要选择一些装入背包,在满足背包最大重量限制的前提下,背包中物品总重量的最大值是多少呢?关于这个 0-1 背包问题,上一节学习了回溯的解决方法,也就是穷举搜索所有可能的装法(时间复杂度指数级),然后找出满足条件的最大值。有没有什么规律原创 2021-12-22 16:38:43 · 401 阅读 · 0 评论 -
学会分治算法
一,如何理解分治算法分治算法(divide and conquer)的核心思想其实就是四个字,分而治之 ,也就是将原问题划分成 n 个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。分治和递归的区别:分治算法是一种处理问题的思想,递归是一种编程技巧。分治算法一般都比较适合用递归来实现。分治算法的递归实现中,每一层递归都会涉及这样三个操作:分解:将原问题分解成一系列子问题;解决:递归地求解各个子问题,若子问题足够小,则直接求解;合并:将子问题的结原创 2021-12-22 16:36:23 · 173 阅读 · 0 评论 -
二分查找算法
一,简单的二分查找算法二分查找(Binary Search)算法是一种针对有序且不含重复数据集合的查找算法,时间复杂度为 O(logn)O(logn)O(logn) ,二分查找虽然性能比较优秀,但应用场景也比较有限。因为底层依赖于数组这种结构,所以不适合数据量大的情况。再次,对于较小规模的数据查找,二分查找的优势并不明显,一般直接使用顺序遍历就可以了。二分查找更适合处理静态数据,也就是没有频繁的数据插入、删除操作。如果数据使用链表存储,二分查找的时间复杂就会变得很高,变成了 O(n)O(n)O(n)。原创 2021-12-22 16:35:04 · 413 阅读 · 0 评论 -
C++ Primer 学习笔记
第一部分 C++基础第2章 变量和基本类型2.1 基本内置类型2.2 变量变量定义变量声明和定义的关系标识符作用域2.3 符合类型2.4 const限定符2.5 标准输入输出int v1, v2 = 0; std::cin >> v1 >> v2;strd::cout << "The sum of" << v1 << "and" << v2 << "is" <<原创 2021-12-22 16:33:16 · 703 阅读 · 0 评论 -
C-CPP 编程基础
堆栈溢出一般是由什么原因导致的?没有垃圾回收资源。C++ 构造函数和析构函数的初始化顺序本回答参考C++ 构造函数初始化顺序, C++奇奇怪怪的题目之构造析构顺序有多个基类的派生类(多继承) 的构造函数初始化按照如下顺序进行:先执行虚拟继承的父类的构造函数;然后从左到右执行普通继承的父类的构造函数;接着按照定义的顺序执行数据成员的初始化;最后调用类自身的构造函数;析构函数就无脑的将构造函数顺序反转即可。多继承形式下的构造函数和单继承形式基本相同,只是要在派生类的构造函数中调用多个基原创 2021-12-22 16:32:15 · 782 阅读 · 0 评论
分享