C++基础和特性
文章平均质量分 64
入门C++
繁星蓝雨
Happy coding!
展开
-
C++/Java调用C++动态链接库————附带示例和详细讲解
jni需要先编写Java代码,然后转换成C++代码,被调用的C++代码再去实现Java转转后的C++方法。这里使用是jna调用C++中的方法,原因就是不用改写C++的代码,相对简单一些。不过这个需要被调用的C++方法,改写对应的的数据结构,以便Java调用。注意在编译之前,需要在头文件中声明后面动态链接库函数中需要被调用的函数。如果是在Linux下,不实用开发集成环境,直接使用JDK自带的指令进行编译和运行。各个平台的动态或静态链接库的格式,mac环境下的都是。文件,在windows上为。原创 2022-12-26 22:56:07 · 4728 阅读 · 0 评论 -
CMake安装、配置编译C++代码(Mac、Linux)————附带详细步骤和代码
文章目录0 背景1 安装CMake2 使用CMakefile.txt编译C++程序0 背景因为需要使用cmake来进行跨平台编译,所以根据网上的资料学习和总结成此文。1 安装CMake## 1. 查看当前cmake版本[root@localhost ~]# cmake -versioncmake version 2.8.12.2## 2. 进行卸载[root@localhost ~]# yum remove -y cmake## 3. 进行安装包的下载,也可以下载好安装包后传至相应的目录原创 2022-07-30 10:24:38 · 3172 阅读 · 1 评论 -
方法中使用malloc的避坑建议(二级指针运用) ———— 附带详细代码
文章目录0 二级指针理解1 错误写法2 正确写法0 二级指针理解二级指针也就是指针的地址。1 错误写法#include <iostream>#include <cstring>void f (char* p, int num){ p = (char *) malloc(sizeof(char) * num);}int main() { char* str = nullptr; f(str, 100); strcpy(str, "h原创 2021-12-08 21:15:00 · 1291 阅读 · 0 评论 -
C++可变模版(Variadic Template)与模版模版参数(Template Template Param)
文章目录1 概念2 模版模版参数1 概念...就是一个所谓的包,用于模版编程(template parameters)就是模版参数包(template parameters pack),用于函数参数(function paramter types)就是函数参数类型包(function paramater types pack)。1,可变模版函数的示例代码:打印变量://不定量模版参数#include <iostream>#include<bitset>/* run原创 2021-11-30 21:30:00 · 644 阅读 · 0 评论 -
空指针使用nullptr、NULL还是0—————C++2.0第二讲
0 结论避免在整型和指针类型间重载,尽量使用nullptr代替空指针。1 nullptr、NULL和0一般情况下,人们经常习惯于使用0或NULL来代指空指针,这容易导致歧义或者程序编译错误。例如:下面的代码中,f(NULL)会导致歧义,使得编译器不知道调用哪个函数。#include <iostream>using std::cout; using std::endl;void f(void*){ cout<<"f(void*)"<<endl;}原创 2021-04-15 23:35:18 · 536 阅读 · 3 评论 -
底层源码剖析——移动、右值、完美转发【概念、使用场合、区别、避坑指南】—————C++2.0第十四讲
文章目录1 基本概念2 源码剖析1 基本概念移动语义:不复制对象,而只是让新的对象名指向原对象名所指对象,并且将原对象所指的置空。完美转发:可以撰写接受任意参数的函数模版,并将其转发到其他函数,目标函数会接受与其转发函数所接受的完全相同的参数。右值引用:将移动语义和完美转发相结合的底层语言机制。2 源码剖析move的源代码://c++11template<typename T>typename std::remove_reference<T>::ty原创 2021-11-21 00:31:40 · 907 阅读 · 0 评论 -
C++ 这些情况你应该使用按值传递(附带详细解释)—————C++2.0 知识点补充
C++2.0 知识点补充文章目录C++2.0 知识点补充1 某些情况下考虑按值传递1 某些情况下考虑按值传递需要按值传递的条件:对于可复制的、在移动成本低廉的并且一定会被复制的形参,按值传递可能会和按引用传递的具备相近的效率,并且可能生成更少量的目标代码。条件解读和示例代码如下:按值传递的好处:1,只需要考虑按值传递 (相对于重载版本只要撰写单个函数;相对于万能引用版本可以避免万能引用带来的一系列问题)【效率可能没有剩余两者高】;2,仅针对可复制的形参,才考虑按值传递(如果形参是只移动类原创 2021-11-29 21:15:00 · 340 阅读 · 0 评论 -
C++ 你应该考虑置入操作(emplace)而非插入操作————C++2.0知识补充
C++2.0知识补充文章目录C++2.0知识补充1 某些情况下考虑置入而非插入1.1 拥有置入操作的容器1.2 置入操作占优的条件1.3 注意事项1 某些情况下考虑置入而非插入1.1 拥有置入操作的容器1,emplace_back可用于任何支持push_back的标准容器;2,emplace_front可用于任何支持push_front的标准容器;3,任何支持插入操作(除了std::forward_list和std::array以外的所有标准容器)都支持置入操作;4,关联容器提供了empla原创 2021-11-29 21:00:00 · 645 阅读 · 0 评论 -
C++切片问题(按值传递导致的问题)————附带示例代码
文章目录1 结论2 切片问题1 结论C++的基类型不适合按值传递,因为按值传递可能回到切片问题。2 切片问题问题说明:对于声明按值传递的形参,传入的任何派生类型对象的派生特征都会被截切掉。示例代码如下:class Derive : public Base{ void specail(){}};void processBase(Base b){// b.specail();//报错}int main(){ Derive d; processBase(d)原创 2021-11-29 00:07:23 · 1094 阅读 · 0 评论 -
C++并发API使用【async、thread、atomic、volatile】————C++2.0第十六讲
文章目录并发API使用0 基本知识1 并发API使用1.1 优先选用基于任务而非基于线程的程序设计1.2 在异步的情况下使用`std::launch::async`1.3 期值的存储和使用1.3.1 期值的存储1.3.2 期值析构函数的行为1.3.3 期值信道对象1.3.4 期值信道使用1.4 使用`std::atomic`进行多线程数据访问2 注意事项2.1 使`std::thread`类型对象在所有路径皆不可联结并发API使用0 基本知识硬件线程(逻辑核):实际执行计算的线程(硬件线程数 = 物原创 2021-11-28 17:08:47 · 841 阅读 · 0 评论 -
lambda表达式原理、高级使用(广义捕获)和避坑————C++2.0第十五讲
文章目录lambda表达式使用和避坑0 准备1 使用1.1 初始化捕获/广义捕获(generalized lambda capture)1.1.1 `std::bind`补充1.2 对`auto&&`类型的形参使用`decltype`并使用`std::forward`传递2 注意事项2.1 避免默认捕获方式lambda表达式使用和避坑0 准备基本概念:lambda表达式:表达式的一种;闭包是lambda式创建的运行期对象,根据不同的捕获模式,闭包会持有数据的副本或引用;闭包类是原创 2021-11-25 20:51:08 · 1286 阅读 · 0 评论 -
C++中的c_str()函数用法
语法:const char *c_str();c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同.这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。1.c_str是一个内容为字符串指向字符数组的临时指针;2.c_str返回的是一个可读不可改的常指...转载 2019-02-28 21:48:22 · 49027 阅读 · 1 评论 -
智能指针(unique_ptr、shared_ptr、weak_ptr、auto_ptr)(C++11/14)—————C++2.0第十三讲
文章目录0 结论1 裸指针的坏处2 智能指针概述2.1 std::auto_ptr2.2 std::unique_ptr3 高效使用std::unique_ptr3.1 形式3.2 使用情景0 结论1 裸指针的坏处裸指针的声明没有指出指向单个对象和一个数组;从裸指针的声明中不知道指针是否拥有其指向的对象;不知道如何析构才合适;使用deleted运算符时,一旦把delete(对象)和delete[](数组形式)用错,就会导致未定义;要保证析构在所有代码路径上仅执行一次也是十分困难的,如果析构次原创 2021-08-18 20:48:02 · 738 阅读 · 0 评论 -
理解特种成员的生成机制(C++11/14)—————C++2.0第十二讲
文章目录0 结论1 特种成员函数特点2 移动操作0 结论特种成员函数:C++中会自动生成的成员函数;默认函数、析构函数、复制函数、移动操作移动操作仅当类中未包含用户显示声明的复制操作、移动操作和析构操作时才生成;成员函数模版在任何情况下都不会一直特种成员的生成;复制函数尽在类中不包含用户显示声明的复制构造函数时才生成,如果该类中声明了移动操作则复制构造函数将被删除;复制赋值运算符函仅当类中不包含显示声明的复制赋值运算符才生成,如果该类声明了移动操作符,则复制赋值运算符将被删除;在已经原创 2021-08-03 23:45:52 · 189 阅读 · 1 评论 -
保证const成员函数的线程安全(C++11/14)—————C++2.0第十一讲
文章目录0 结论1 论据1.1 使用std::atomic2 使用互斥变量mutex0 结论保证const成员函数的线程安全,确定它们不会用在并发的语境中;运用std::atomic类型的变量会比互斥类型好,但std::atomic仅适用于单个变量或内存区域的操作。1 论据当存在数据竞险(由多个线程在没有同步的情况下读写同一块内存)时,如果单个要求的同步的变量或内存区域,使用std::atomic就足够了;如果有两个或更多变量或内存区域需要作为一整个单位进行操作时,就要用到互斥变量mut原创 2021-08-02 23:10:12 · 413 阅读 · 0 评论 -
优先选用const_iterator(C++11/14)—————C++2.0第十讲
文章目录0 结论1 论据0 结论优先选择const_iterator,而非iterator.在最通用的代码中,优先选择非成员版本的begin、end和rbegin,而非成员函数版本。1 论据在C++98中,对于std::vector<type>插入数据要用到vector<type>::iterator,...原创 2021-07-27 20:59:09 · 373 阅读 · 0 评论 -
只要能使用constexpr就尽量使用它(C++11/14)—————C++2.0第九讲
文章目录0 结论1 优势2 注意点0 结论constexpr对象都具备const属性,并由编译期已知的值完成;constexpr函数在调用时若传入的实参值是由编译期已知的,则会产出编译期结果;比起非constexpr对象或constexpr函数而言,constexpr对象或是constexpr函数可以用在一个作用域更广的语境中。1 优势constexpr是在翻译时期(编译、链接时期)就已知。在编译时期就已知的值,拥有许多特权。比如,可能被放到只读内存中(对于嵌入式工程师很有用);在编译原创 2021-07-26 23:38:09 · 356 阅读 · 0 评论 -
只要函数不发射异常,就添加noexcept声明(C++11/14)—————C++2.0第七讲
文章目录0 结论2 提高运行效率3 异常安全保证4 使用0 结论只要函数不会发射异常,就为其加上noexcept声明【接口中的组成部分】,调用方可能会对其产生依赖noexcept性质对于移动凑走、swap、内存释放和析构函数最有价值这样的影响:带有noexcept可以获得更多优化的机会,进而提高运行效率影响可以调用代码的异常安全性2 提高运行效率noexcept可以让编译器生成更好的目标代码。因为在带有noexcept声明的函数中,优化器不需要在异常传出函数的前提下,将执行期栈保持可原创 2021-07-23 22:58:23 · 443 阅读 · 0 评论 -
优先选择删除函数,而非private未定义函数(C++11/14)—————C++2.0第六讲
文章目录0 结论1 优点2 使用3 案例3.1 类外使用3.2 阻止模版特化0 结论如果想阻止其他程序员调用C++替我们自动声明函数或我们编写的某个特定的函数,最好的做法不是声明为private、未声明函数,而是使用删除函数(=delete)【删除函数无法通过任何方式使用】。1 优点1,任何函数都能成为删除函数,但是只有成员函数能声明为private;2,删除函数可以做到private成员函数做不到的阻止一些模版具现【因为模版特化必须在名字空间作用域而非类作用域内撰写】。2 使用习惯上,删原创 2021-07-22 08:38:55 · 235 阅读 · 0 评论 -
管理函数是否改写添加overide或final(C++11/14)—————C++2.0第八讲
文章目录0 结论1 改写虚函数2 引用修饰词0 结论仅出现在成员函数的末尾才有意义。在继承中有意改写的函数,使override声明,来让编译器检查是否满足改写的条件。成员函数引用修饰词是的对左值和右值对象(*this)的处理能够区分。与之相对应的还有final,应用于虚函数,会阻止它在派生类中被改写。如果final被用于一个类,会阻止该类被禁止用作基类。1 改写虚函数在派生类中改写虚函数,需要满足如下条件:1,基类中的函数必须是虚函数;2,基类和派生类中的函数名字必须完全相同(析构函原创 2021-07-21 00:21:08 · 202 阅读 · 0 评论 -
枚举类型优先使用限定作用域(C++11/14)—————C++2.0第四讲
文章目录0 结论1 枚举类型1.1 没有限定作用域1.2 使用命名空间1.3 限定作用域2 优势2.1 避免命名空间污染2.2 避免隐式类型转换2.3 可以进行前置声明,从而减少某些情况代码编译0 结论有限选择限定作用域的枚举类型。限定作用域的枚举类型尽在枚举类型内可见,只能通过强制类型转换至其他类型(减少命名空间污染);限定作用域的枚举类型和不限定范围的枚举类型都支持底层类型指定,限定作用域的枚举类型的默认底层类型是int,而不限定范围的枚举类型没有默认类型(避免隐式类型转换);限定作用域的类原创 2021-07-19 00:12:41 · 621 阅读 · 1 评论 -
C++函数指针简述
文章目录1 类外函数指针1.1 取别名时使用1.2 作为函数参数1.3 使用指针数组2 类内函数指针1 类外函数指针函数指针实际上就是一种类型。1.1 取别名时使用int test(int a, int b){ return a + b;}typedef int(*FP)(int, int);int main(){ FP t1 = test; cout<<t1(2, 3)<<endl; return 0;}1.2 作为函数参原创 2021-07-18 22:35:45 · 132 阅读 · 0 评论 -
使用别名声明,而非typedef (C++11/14)—————C++2.0第三讲
文章目录0 结论1 原因0 结论尽量使用别名声明代替typedef。1 原因typedef用于给类型声明别名,类型中比较常用的就是带依赖的类型必须在前面加typedef。一般情况:typedef long LL;typedef int(*FP)(int, int);带依赖类型:class Widget{};template<typename T>class MyAlloc : public allocator<T> {//memory头文件};原创 2021-07-18 00:09:55 · 322 阅读 · 2 评论 -
深入探索C++类型推导auto/decltype的原理和应用(C++11/14)—————C++2.0第一讲
文章目录原创 2021-06-16 22:04:14 · 1549 阅读 · 5 评论 -
区分右值引用和万能引用(引用折叠reference collapse)————C++2.0
文章目录0 特征1 区分于右值引用0 特征T&&就是一个万能引用,表示既可以是右值引用,也可以是左值引用,二者取一。具体取左值还是右值取决于初始化的参数。例如:template<typename T>void f(T&& param);Widget w;f(w);//左值引用f(std::move(w));//右值引用1 区分于右值引用当使用场景为类型推导的函数模版的形参时,为万能引用。场景一:template<typename原创 2021-05-09 22:29:00 · 313 阅读 · 0 评论 -
C++通用引用计数类/句柄类/指针类【智能指针(share_ptr)、右值引用】————附带详细代码
文章目录0 背景1 讲解2 完整代码示例0 背景1 讲解2 完整代码示例#include <iostream>using std::cout; using std::endl;#include <vector>#include <stdexcept>class Core;class Derive;template <typename T>class ReferenceHandle{public: ReferenceHandl原创 2021-04-15 20:54:23 · 315 阅读 · 0 评论 -
C++之今生前世
文章目录0 总结1 诞生2 C++的优缺点2.1 缺点:2.2 优点:2 目前使用群体3 C++ 204 C++之父介绍4.1 工作经历4.2 爱好4.3 建议4.3.1 平衡4.3.2 出色的程序员0 总结本次内容源自InfoQ技术实验室对C++之父Bjarne Stroustrup的一次采访【2019年Bjarne Stroustrup来中国上海出差之时】。1 诞生Bjarne Stroustrup刚工作进入贝尔实验(每年写一张纸来汇报自己这一年做了什么),原本想创建一个分布式系统,但是由于没有原创 2020-12-25 13:29:37 · 286 阅读 · 1 评论 -
C++删除多维数组或者向量------附详细代码和实例
文章目录0 背景1 删除多维数组1.1 法一 :遍历清空1.2 法二:fill1.3 法三:memset1.4 测试代码2 删除多维向量0 背景之前,经常操作的都是一维的数组或者向量,但是实际项目里却有多维数组或者向量的操作,因此初始化清空操作是必须的,网上查阅了一些资料加上自己的实践终于实现了清空操作。1 删除多维数组以三维数组为例:double A[30][4][100];清空操作:1.1 法一 :遍历清空 for(int i = 0;i < 30;i++){原创 2020-08-31 21:46:24 · 1230 阅读 · 0 评论 -
#pragma pack用法简介
文章目录1 起因2 说明3 使用1 起因使用到这个的原因是因为要使用TCP传输结构作为通信协议,但是结构提中的变量可能不是同一个数据类型的,因此会存在变量对齐的问题,使用sizeof(结构体)计算结构体所占字节数,就会存在不是实际的字节长度的问题。2 说明使用#pragma pack(n)来设定变量以n字节对齐方式,对齐存在两种形式:1, n大于该变量所占字节数,偏移量使用默认的对齐方式2,n小于该变量所占字节数,偏移量为n的倍数3 使用对齐的字节数为n#pragma pack (n)原创 2020-06-08 13:34:37 · 862 阅读 · 0 评论 -
C++实验室之auto易错点小结——只用于读操作
1 源码复现测试1:#include<iostream>#include<vector>using std::vector;struct Node{ int value; int key; Node(int _v,int _k):value(_v),key(_k){}};int main(int argc, char *argv[]){ vector<Node> vec; vec.push_back(Nod原创 2020-05-22 10:39:04 · 314 阅读 · 0 评论 -
强制类型转换详解 C++———— static_cast、dynamic_cast、const_cast、reinterpret_cast
文章目录1 起因2 C++强制类型转换3 总结1 起因之前使用类型转换,一般都会使用short a = 10;int b = (int) a;然后Qt creator就会爆出:原因就是使用了旧时的风格,也就是C语言的风格,存在安全隐患。因此我查询了C++如何进行强制类型转换。2 C++强制类型转换静态static_cast<要转换的类型>被转换的变量,动态dynamic_cast<要转换的类型>被转换的变量。区别:static_cast<>是在编原创 2020-05-19 10:56:08 · 650 阅读 · 2 评论 -
为什么说C++太复杂?复杂的必要性是为什么?
文章目录1 常见观点2 反驳观点3 为什么要解决的问题越复杂,工具就不得不复杂?3.1 类库和语言语意3.2 折中方案3.3 复杂度的守恒1 常见观点可以轻易的找出许多文献说明C++太复杂了,例如学习C++的书籍的厚度。这样以至于C++的设计者Bjarne都曾怀疑具有类的C是不是已经太庞大了。因为,总有大量对语言的新特性的要求:对如何利用现有特性完成某些任务没有足够的了解天生喜欢评价...原创 2020-05-05 09:54:01 · 18656 阅读 · 17 评论 -
list为什么“越界”了,还能输出值
1 问题list<int> List; List.push_back(1); List.push_back(2); List.push_back(3); List.push_back(4); List.push_back(5); List.push_back(6); list<int>::iterator itera...原创 2020-04-24 11:11:03 · 818 阅读 · 0 评论 -
使用小细节——C++ list的erase和remove
文章目录1 erase(搭配迭代器)2 remove(搭配值)平时一般使用都是vector,但是涉及到频繁删除元素的时候,就会用到list,因为vector每次删除后,删除元素后面的每个元素的迭代器都要重新分配。1 erase(搭配迭代器) list<int> List; List.push_back(1); List.push_back(1); L...原创 2020-04-24 10:21:30 · 8652 阅读 · 9 评论 -
为什么使用C++?————深层次讲解
文章目录1 C++特点2 为什么使用C++?3 简单的例子说服他人使用C++?通常语言都是一种工具,无论是编程语言还是其他语言。追根溯源就是解决问题的工具。通常都不是为了特定的工具挑选合适的问题,而是为了选择被该软件兼容的工具。**对待任何编程语言的态度都是合适时,就采用这一种,如果另一种更管用,就选用另一种。**因此如何选择一门编程语言是十分重要的。1 C++特点1 抽象。选择性忽...原创 2020-04-17 23:39:54 · 1197 阅读 · 0 评论 -
正则表达式(regular expression)————以Qt为例
文章目录1 应用2 简介2.1 组成2.2 特殊字符2.2.1 匹配多个字符串2.2.2 替换字符串2.2.3 统计字符出现次数2.3 Qt中使用3 regexp结构集合3.1 表达式3.2 量词3.3 断言3.4 通配符4 文本捕获4 QRegularExpression4.1 模式字符串4.2 设置模式1 应用1验证:测试一个子字符串是否是符合一些规范。(例如:是否是一个整数或者不包含任...原创 2020-04-17 00:10:33 · 1267 阅读 · 0 评论 -
C++传递数组作为参数,但是避免使用弊端
文章目录1 问题2 解决方法2.1 使用引用2.2 提供额外参数1 问题由代码代码可以看出,数组作为参数传递时,输出数组长度只是数组一个指针变量的大小(由于电脑是64位机器,因此输出64位,即8字节)【传递的是数组的首地址,即指向第一个元素的指针】。也就是函数和编译器都不知道传递给它的数组的实际长度。#include <iostream>using std::cout; us...原创 2020-04-10 22:25:04 · 558 阅读 · 0 评论 -
C++中string和int类型相互转化(多种方法实现)
文章目录1 使用函数2 使用流3 ASCII码1 使用函数使用函数//int转string//c++11标准增加了全局函数std::to_string:int num = 1;string str = to_string(1); //string转int//可以使用std::stoi/stol/stoll等等函数//分别对应int、long,long long //s...原创 2020-03-31 22:08:16 · 865 阅读 · 0 评论 -
学习C++的后续方法————第十六章心得
《Accelerate C++》这本书其实很久之前就已购入手中了(由于此书已经绝版了,网上被炒到了几百 ),但是由于某些原因,一直没能拜读(传说中的最佳C++入门书籍 ),说来也是惭愧。一说起C++的入门书籍,大家也许都会想到《C++ Primer 》、《C++ Primer Plus》、《C++ 程序设计语言》,这两本像字典一样厚的书籍,刚开始就吓退了许多初学者。这两本自己大一的时候也曾读过,...原创 2020-03-21 14:50:43 · 395 阅读 · 0 评论 -
自我复制程序
文章目录1 代码2 思想1 代码```c#include <stdio.h>int main() { char *s = "#include <stdio.h>%cint main() { char *s = %c%s%c; printf( s, 10, 34, s, 34 ); return 0; }"; printf( s, 10, 34, s, 34 ); r...原创 2020-03-21 00:05:43 · 1166 阅读 · 0 评论