
学习之路
文章平均质量分 88
Struggle¥
这个作者很懒,什么都没留下…
展开
-
C++学习之路-智能指针
通俗的讲智能指针:在创建时本质是智能指针类的对象,但我们完全可以当做指向T类对象的“指针”。原创 2022-09-02 17:23:15 · 1537 阅读 · 0 评论 -
C++学习之路-异常(exception)
首先我定义一个异常的基类,是我整个项目可能存在的所有异常的基类。// 所有异常的基类 class Exception {public ://异常发生时,说出到底是什么异常,这里写一个纯虚函数 };//除法异常 class DivideException : public Exception {public :return "不能除以0";} };//加法异常 class AddException : public Exception {public :return "加法操作出现异常"...原创 2022-09-01 15:34:24 · 1068 阅读 · 0 评论 -
C++学习之路-Lambda表达式
但是表达式,需要一个返回值指向这个表达式,也就是函数指针。通常我们采用auto直接指向,省事。然后,我们调用这个表达式的时候,就像函数一样:需要传入参数列表把mutable去掉,在表达式内部就不可以修改a或b的值。如果我在函数内部并没有修改a的值,那么mutable就可以省略,如果有修改捕获值的需求,那就得需要加上mutable。如果真的想修改a或者b的值,且不想用mutable,那就得采用引用传递了。因为,表达式中的捕获列表。......原创 2022-08-29 22:16:27 · 539 阅读 · 0 评论 -
C++学习之路-C++11的新特性
结果是执行的整型函数,因为NULL=0。C++11修复了这个bug,我们可以通过传入nullptr,达到调用第二个的目的。这属于编译器特性,不影响最终的机器码质量,不影响运行效率。意思就是写auto和写int,生成的二进制代码一样,只不过auto更华丽一些。因此,我们在本节讲述C++11标准相对于C++03所引入的新特性。因为NULL其实就是数字0,整型数字:0。下面举个例子说明:定义两个重载函数,一个传整型,一个传指针。所以说,nullptr是专业的空指针,NULL是专业的0和不专业的空指针。...原创 2022-08-29 15:58:40 · 351 阅读 · 0 评论 -
C++学习之路-类型转换
这些转换类型符可能根本就用不到,但是要知道功能是啥,也就是说要能看懂别人写的代码。仅此而已。原创 2022-08-29 15:27:39 · 663 阅读 · 0 评论 -
C++学习之路-类模板之泛型动态数组的实现
由于array是const类型的,所以array调用的所有函数都得是const成员函数,因此必须要额外将原本的成员函数变为const成员函数。比如,泛型类中的指向数组的指针类型。需要注意的是,没有类模板的时候,类名后面是不需要加< Item>的,一旦有了泛型之后,类名就和泛型绑定了,在每一个函数都要加。首先需要,声明一个动态数组类,成员变量包含:指向数组首元素的指针变量、当前数组的长度、初始化数组的容量。另一种做法不需要这样,那就是将函数变为友元函数,然后调用直接调用可以实现相同功能的成员变量即可。....原创 2022-08-26 20:57:47 · 1276 阅读 · 0 评论 -
C++学习之路-编译链接的细节
很多时候,我们会将函数的声明和实现分离。函数的声明通常声明在.h文件中,函数的实现通常实现在.cpp文件中。比如,我们想要定义两个数的加法运算,就可以这样写:在add.h中声明函数在add.cpp中实现函数我们知道,这样肯定没问题。但是,我们了解了模板,掌握了泛型的概念。可以用模板来优化函数重载,于是我们可能就会这样改进上述代码:在add.h中声明模板在add.cpp中实现模板此时,我们想要使用该模板函数,只需要在使用文件中引入add.h即可。...原创 2022-08-25 20:19:10 · 505 阅读 · 0 评论 -
C++学习之路-Template模板
了解模板之前,先了解一个概念:泛型。泛型,实质上就是不使用具体数据类型(例如 int、double、float等),而是使用一种通用类型来进行程序设计的方法,该方法可以大规模的减少程序代码的编写量,让程序员可以集中精力用于业务逻辑的实现。是一种将类型参数化进而达到代码复用的技术,强调的是,在C++中是使用模板来实现泛型。typename 后跟的“T”只是一个占位符而已,是自定义的,可以改成任意字符,只需要全部统一即可。但是,尽量统一,不要乱写符号,尽量写成T,因为T可以认为是Type的简称。}原创 2022-08-19 17:11:53 · 486 阅读 · 1 评论 -
C++学习之路-运算符重载
想要自由的定义运算符的左边是谁,右边是谁,那就需要定义为全局函数。如果该运算符仅仅跟某个类相关,那就优先定义为成员函数。如果实在不可以重载为成员函数,那就全局函数并且设置为友元函数。如果将运算符重载函数设置为private私有,那么外部就不可以实现运算符的重载。比如:ostream类下的cout对象即使返回的不是const类型,也不可以被赋值,就是因为C++内部将ostream的赋值运算符重载为private了。单例模式要求类外只能创建一个对象。即使我创建两个对象,这两个对象也是同一个对象。...原创 2022-08-15 16:25:44 · 1304 阅读 · 0 评论 -
c++学习之路-内部类和局部类
如果类A定义在类B里,那么类A就是一个内部类(也叫嵌套类)class Man // 内部类 {};};原创 2022-08-04 20:29:13 · 1137 阅读 · 0 评论 -
C++学习之路-友元
允许访问类的私有成员的函数,叫作该类的友元函数。friend 返回类型 函数名(参数列表);int m_x;int m_y;public :;} };友元函数必须写在类的大括号里面,至于写在private、public、protected哪个下面,都无所谓。将函数声明为该类的友元函数,也就意味着该函数是该类的朋友,那就可以随意访问该类的私有成员变量了(可以访问所有成员,包括public和protected的)。想要某个函数可以访问类中的私有成员,就设置为友元函数。...原创 2022-08-04 16:32:56 · 445 阅读 · 0 评论 -
C++学习之路-编译器自动生成的构造函数
在该类中,我声明一个空的虚函数。创建对象时,也会调用构造函数。意味着,编译器也会默认的创建一个无参的构造函数public :} };我们通过查看构造函数内部,发现存在这样的一个操作:将虚表地址放在对象内存的最前面,用于查找虚表(细节可以查看我之前的博文)博文中:一旦类中有虚函数,创建对象时,对象最前面会多出四个字节存放虚表地址类中存在虚函数时,即使不写构造函数,编译器也会默认的生成一个无参的构造函数,从而在函数内部完成虚表地址的存放。......原创 2022-08-03 17:37:37 · 1432 阅读 · 1 评论 -
C++学习之路-隐式构造
字面意思可以理解,我在创建对象的时候,本意不是想调用单参数的构造函数,但是由于我代码书写的原因,偷摸的调用了单参数的构造函数。上面那种荒唐的写法虽然没有错,但是会隐式的调用单参数构造函数,这其实是我们不想看到的。用explicit关键字修饰单参数的构造函数,表明这个单参数的构造函数不允许隐式构造,即不允许直接将单个值赋值给对象。构造函数分为无参构造函数,和有参构造函数。注意看这句代码,将一个int型的变量,传递给对象p4,看起来很荒唐。因为,表面上,我们看不出来这句代码在调用构造函数,才叫做隐式构造。...原创 2022-07-27 17:42:31 · 1869 阅读 · 0 评论 -
C++学习之路-对象类型的参数和返回值
尽量不要将对象作为函数的返回值,尽量不要直接将对象作为函数参数传递。返回值尽量不要用,对象作为参数时,要用引用或者指针,而不是直接对象值传递。不要用的目的就是,避免产生一些中间变量(也就是拷贝操作产生的多余变量).........原创 2022-07-27 10:23:50 · 989 阅读 · 3 评论 -
C++学习之路-拷贝构造函数
拷贝构造函数也是构造函数的一种。普通的构造函数可以是无参的,也可以是有参的。但是拷贝构造函数必须是有参的,如下所示,参数就是const类型的对象引用(格式固定,别问为什么)我们知道,当创建对象的时候会自动调用构造函数。那什么时候会调用拷贝构造函数呢?答案是:当利用已存在的对象创建一个新对象时(拷贝对象),就会调用新对象的拷贝构造函数进行初始化新对象的成员变量。拷贝对象,拷贝了什么?利用已经存在的对象去创建新的对象,叫作拷贝操作。拷贝对象,也就是拷贝了对象内存里的东西,也就是拷贝了原有对象的成员。用一原创 2022-07-07 21:14:42 · 6761 阅读 · 3 评论 -
C++学习之路-const成员
被const修饰的成员变量和非静态(static)成员函数,都叫作const成员。const成员变量必须初始化(必须类内部初始化):可以在声明的时候,直接初始化赋值如果不初始化,构造函数会报错:未提供初始值设定项构造函数初始化列表上面两种初始化方式,只能适用于非静态的const成员变量,如果遇到静态的const成员变量,就不能放在初始化列表里初始化了我们知道,static成员变量必须在类外初始化。但是一旦是static+const成员变量,那类内类外都可以初始化了。类内const原创 2022-06-09 18:08:14 · 2180 阅读 · 0 评论 -
C++学习之路-new/delete误区
比如,我们想要在堆空间申请4个字节,用于存放一个int型变量这时,我们为这块占用四个字节的堆空间内存,放入了一个整型变量10。到这里没有问题,我们可以理解。当我不想用这块内存的时候,我们需要使用delete回收掉很多人会认为,执行完delete ptr,指针ptr指向的堆空间被回收,然后这段堆空间内存被清空。这里要着重说明一下回收堆空间内存的含义:那四个字节,我在执行完delete ptr后不使用了,但是可以被别人继续使用。new申请内存,表示的是,操作系统分配一段内存,供我现在使用。当我再次new申请原创 2022-06-08 20:35:06 · 355 阅读 · 2 评论 -
C++学习之路-static静态成员的使用
被static关键字修饰的成员变量。即使定义在类内,静态成员变量存储在全局区,相当于全局变量,整个程序的运行过程中只有一份内存。static成员变量的访问方式对象访问指向对象的指针访问用类直接访问时提示:非静态成员引用必须与特定的对象相对指向对象的指针访问用类直接访问时我们可以看到,静态成员变量的访问方式,比非静态成员变量多了一个类访问。我们在类中定义了静态成员变量。必须要在类外对该静态成员变量初始化,否则会报错。(错误 LNK2001 无法解析的外部符号原创 2022-06-08 17:49:36 · 660 阅读 · 1 评论 -
C++学习之路-菱形继承与虚继承
继承的形状类似于菱形,比如爷爷类有一个,父类有2个 子类有一个。如下图所示:即 Undergraduate 继承于Student,Worker。Student,Worker又同时继承于Person。菱形继承的问题我们知道Student 继承于Person,那么就相当于把Person里所有的东西都拿到Student里。Person的成员变量也会存于Student里同理,Worker类也是如此,会将Person类的成员变量存于Worker类。由于,Undergraduate 类多继承于Student类原创 2022-06-03 22:17:07 · 457 阅读 · 0 评论 -
C++学习之路-多继承
多继承,顾名思义就是继承多个父类。以往派生类只有一个基类,叫作单继承。派生类有两个或者两个以上的基类,就叫作多继承。多继承的语法也很简单,将多个基类用逗号隔开。例如已声明了类A、类B和类C,那么可以这样来声明派生类D:可以看到一个细节,可以分别用不同的方式继承基类,比如public, private, protected。但我们学过继承(可以看之前的博文),继承方式尽量只选public。派生类初始化基类中的private成员变量,都需要借助初始化列表的初始化方式,并且调用基类中的构造函数,间接的去初始原创 2022-06-01 21:41:13 · 1158 阅读 · 0 评论 -
C++学习之路-多态
面向对象三大板块之一:多态一、父类指针指向子类对象二、什么是多态三、多态的要素四、多态的本质(虚函数的本质)多张虚表的情况虚表的一些注意事项虚表的意义五、虚析构函数六、多重继承下的虚函数问题七、纯虚函数抽象类(Abstract class)八、多态总结一、父类指针指向子类对象学习多态之前,我们先学一个关键的知识点:父类指针指向子类对象。class Person{public: int m_age; Person() { cout << "Person::Person()"原创 2022-05-22 17:14:25 · 1194 阅读 · 7 评论 -
C++学习之路-构造函数的初始化列表
初始化列表何为初始化列表初始化列表的本质初始化列表的优势初始化列表中列表顺序问题初始化列表与默认参数的配合使用初始化列表的注意之处构造函数的声明和实现分离时,初始化列表需写在实现里子类调用父类的构造函数初始化列表总结何为初始化列表定义:一种便捷的初始化类内成员变量的方式。初始化成员变量通常在构造函数里执行,如下例所示。成员变量的初始化可以通过调用有参的构造函数进行传参初始化,也可以通过调用无参的构造函数在函数体内部直接初始化(可以看我之前的博文)。下例展示了调用有参的构造函数始化成员变量的方式。原创 2022-05-20 11:40:48 · 10397 阅读 · 10 评论 -
C++学习之路—面向对象—继承
C++类的继承、继承规则、多重继承什么叫类的继承特性C++中类的继承特性指的是子类继承父类的成员的一种特性。一旦子类合理的继承了某个父类,就可以直接使用其内部的成员,避免重新添加成员,可减少代码量,增加程序的可读性。继承的写法如下:Parent类是父类,Children是子类。class Parent{};class Children : public Parent{};为什么要有C++的继承特性比如stud原创 2022-02-01 23:16:42 · 575 阅读 · 0 评论 -
C++学习之路—命名空间namespace
C++中的命名空间namespace定义到底啥叫命名空间呢?C++中的命名空间到底有啥用呢?放在命名空间里的全局变量依然是全局变量所有的C++代码都被一个默认的命名空间包围着总结定义C++中的命名空间规定了变量、函数、类的作用域。在命名空间下的所有代码都属于该命名空间,都要受该命名空间的控制。namespace 名称{ 变量; 函数; 类; ......}到底啥叫命名空间呢?也许你经常会看到C++代码中总是有这样一句(或者你经常会写上这么一句代码,但自己不太懂啥意思):using n原创 2022-01-24 20:24:47 · 694 阅读 · 0 评论 -
C++学习之路—面向对象—析构函数
C++面向对象-析构函数的用法定义析构函数最主要的作用通过malloc分配的对象,在free释放时,不会调用析构函数通过new分配的对象,在delete释放时,会调用析构函数malloc和new的差异总结定义析构函数也叫析构器,在对象销毁时自动调用,一般用于完成对象的清理工作。无返回值,无参,不可以重载,有且只有一个析构函数,不像构造函数可以重载。下方程序中,~Person()函数就是Person类的析构函数,与类重名,只不过前面有一个" ~ "符号class Person{public:原创 2022-01-24 12:44:58 · 666 阅读 · 0 评论 -
C++学习之路—面向对象—构造函数
C++面向对象之构造函数定义构造函数的用途使用构造函数有几点需要注意定义构造函数也叫构造器,在对象创建的时候自动调用,一般用于完成对象的初始化工作下方示例中Person()就是类的构造函数class Person{public: Person();//创建类时自动创建的构造函数,也可以手动添加,这个为构造函数的声明 ~Person();//虚构函数,后续文章会记录 int m_member;private:};Person::Person()//构造函数的实现-无参数构造原创 2022-01-21 21:14:10 · 1274 阅读 · 1 评论 -
C++学习之路—内存空间的布局
C++内存空间的布局简介栈空间代码区全局区堆空间栈空间、全局区都能存放东西,那堆空间存在的价值是什么????申请\释放堆空间1、malooc\free方法2、new\delete方法3、申请\释放需要注意的地方如果把堆空间的申请放在函数里,会随着函数的调用自动回收吗?在函数内部进行堆空间的申请所涉及的内存区域问题堆空间初始化方法1、malloc堆空间初始化方法顺便唠叨一下memset函数的作用2、new堆空间初始化方法类实例出来得对象的内存可以存在3种地方简介C++工程下的内存大致分为四个部分:栈空间、原创 2022-01-15 22:11:15 · 706 阅读 · 2 评论 -
C++学习之路—面向对象—封装
C++面向对象之封装定义封装的目的正好唠叨两句C++与C的区别public、private、protected的区别如何实现自己对private成员用途的一些理解定义在C++工程中,往往会有很多类的存在,为了避免类之间的相互影响。应该让类仅仅public一些必须让外界访问的成员,而隐藏private一些不想要公开的成员内容。这种信息的隐藏,就叫做C++类的封装。封装的目的封装的目的是为了保护私有成员变量正好唠叨两句C++与C的区别C++对C的最根本的改变就是把函数放进了结构之中,也就是我们原创 2022-01-15 11:24:01 · 468 阅读 · 0 评论 -
C++学习之路—面向对象—指针访问的本质
面向对象-指针访问的本质一道题,彻底了解指针间接访问所指向对象的成员变量的本质如何利用指针间接访问所指向对象的成员变量呢?解题一道题,彻底了解指针间接访问所指向对象的成员变量的本质首先定义一个类class Person{public: int m_id; int m_age; int m_height; void display() { cout << "m_id=" << m_id << endl; cout << "m_age原创 2022-01-13 18:25:38 · 360 阅读 · 0 评论 -
C++学习之路—面向对象—类
C++面向对象-类class和struct的联系与区别类创建多个对象时需要注意的地方1、不同对象调用同一个成员变量问题2、不同对象调用同一个成员函数3、this的作用:C++内存布局问题总结补充小tipsclass和struct的联系与区别在C语言中,没有class,只有struct。C语言中的struct叫作结构体,不叫作‘类’在C语言中,struct里只可以有结构体变量,对比类中就是成员变量在C++中,struct和class都是可以定义类的,且struct里既可以有成员变量,也可以有成员函数原创 2022-01-13 16:58:19 · 584 阅读 · 0 评论 -
C++学习-引用的那些事
C++本质-引用回顾指针、引出引用定义引用的用法1、可以利用引用初始化另一个引用,相当于某个变量的多个别名2、通过程序实现两个数字的交换,从而体现出引用的方便之处3、指针也可以被引用,叫做指向指针的引用4、在定义时,必须初始化,一旦指向了某个变量,就不可以改变5、重新赋值指针和引用,对所指向变量的影响引用与指针的比较1、怎样理解引用比指针更安全?2、一些特性的比较const引用的那些事1、定义2、const指针(非常重要)3、const引用的规则4、const引用的用武之地补充的小tips1、如果查看引用所原创 2022-01-12 11:20:08 · 909 阅读 · 0 评论 -
C++本质之const关键字的用法(窥探本质)
const关键字的作用一、定义二、被const修饰的变量特点1、用const修饰函数的参数2、用const修饰函数的返回值三、const修饰变量时位置不同,效果不同四、总结一、定义const是常量的意思,被其修饰的变量不可修改C++程序员如果看到const关键字,如果只想到是常量,这可不是良好的条件反射。const更大的魅力在于可以修饰函数参数和返回值,甚至定义函数时也可以修饰。二、被const修饰的变量特点被修饰的普通变量无法更改其值const int age = 10;age =原创 2021-11-28 11:55:19 · 348 阅读 · 0 评论 -
C++学习之路-内联函数inline的使用
C++学习-内联inline函数一、定义-definition二、inline内联函数使用举例-example三、不建议使用内联函数的情形1.为什么函数体代码过多不建议使用inline函数四、宏定义函数(#define function ...)五、宏定义函数与内联函数的区别六、不相关学习tips一、定义-definition使用inline修饰函数的声明或者实现,就可以使其变成内联函数。C++中支持内联函数,其目的是为了提高函数的执行效率。具体的作用就是:将函数调用,替换成函数体代码,避免了调用函原创 2021-11-20 17:47:51 · 438 阅读 · 2 评论 -
在C++编译器下,将代码按照C语言编译
extern "C"的使用一、定义-defintion二、extern "C"使用举例-example三、extern "C"的用武之处在哪?四、extern "C"常用特性1.C++调用第三方库(含.h&.c文件)2. C语言也调用第三方库(含.h&.c文件)a. #define __cplusplus解释b. #ifdef条件编译c. 启示五、不相关学习tips1.防止某个.h文件被重复include2.防止某个.h文件被重复include(#pragma)一、定义-defintion原创 2021-11-19 22:13:22 · 3314 阅读 · 0 评论 -
C++学习之路-默认参数
文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码如下(示例):import numpy as npimport原创 2021-11-17 17:12:45 · 2483 阅读 · 0 评论 -
C++学习之路-函数重载
C++学习之路-函数重载定义 - definition函数重载举例 - example不构成函数重载的情况(易错点)- carefulC++函数重载的本质 - essence举例说明不相关学习tips定义 - definition函数名相同,但形参的个数、数据类型、顺序中有一个不同,调用函数时C++会区分出来,进而执行不同函数的功能,这就是函数重载。函数重载举例 - example形参个数不同int sum(int v1, int v2){ return v1 + v2;}int su原创 2021-11-10 16:33:29 · 608 阅读 · 0 评论