- 博客(12)
- 资源 (2)
- 收藏
- 关注
原创 C++中新式的字符串字面常量(String Literal)
RawString允许我们定义字符序列(charactersequence),做法是确切写下其内容使其成为一个rawcharactersequence。Rawstring以R"(开头,以)"结尾,可以内含linebreak。如果要在rawstring内写出)",可使用定义符(delimiter)。因此一个rawstring的完整语法是。,其中delim是个字符序列,最多16个基本字符,不包含反斜线、空格、小括号。...
2022-07-28 21:52:14 995 1
原创 C++中的auto_ptr
许多资源被动态分配于heap(堆区)内而随后被用于单一区块或函数内,它们应该在控制流离开那个区块或函数时被释放。auto_ptr就是针对以上的形式设计的。auto_ptr是一个”类指针对象“,也就是所谓的”智能指针“,其析构函数自动对其所指对象调用delete。class Investment{......};//base 类Investment* CreateInvestment();//返回指针,指向Investment继承体系内的动态分配(new)对象void f(){ Investme
2022-04-10 17:08:11 1285
原创 c++经典递归算法之求阶乘
int algorithm(int N){ if(N <= 1) { return 1; } return algorithm(N-1) * N;}
2021-12-23 22:09:09 652
原创 c++ STL容器特征总结
STL中顺序容器和关联式容器类的主要特征如下:一、vector(1)内部数据结构:连续存储,例如数组。(2)随机访问每个元素,例如通过下标访问。(3)在末尾增加OR删除元素所需的时间与元素数目无关,但在中间或开头增加或删除元素所需时间随元素数目呈线性变化。(4)可以动态的增加或减少元素,内存管理自动完成,reserve()成员函数管理内存。tips:使用vector时,要是事先知道要存的元素数目时,用reserve()预先分配需要的内存空间,既可以保护迭代器不失效,又可以提高运行效率。二、de
2021-12-23 21:14:03 1332
原创 c++冒泡排序
冒泡排序的基本思想:相邻的元素两两比较,较大的数下沉,较小的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。冒泡排序的步骤是:(1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。(2)每趟从第一对相邻元素开始,对每一对相邻元素作同样的工作,直到最后一对。(3)针对所有的元素重复以上的步骤,除了已排序过的元素(每趟排序后的最后一个元素),直到没有任何一对数字需要比较。引用网上一张经典的Gif具体代码,这里采用STL的vector容器实现v
2021-12-23 11:34:10 676
原创 free和delete把指针怎么啦
char* p=(char*)malloc(100);strcpy(p,"hello");free(p); //p所指向的内存被释放,但是p本身仍然不变if(p!=NULL){ strcpy(p,"world");// 运行时错误}上述代码,用调试器跟踪就会发现指针p被free以后其地址仍然不变(不等于NULL),只是该地址对应的内存是垃圾-----p成了“野指针”!如果此时不把p设置为NULL,会让人误以为p是个有效的指针。常见内存错误及对策上述链接中讲到,记不住指针p是否被释放时用
2021-12-22 21:42:51 388
原创 c++常见内存错误及其对策(最容易出现的内存管理问题)
动态分配内存都创建在堆(heap)区。错误一:内存未分配成功,却使用了它。解决办法:在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查以避免输入非法参数。如果是用malloc()或new来申请内存,应该用if(p==NULL)、if(p!=NULL)来进行错误处理!错误二:内存虽然分配成功,但尚未初始化就使用它。犯错的原因:一是没有初始化的意识;二是误以为分配好的内存会初始化为全零,导致引用初值错误(例如数组和局部变量)。解决办
2021-12-22 21:22:22 1546
原创 c++异常处理和RTTI
RTTI(Run-timeType Identification)1.异常处理的原理传统的错误处理是用不同的数值来表示不同类型的错误,其表达能力很有限,因为:一个数字包含的信息量人少。C++异常处理机制将异常类型化,显然一个类型要比 一个数字包含的信息量大得多。比如我们常用的函数fopen(),当打开文件失败时返回 NULL。按照传统的错误处理方法,在调用fopen()后立即检查其返回值,如果为 NULL 就进行错误处理。但是如果将返回 NULL 改为抛出异常 OpenFaied,那么我们就不用
2021-12-22 17:06:17 139
原创 c++的const成员函数
const 成员函数(常函数)任何不会修改数据成员的成员函数都应该声明为const类型!如果在编写const成员函数时不慎写下了试图修改数据成员的代码,或者调用了其他非const成员函数,编译器就会指出错误。class Stack{public: void Push(int elem); int Pop(void); int GetCount(void) const; //const成员函数 private: int m_num; int m_data[100];}in.
2021-12-22 16:28:47 219
原创 c++运算符的重载
1.基本概念在C++中,可以用关键字operator加上运算符来表示函数,叫做运算符重载。运算符重载函数是一种特殊形式的函数,即运算符本身就是函数名,并且不改变他们作为内置运算符时的使用方法。例如两个复数相加:Complex operator +(const Complex& a,const Complex& b);运算符与普通函数在调用时的不同之处在于:对于普通函数,实参出现在圆括号内;而对于运算符,实参出现在其两侧(或一侧),例如:Complex a,b,c;...c .
2021-12-22 15:45:14 119
原创 C++的抽象基类
抽象基类的定义:当我们把类看作一种数据类型时,通常会认为该类肯定是要被实例为一个或多个对象的。但在很多情况下,定义那些不能实例化出对象的类是很有用的,例如一个抽象基类Shape的纯虚函数Draw()它并不知道自己要画一个什么形状,具体画什么圆啊,矩形啊等等都由派生类决定。因此依据这个可以将类分为抽象类(不能实例对象)和具体类OR实现类(可以实例对象)。抽象类的唯一目的就是让其派生类继承并实现它的接口方法(例如上面谈到的Draw()),因此也通常被称为抽象基类。抽象基类的创建如果将基类的虚函数声明为纯虚
2021-12-22 11:54:40 1732
原创 c++构造函数的成员初始化列表
构造函数的成员初始化列表构造函数初始化列表的使用规则如下:(1)如果类存在继承关系,派生类可以直接在其初始化列表里调用基类的特定构造函数以向它传递参数,因为我们不能在初始化对象时访问基类的数据成员。class A {...public: A(int x); //A的构造函数};class B:public A {... B(int x,int y); //B的构造函数};B::B(int x,int y):A(x) //在初始化列表里调用A的构造函数{....
2021-12-20 22:18:39 736
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人