
C++学习
文章平均质量分 65
总结
lifecookies
这个作者很懒,什么都没留下…
展开
-
如何将在QT Creator中给exe设置应用图标并打包发布
【代码】如何将在QT Creator中给exe设置应用图标并打包发布。原创 2023-03-16 21:37:34 · 555 阅读 · 0 评论 -
Qt debug中的exe文件运行时显示缺少Qt5Cored.dll
在Qt安装目录的bin目录(笔者这里的路径是C:\Qt\Qt5.12.9\5.12.9\mingw73_32\bin)中找到该文件,把这里的Qt5Cored.dll文件复制到debug文件夹中。再次运行程序则发现已经没有问题了。具体做法是右击“计算机”,在弹出的级联菜单中选择“属性”,然后在弹出的系统属性对话框中选择“高级系统设置”项。不过Qt5Cored.dll有101MB,而Qt5Guid.dll有175MB,幸好这只是debug版,后面讲解的程序发布时的release版需要的dll文件是很小的。原创 2023-03-16 17:53:43 · 3418 阅读 · 0 评论 -
C++ 头文件 #ifndef #define #endif 作用及用法
头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的。还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是的。标识的命名规则一般是,,如:stdio.h。原创 2022-11-09 15:35:07 · 2738 阅读 · 0 评论 -
深入浅出——理解c/c++函数指针
函数的类型与地址我们来看下面这个典型的函数:int foo(){ return 5;}显然foo 是函数名,而int是函数返回值的类型。但是,函数有类型吗?有,函数有自己的类型,比如上面这个函数的类型即为“无参数且返回类型为整型”的函数。我们可以这么表示这种类型int (*somefunction)(),同样的,如果是“有两个整形参数且返回值是布尔型”的我们可以这么表示bool (someotherfunction)(int, int)有人认为这个不属于函数的类型,其实吧我只是觉着这么原创 2021-03-08 11:26:07 · 186 阅读 · 0 评论 -
智能指针与 引用计数 写时拷贝 &智能指针的简易实现
引用计数要正确的理解智能指针,首先必须理解引用计数技术。深拷贝、浅拷贝的概念深拷贝优缺点:优点:每一个的对象(哪怕是通过拷贝构造函数实例化的对象)的指针都有指向的内存空间,而不是共享,所以在对象析构的时候就不存在重复释放或内存泄露的问题了。缺点:内存开销大浅拷贝优缺点:优点:通过拷贝构造函数实例化的对象的指针数据变量指向的共享的内存空间,因此内存开销较小。缺点:对象析构的时候就可能会重复释放或造成内存泄露。 鉴于深拷贝和浅拷贝的优缺点,可采用引用计数技术,既减小原创 2021-03-06 21:44:46 · 365 阅读 · 1 评论 -
智能指针及RAII
智能指针及RAII问题C++中最令人头疼的问题是强迫程序员对申请的资源(文件,内存等)进行管理,一不小心就会出现泄露(忘记对申请的资源进行释放)的问题。// C++auto ptr = new std::vector<int>();//使用了垃圾回收技术,不在需要人为管理,相关的虚拟机会自动释放不需要使用的资源。// JavaArrayList<int> list = new ArrayList<int>();# Pythonlst = list(原创 2021-03-06 21:39:37 · 248 阅读 · 0 评论 -
C++链接属性
编译器将.cpp编译成.obj,而.obj就是编译单元。 一个程序,可以由一个编译单元组成,也可以由多个编译单元组成. 如果你不想让你的源代码变得很难阅读的话,就请使用多个编译单元吧。那么就是一个.cpp对应一个.obj,然后将所有的.obj链接起来(通过一个叫链接器的程序),组成一个.exe,这就是程序了。 如果一个.cpp要用到另一个.cpp定义的函数怎么办? 只需在这个.cpp中写上他的函数声明就可以了,其余工作由链接器帮你完成,你可以随便调用该函数,链接器将所有的.obj连接起来,但是注原创 2021-03-06 12:52:09 · 314 阅读 · 0 评论 -
继承(基类,父类,超类),派生类,子类
一:继承中的访问权限关系。1.基类,父类,超类是指被继承的类,派生类,子类是指继承于基类的类.2.在C++中使用:冒号表示继承,如class A:public B;表示派生类A从基类B继承而来3.派生类包含基类的所有成员,而且还包括自已特有的成员,派生类和派生类对象访问基类中的成员就像访问自已的成员一样,可以直接使用,不需加任何操作符,但派生类仍然无法访问基类中的私有成员.4.在C++中派生类可以同时从多个基类继承,Java 不充许这种多重继承,当继承多个基类时,使用逗号将基类隔开.5.基类访问控原创 2021-03-04 23:47:49 · 2922 阅读 · 1 评论 -
重载overload、覆盖override、隐藏hidden
《高质量C++/C编程指南》已经清晰的列出了重载函数的特性:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual关键字可有可无。这里注意:重载与返回值无关所以,仅仅靠返回值,是不能成为重载判定条件的。覆盖override(也成重写)覆盖,是指 派生类函数覆盖基类函数,只作用于派生类,特性如下(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual关键字。这里会用到虚函数,实际上虚原创 2021-03-04 23:47:07 · 239 阅读 · 2 评论 -
new与malloc的10点区别
New表达式为特定的类型分配内存,并且在新分配的内存中构造一个该类型的对象;自动运行合适的构造函数来初始化每个动态分配的类类型对象。申请的内存所在位置new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放原创 2021-03-04 23:46:40 · 92 阅读 · 1 评论 -
浅谈C++内存管理
1.从内存对齐讲起对于结构体变量内存对齐遵循以下三个原则:变量的起始地址能够被其对齐值整除,结构体变量的对齐值为最宽的成员大小。结构体每个成员相对于起始地址的偏移能够被其自身对齐值整除,如果不能则在前一个成员后面补充字节。结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节。此外还有编译器的默认对齐值,一般默认对齐值为4(结构体的实际对齐值会取结构体对齐值和编译器默认对齐值中较小的那一个)。那么为什么要内存对齐?为了减少使用的内存为了提升数据原创 2021-03-04 23:46:04 · 249 阅读 · 1 评论 -
【C++】char转变为string
char c='a';//注意 使用to_string 方法会转化为char对应的ascii码//原因是 to_string 没有接受char型参数的函数原型,有一个参数类型//为int 的函数原型,所以传入char型字符 实际是先将char 转化//为int 型的ascii 码,然后再转变为string//以下输出结果为 97cout << to_string(c) << endl;...原创 2020-10-06 10:40:37 · 636 阅读 · 0 评论 -
【C++学习】泛型算法
标准库提供的算法大多独立于任何特定容器,这些算法是通用的(generic 泛型的)可以作用于不同的容器 不同类型的元素。大部分算法在algorithm中,还有一些在numeric里。不直接作用于容器,而是用迭代器来指定元素范围1.1只读算法只读取元素不改变元素的算法1. find (开始范围,结束范围,搜索值 )如果找到就返回指向第一个匹配元素的迭代器。如果没有找到则返回第二个参数。vector中查找int val=42;auto result=find(vec.cbegin(),vec.原创 2020-09-21 10:44:48 · 101 阅读 · 0 评论 -
【C++学习之路】补充string的额外操作
构造string的其他方法string s(cp,n) s是cp指向数组前N个字符的拷贝,此数组最少包含n个字符string s(s2,pos2) s是string s2从pos2开始的字符拷贝,如果pos2>s2.size(),则构造函数行为未定义。string s(s2,pos2,len2) s是string s2从下标pos2开始的len2个字符的拷贝。如果pos2>s2.size()行为为定义,不管len2的值是多少,构造函数至多拷贝s2.size()-pos2个字符。sub原创 2020-09-08 10:22:45 · 155 阅读 · 0 评论 -
【C++学习】9.顺序容器 array,vector,string,deque,list,forward_list详解
元素在顺序容器中的顺序与其加入容器时的位置相对应。关联容器中的元素位置由元素相关联的关键字值决定所有容器类都共享公共的接口,不同的容器按照不同的方式对其进行拓展。一个容器就是一些特定类型对象的集合。顺序容器为程序员提供了控制元素存储和访问顺序的能力。访问顺序不依赖于元素的值,而是与元素加入容器时的位置相对性。标准库提供了三种容器适配器,分别为容器操作定义了不同的接口,来与容器类型适配。1.1 顺序容器概览所有的顺序容器都提供了快速访问元素的能力,但是这些容器在以下方面都有不同的性能折中原创 2020-09-08 10:22:34 · 315 阅读 · 0 评论 -
【C++学习】11章.关联容器 map set
关联容器支持高效的关键字查找和访问两个主要的关联容器是map和setmap中的元素是关键字-值(key-value)对:关键字起到索引的作用,值则表示与索引相关联的数据。set中每个元素只包含一个关键字:set支持高效的关键字查询工作——检测一个给定关键字是否在set中。标准库提供8个关联容器按关键字保存有序元素map关联数组:保存关键字-值对set关键字即值,即只保存关键字的容器multimap关键字可重复出现的mapmultiset关键字可重复原创 2020-09-05 16:49:38 · 228 阅读 · 0 评论 -
【C++学习之七】表达式
表达式 是由一个或者多个运算对象operand组成 对表达式求值得到一个结果result 字面值和变量是最简单的表达式,其结果就是字面值和变量的值,把一个运算符operator和一个或多个运算对象组合起来可以生成比较复杂的表达式。1.基础1.1基本概念按照作用的运算对象个数来分 有一元运算符,二元运算符,一个三元运算符,函数调用也是一种运算符,不过对数量没有限制。组合运算符和运算对象优...原创 2020-07-16 10:25:55 · 175 阅读 · 0 评论 -
【C++学习之(七).九】sizeof运算符
sizeof 运算符返回一条表达式或者一个类型名字所占的字节 ;满足右结合律运算符的运算对象有两种形式sizeof(type)sizeof (expr)第二种形式返回的是表达式结果类型的大小,与众不同的是 sizeof并不实际计算其运算对象的值sales_data data *psizeof(sales_data)=sizeof (data)//存储该类型的对象所占空间大小sizeof p//指针所占空间大小sizeof *p// p所指类型的空间大小 =sizeof(sales_da原创 2020-07-16 09:22:45 · 105 阅读 · 0 评论 -
【C++学习之七.八】位运算符
六个位运算符 左结合律~ 位求反<<左》右移&位与|位或^位异或 相同为0 不同为0位与(&)逻辑与(&&) 位或(|)逻辑或(||)运算对象可以是带符号的 也可以是无符号的。如果运算对象是带符号的且他的值为负,那么位运算符如何处理运算对象的“符号位”依赖于机器,而且左移会改变符号位的值。左移在右侧插入值为0的二进制位。右移运算符依赖左侧运算对象的类型;如果该运算对象是无符号类型,在左侧插入符号位副本或值为0的二进制位,如何选择要视具体环境而定原创 2020-07-15 21:28:28 · 286 阅读 · 0 评论 -
【C++学习之(六)】数组 多维数组 数组与指针 外层指针 内层指针
数组和向量一样是存放相同类型的对象的容器数组对比vector数组向量不可变长可变长通过下标访问通过下标访问灵活性差灵活性强性能好损失一些性能数组的初始化编译器在编译是就必须知道数组的大小和类型 所以必须初始化一个大于0的数组 ,且不能使用auto类型如果初始化超过列表大小将会报错如果小于,将会初始化为默认值(0或者空串)当使...原创 2020-04-01 20:40:16 · 222 阅读 · 0 评论 -
【C++学习之(五)】迭代器iterator
c++提供了很多容器 包括vector 对于容器 能够访问下标的是少数 但是所有的容器都能通过迭代器来访问迭代器有效范围:指向容器中的元素 或者尾元素的下一位置string类型不是容器 也可以通过迭代器来访问尾后迭代器:返回尾元素的下一元素如果容器为空,那么begin和end都指向尾后迭代器向量vector<int> i{1,2,3,4,5,6,7,8,9};vect...原创 2020-03-31 10:20:05 · 237 阅读 · 0 评论 -
【C++学习之(四)】标准库 vector
模板(template):c++ 有类模板和函数模板 模板不是具体的类或者函数 编译器根据模板创建的类或者函数的过程叫做实例化,当使用模板时应该告诉编译器 应该把类或者函数实例化何种类型vector就是一个类模板 class template定义和初始化vector对象列表初始化只能用花括号vector<string> s("the","c","is");//错误...原创 2020-03-30 20:12:01 · 180 阅读 · 0 评论 -
【C++学习之(三)】标准库String详解
string 初始化的方式一种是拷贝初始化(有等号的)string s="123";string s1=s;一种是直接初始化string s2("123");string s3(10,'c');string 定义的操作有string s="abc";string s1="aBc";bool b=s.empty();cout<<b<<endl;//...原创 2020-03-30 15:53:45 · 191 阅读 · 0 评论 -
【C++学习之(二)】详解const 常量指针 指向常量的指针 常量引用 指向常量的引用
当想定义一个不会被改变的变量时 可以用const 限定符加一限定由于const对象一旦创建后就不能改变 因此必须初始化const int i=42;const int j;//错误const int bufSize=512;bufsize=32;//can not be changeconst int i=42;i++;//不能操作初始化可以是任意复杂表达式const in...原创 2020-03-30 09:45:49 · 242 阅读 · 0 评论 -
Mac g++使用 终端编译
//转到所在目录touch test.cpp//新建g++ touch.cpp;//compile./a.out//运行 不起名字默认为a.out如果出错可使用vim 编辑vim test.cpp按i键进入编辑完成后esc:wq 保存推出重新编译运行...原创 2020-03-26 01:04:40 · 903 阅读 · 0 评论 -
【C++学习之(一)】引用和指针的区别 指向指针的指针 指向引用的指针详解
指针和引用的区别指向指针的指针指向引用的指针对于指针和引用他们都是c++ 中的复合数据类型引用相当于重命名 对引用和对原变量进行操作都会改变变量的值int i=42;int pi=&i;i++;//改变i值pi++;//同样改变了不允许出现引用的引用 因为应用并没用创建一个新的对象 而是为已有的一个对象创建了一个别名引用必须在声明时定义 不然报错int j=0...原创 2020-03-26 00:51:48 · 260 阅读 · 0 评论