
C\C++语言
C\C++语言的编程方面
dwp1147170607
这个作者很懒,什么都没留下…
展开
-
C++中的类型转换
c++除了能使用c语言的强制类型转换外,还新增了四种强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast,主要运用于继承关系类间的强制转化。新式转换较旧式转换更受欢迎。原因有二,一是新式转型较易辨别,能简化“找出类型系统在哪个地方被破坏”的过程;二是各转型动作的目标愈窄化,编译器愈能诊断出错误的运用。尽量少使用转型操作,尤其是dynamic_cast,耗时较高,会导致性能的下降,尽量使用其他方法替代。static_caststa.原创 2021-05-18 17:11:29 · 121 阅读 · 0 评论 -
C++的RAII机制
什么是RAIIRAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源。我们也可以使用STL中的shared_ptr来完成RAII的思想,参考下面例子。为什么要使用RAII在计算机系统中,资源是数量有限且对系统正常运行具原创 2021-05-07 21:50:52 · 187 阅读 · 0 评论 -
STL库算法概览
1、 查找对象的算法下面的STL算法都在头文件algorithm中,命名空间为std。简单查找算法find(beg, end, val)find_if(beg, end, unaryPred)find_if_not(beg, end, unaryPred)count(beg, end, val)count_if(beg, end, val)查找重复值算法adjacent_find(beg, end)adjacent_find(beg, end, binaryPred)sear原创 2021-05-07 11:32:00 · 451 阅读 · 0 评论 -
ANSI C标准中的预定义宏
LINE:在源代码中插入当前源代码行号FILE:在源文件中插入当前源文件名FUNCTION:在源文件中插入当前函数名DATE:在源文件中插入当前的编译日期TIME:在源文件中插入当前编译时间STDC:当要求程序严格遵循ANSI C标准时该标识被赋值为1__cplusplus:当编写C++程序时该标识符被定义...原创 2021-03-29 11:13:29 · 211 阅读 · 0 评论 -
c++在delete后要把指针赋值为nullptr
在C++中我们new了一个对象后,返回的是这个对象的指针,如QObject* pObject = new QObject();在使用完对象后,我们用delete删除这个对象,如delete pObject;如果我们没有在delete后将pObject赋值为nullptr,其实指针pObject是会指向之前的那个地址的,只是这个地址处的对象已经被析构了。所以如果我们用if(pObject)这样的条件来判断对象是否已被析构,其实是会有问题的。如果想要这样判断,我们可以在delete后将该指针赋值为nul.原创 2021-02-05 17:56:23 · 2067 阅读 · 0 评论 -
STL queue/priority_queue类模板
队列是一种先入先出(FIFO)的数据结构,数据从一端进入而从另一端移除。实际上queue是把各项操作转化为内部容器的对应调用,可以使用任何序列式容器来支持queue,默认为vector。#include <queue> //包含头文件#include <iostream>using namespace std; //定义 queue<int> que1; queue<int, list<int>> que2; que1.p.原创 2020-09-16 19:40:42 · 167 阅读 · 0 评论 -
STL stack类模板
栈是一种先入后出的容器,STL中的stack默认采用deque实现,我们在声明栈时可以使用其它的序列式容器(如vector,list)实现栈。#include <stack> //包含头文件#include <iostream>using namespace std; stack<int> s1; stack<int, vector<int>> s2; //用vector实现栈 s1.push(1); //push.原创 2020-09-16 13:08:05 · 208 阅读 · 0 评论 -
STL map与multimap类模板
容器map是一种关联数组,是键值对的集合,一个键只能对应一个值,可以通过键为下标获取对应的值。multimap一个键可以对应多个值。key和value必须是可赋值和可复制的,对象以数据对的形式存放在二叉树中。初始化,清空,删除,插入等基本操作#include <iostream>#include <map> //包含头文件using namespace std; //以给定的排序准则定义map, map<int, double> m1; ..原创 2020-09-16 00:14:00 · 245 阅读 · 0 评论 -
STL vector类模板
vector是一个序列式容器,可以实现队列、数组和堆栈的所有功能。像一个动态数组,可以随机访问元素,迭代器也是随机存取迭代器。#include <vector> //包含头文件#include <string>using namespace std;void main(){ vector<string> myvt; //初始化 myvt.push_back("a"); //将对象放入容器尾部 myvt.pop_back(.原创 2020-09-13 22:04:24 · 181 阅读 · 0 评论 -
利用迭代器指定区间
一般我们用迭代器指定区间时都是用begin和end方法,但当我们不想遍历至end是该怎么办呢?利用迭代器指定区间时不能将迭代器加上一个整数,否则会报错,如下所示会报错list_two.assign(list_one.begin(),list_one.begin() + 3);print(list_two);所以可以利用迭代器自增的方法实现list<double>::iterator it = list_one.begin();for(int i = 0;i < 3;i++)原创 2020-05-21 16:52:30 · 493 阅读 · 0 评论 -
构造函数、析构函数声明为私有、保护
构造函数不为public时,已经不能从外部调用构造函数了,但是对象必须被构造,应该如何解决?从语法上来讲,一个函数被声明为protected或者private,那么这个函数就不能从“外部”直接被调用了。对于protected的函数,子类的“内部”的其他函数可以调用之。而对于private的函数,只能被本类“内部”的其他函数调用。使用场景:继承使用:如果你不想让外面的用户直接构造一...原创 2020-05-05 22:29:41 · 1310 阅读 · 0 评论 -
C++中函数声明了就必须定义
在调试时,下面的代码报错,显示出现了未定义的引用。**在C++中所有声明了的函数都要定义,虚函数也不例外。**只有纯虚函数不用定义,但包含它的纯虚基类不能直接使用,要在派生后才能使用,在派生类中实现纯虚函数。下图中~cl_student()函数没有定义,只有声明,加上定义后即可编译链接通过。...原创 2020-04-22 23:09:49 · 2093 阅读 · 1 评论 -
C++类继承——公有继承
1 C++中的继承C++中的类的继承机制提供了较高层次的重用性。许多厂商提供了类库,类库由类声明和实现构成。类继承可以从已有的类中派生出新的类,派生类继承了基类的数据和方法。我们可以在派生类中添加新的类数据或类方法,此时称为公有继承。如果在派生类中修改了基类类方法的行为,那么称为多态公有继承。一般情况下,我们修改基类源码就可以实现派生类。C++的继承机制甚至不需要访问基类的源码就可以派生出...原创 2020-04-22 22:32:13 · 7658 阅读 · 0 评论 -
C语言链接原理
从链接原理上看:在编译时,gcc根据makefile的依赖关系,将头文件、实现文件、include进来的文件,组成一个编译单元,编译成一个目标文件。一般include进来的只是函数的声明,并没有实现!在链接器链接时,ln会根据makefile把main函数依赖的所有目标文件进行链接,静态库就是在这个时候链接进来的。//main.cpp#include <qDebug>#inc...原创 2020-04-22 14:59:10 · 981 阅读 · 0 评论 -
C++静态函数释疑
C++中静态函数限制函数的链接性为本文件,用static限定符限定。C++要求在函数的声明和实现中均要用static进行限定,这在单文件程序中容易理解,在多文件程序中,我们往往书写如下://main.cpp#include <qDebug>#include <asd.h>int main(){ qDebug() << plus(1,2);...原创 2020-04-22 11:26:35 · 366 阅读 · 0 评论 -
C++类中的静态成员
1 静态类成员变量无论创建了多少对象,程序都只创建一个静态类变量副本。这对于所有类对象都共享的具有相同值的类私有数据是很方便的。静态类成员变量单独存储,不是对象的组成部分。要在类的实现文件中对其进行初始化,因为如果在头文件中初始化,将头文件包含在不同的文件中时,会在多处出现初始化副本而出现错误。//student.h#ifndef CL_STUDENT_H#define CL_ST...原创 2020-04-22 10:27:44 · 301 阅读 · 0 评论 -
C++存储持续性、作用域和链接性
存储持续性决定数据保存在内存中的时间长度。有四种,自动存储持续性、静态存储持续性、线程存储持续性、动态存储持续性。作用域描述名称在文件的多大范围内可见。有两种,代码块作用域、文件作用域。链接性描述了名称如何在不同单元间共享。有两种,无链接性、内部链接性、外部链接性。1 变量的自动存储持续性默认情况下,在函数中声明的变量(包括函数参数)的存储持续性为自动的,作用域为局部,无链接性。自...原创 2020-04-21 23:55:56 · 271 阅读 · 0 评论