C++
文章平均质量分 92
indomitable@I
踏着层层阶梯攀登
展开
-
【C++】动态内存管理
C语言中动态内存管理方式:malloc/calloc/realloc共同点:1.堆上2.需要手动释放(free())3.强制类型转化4.判空5.C标准库不同点:malloc返回值类型:void* malloc(字节数-》需要用户手动计算)判空–类型转换calloc: 两个参数void* callocrealloc:(void* ptr,size_t size)2.C+...原创 2020-03-29 14:09:07 · 236 阅读 · 0 评论 -
C++】模板特化的应用---类型萃取
在C++中,内置类型的遍历,我们只需要进行浅拷贝就可以,但自定义类型就不一定了。比如之前类与对象中,如果类中对象涉及到资源,我们使用深拷贝的方式进行拷贝构造等操作,如果不涉及资源,则使用简单的浅拷贝,在模拟实现string类\vector等中也遇到。这样虽然可以,但代码效率低。所以,为了将内置类型与自定义类型区分开,就有了类型萃取,它是类模板特化的应用。那么我们先来了解类模板特化以及非类型模板参...原创 2020-02-26 15:52:01 · 337 阅读 · 0 评论 -
C++】浅谈 模板
简单来说,模板就是一个模具,比如你做蛋糕,我们给这个模具中放入不同的料,最后得到了不同味道的蛋糕。C++中也有这样一个模子,给编译器一个模子,让它根据不同类型利用该模子来生成代码。模板是泛型编程的基础。模板分为函数模板和类模板函数模板代表一个函数家族,与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。函数模板不是真正的函数,是编译器生成代码的规则格式:template&l...原创 2020-02-25 20:49:14 · 160 阅读 · 0 评论 -
C++】vector与list的区别
主要不同如下:不同之处vectorlist底层结构动态顺序表,一段连续空间带头结点的双向循环链表随机访问支持随机访问,访问某个元素效率O(1)不支持随机访问,访问某个元素效率O(N)插入和删除任意位置插入和删除效率低,需要搬移元素,时间复杂度为O(N),插入时可能需要增容,ps:增容:开辟新空间,拷贝元素,释放旧空间,导致效率更低任意位置插入和删除效...原创 2020-02-25 14:43:16 · 91 阅读 · 0 评论 -
优先级队列
优先级队列,本质上是堆是一种容器适配器,根据严格的弱排序标准,她的第一个元素总是它所包含的元素中最大的(默认情况下是大堆)默认情况下,使用vector作为其底层存储数据的容器默认创建的是大堆,其底层按照小于的方式比较#include<queue>void Priority_QueueTest(){ priority_queue<int> q1;//构造空的...原创 2020-02-21 15:19:28 · 102 阅读 · 0 评论 -
对浅拷贝、深拷贝、写时拷贝的简单认识
浅拷贝也称位拷贝或值拷贝。如果对象中管理资源,编译器只是将对象中的值拷贝过来,就会导致多个资源共享一份资源,当一个对象销毁时就会将该资源释放,而这时另一些对象不知道该资源已经被释放,以为还有效,所以,对资源继续操作,就会发生访问违规的情况比如在模拟实现string类时,构造函数中管理了资源,拷贝构造、赋值运算符重载用浅拷贝的方式会导致资源多次释放,也会导致内存泄漏我们只是将s1的值放到s2中...原创 2020-02-14 20:34:10 · 176 阅读 · 0 评论 -
单例模式:饿汉模式与懒汉模式
一个类只能创建一个对象,这就是单例模式。该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。单例模式有两种实现模式:饿汉模式程序启动时就创建一个唯一的实例对象1.创建一个唯一的对象,构造函数首先要是私有的,只允许创建唯一的对象时调用2.定义一个私有的静态成员变量,在类内由定义的静态成员函数调用3.为防止通过拷贝构造函数、赋值运算符重载创建对象,...原创 2020-02-10 21:08:40 · 119 阅读 · 0 评论 -
如何防止类被拷贝?
类怎样可以被拷贝,就是调用拷贝构造函数,和赋值运算符重载,那我们把它们设置成私有的就好了class Test{public: Test() {}private: //C++98 Test(Test& t); Test& operator=(const Test&); //C++11 //Test(Test& t) = delete; //Te...原创 2020-02-09 20:54:39 · 358 阅读 · 0 评论 -
C++:设计一个类,该类只能在堆上创建对象
创建对象:需要申请空间,然后在申请的空间上调用构造函数,完成对象的创建方法:构造函数私有化1.将构造函数设置为私有的,在类外就防止别人调用;2.类外不能调用类内的私有成员函数,但类内可以,所以通过在类内实现一个静态成员函数完成对象的创建3.将拷贝构造函数也要声明成私有的,我们本身不需要,但为了防止别人通过拷贝构造在栈上创建对象(PS:步骤3 是C++98中的,还有简单的,不用管权限,在C+...原创 2020-02-09 13:01:38 · 204 阅读 · 0 评论 -
C++】Date类(日期与天数加减、日期与日期加减)
实现日期与天数的加减、日期与日期的加减#include<iostream>#include<stdio.h>#include<stdlib.h>using namespace std;class Date{public: Date(int year, int month, int day)//构造函数 { if (year > 0 &...原创 2020-02-07 15:23:07 · 4263 阅读 · 0 评论 -
C++】如何重载 输出和输入?(友元函数)
因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置,所以,没有办法将operator<<重载成类的成员函数。this指针默认是第一个参数,也就是左操作数,但在实际使用中cout需要的是第一个形参对象,才能正常使用,所以我们要将operator<<重载成全局函数,为了让类外可以访问成员,就需要友元函数来解决了。说明:友元函数可访问类的私有成员,但不是...原创 2020-02-04 20:40:49 · 1379 阅读 · 0 评论 -
C++】实现一个类,计算程序中创建出了多少个类对象
我们应该要知道,计数的变量,不能包含在每个对象中,应该是所有对象共享。如下:只是计数了当前对象的内容,所以不能采用代码1(定义了普通类型的变量)class Test{public: Test() :t_count(0) { t_count++; } Test(Test& a) { t_count++; } ~Test() { t_count--; }...原创 2020-02-04 13:09:21 · 2258 阅读 · 3 评论 -
C++】构造函数
在创建对象(实例化对象)时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值,这个初始值不能称为类对象成员的初始化,构造体中的语句只能将其称作为赋值。因为初始化只能初始化一次,而构造体内可以多次赋值。构造函数的初始化列表初始化列表只有构造函数有,其他函数都没有注:1.每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)2.类中包含一下成员,必须放在初始化列表位置进...原创 2020-02-04 09:24:47 · 131 阅读 · 0 评论 -
C++ 】类的6个默认成员函数2 (赋值运算符重载、const成员函数、取地址及const取地址操作符重载)
4.赋值运算符重载运算符重载原因是:自己给的运算符不支持运算符的操作运算符重载:目的是为了增强代码的可读性,运算符重载是具有具体特殊函数名的函数,也是具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通函数类似。函数原型:返回值类型 operator操作符(参数列表)其中,关键字operator后面接需要重载的运算符符号,operator操作符–>相当于函数名字注:...原创 2020-02-04 09:24:17 · 416 阅读 · 0 评论 -
C++ 】类的6个默认成员函数1( 构造、析构、拷贝构造函数)
类的6个默认成员函数之前说,如果一个类中的什么成员都没有,就称为空类。其实,并不是这样的,任何一个类在我们什么都不写的情况下,都会自动生成6个默认成员函数。1.构造函数构造函数是一个特殊的成员函数,因为,构造函数的名称虽然是构造,但要注意构造函数的主要任务并不是开空间创建对象,而是初始化对象。(可以在创建对象时直接初始化)特征:1.函数名与类名相同2.无返回值3.对象实例化时编译器...原创 2020-02-01 18:43:53 · 939 阅读 · 0 评论 -
C++-----类与对象1(类的引入、封装、实例化)
什么是类,什么是对象?对象(就是一个实体,但计算机识别不了实体,所以让计算机认识实体,就需要把实体抽象成一个对象)类相当于类型,类是对对象的描述1.类的引入C语言中,结构体只能定义变量(数据和数据操作的方法是分离开的),在C++中,结构体内不仅可以定义变量,也可以定义函数struct Stu{//定义函数 void InitStudent(char* name, int age, ...原创 2020-01-25 20:50:02 · 286 阅读 · 0 评论 -
C++:内联函数、auto关键字
内联函数以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。特性:1.内联函数是一种以空间换时间的做法,省去调用函数额外开销,所以代码很长或者循环/递归的函数不适宜使用作为内联函数2.inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略...原创 2020-01-23 22:19:05 · 477 阅读 · 1 评论 -
C++:入门知识三---引用
引用(取别名)引用不是一个新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间格式: 类型& 引用变量名(对象名)=引用实体;引用在定义时必须初始化一个变量可以有多个引用引用一旦引入一个实体,再不能引入其他实体...原创 2019-07-21 15:26:47 · 137 阅读 · 0 评论 -
C++:入门知识二(函数重载、名字修饰、extern "C")
函数重载函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。例1:(函数重载)函数都是Add函数,参数个数为2,顺序相同,但参数的类型不同,第一个为整型,第二个为浮点型int Add(int left, int right){ return left ...原创 2019-07-21 13:25:28 · 188 阅读 · 0 评论 -
C++:入门知识一(命名空间、输入&输出、缺省参数)
命名空间使用目的: 对标识符的名称进行本地化,以避免命名冲突或名字污染(也就是可以把名字隔离起来)定义命名空间? 需要使用一个关键字namespace,后面跟命名空间的名字,然后接一对{} 即可,{}中即为命名空间的成员。注:1.命名空间中的内容,既可以定义变量,也可以定义函数2.命名空间可以嵌套3.同一工程中允许存在多个相同名称的命名空间...原创 2019-07-20 13:47:23 · 243 阅读 · 0 评论