- 博客(21)
- 收藏
- 关注
原创 C++中的多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。上图中,我们发现不同对象传递过去,调用不同函数。其中多态调用看的是指向的对象,普通调用则看的是当前者的类型。其中在继承中要够成多态还有两个条件(极其重要,缺一不可必须通过基类的指针或者引用调用虚函数。(注意基类两字)派生类必须对基类的虚函数进行重写。这里先看一道题,求sizeof(Base)是多少?
2024-04-02 10:15:05
968
原创 C++中的继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。以下代码中Student类和Teacher类就继承了Person类。//父类public:protected:string _name = "张三";//姓名//年龄//子类。
2024-04-02 09:00:00
970
1
原创 lambda表达式
我们从上述例子知道:语法上捕捉列表可以由多个捕捉项组成,并且以逗号分割,比如:[=, &a, &b]:以引用传递的方式捕捉变量a和b,值传递方式捕捉其他所有变量;[&,a, this]:值传递方式捕捉变量a和this,引用方式捕捉其他变量。我们可能会想到上面所说的mutable,可是尝试过后发现x和y的值并没有交换,这是因为mutable让捕捉的x和y可以改变,但是他们依旧是外面x和y的拷贝。这些都给编程者带来了极大的不便。lambda--------匿名函数对象 函数内部,直接定义使用。
2024-04-01 14:27:19
2097
原创 可变参数模板
函数的可变参数模板定义方式如下:返回类型 函数名(Args… args)//函数体{}模板参数Args前面有省略号,代表它是一个可变模板参数,我们把带省略号的参数称为参数包,参数包里面可以包含0到N ( N ≥ 0 )个模板参数,而args则是一个函数形参参数包。例如我们调用ShowList函数时就可以传入任意多个参数了,并且这些参数可以是不同类型的。return 0;我们可以在函数模板中通过sizeof计算参数包中参数的个数。
2024-04-01 09:12:21
724
原创 C++模板进阶操作 —— 非类型模板参数、模板的特化以及模板的分离编译
判断结果是这两个字符串不相等,这是因为我们希望的是该函数能够判断两个字符串的内容是否相等,而该函数实际上是判断这两个字符串的首元素的地址(函数传入的参数为数组名,数组名为数组首元素的地址)是否相同,这是两个存在于栈区的字符串,其地址显然是不同的。对于上述实例,使用模板可以实现一些与类型无关的代码,但对于一些特殊的类型可能会得到一些错误的结果,此时就需要对模板进行特化,即在原模板的基础上,针对特殊类型进行特殊化的实现方式.使用非类型模板参数后,我们就可以在实例化对象的时候指定所要创建的静态数组的大小了。
2024-03-31 08:41:25
1039
1
原创 左值引用与右值引用(移动语义)
但在深拷贝的类中引入C++11的移动构造后,这里仍然需要再调用一次赋值运算符重载函数进行深拷贝,因此深拷贝的类不仅需要实现移动构造,还需要实现移动赋值。例如下面这种情形。
2024-03-30 21:08:20
885
1
原创 C++11入门
在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加。创建对象时也可以使用列表初始化的方式调用构造函数初始化。std::initializer_list概念C++11中新增了initializer_list容器,该容器只提供了四个成员函数,其中begin和end用于迭代器遍历,size用于获取容器
2024-03-29 22:58:51
376
原创 类的新功能
上述代码中用一个右值去构造s2对象,但由于Person类没有生成默认的移动构造函数,因此这里会调用Person的拷贝构造函数(拷贝构造既能接收左值也能接收右值),这时在Person的拷贝构造函数中就会调用string的拷贝构造函数对name成员进行深拷贝。对于内置类型的成员会完成值拷贝(浅拷贝),对于自定义类型的成员,如果该成员实现了移动构造就调用它的移动构造,否则就调用它的拷贝构造。要验证Person类中默认生成的移动赋值函数可以用下面的代码,验证方式和上面验证移动构造的方式是一样的。
2024-03-29 13:43:26
799
1
原创 C++的类型转换
使用dynamic_cast进行向下转换是安全的,如果父类的指针(或引用)指向的是子类对象那么dynamic_cast会转换成功,但如果父类的指针(或引用)指向的是父类对象那么dynamic_cast会转换失败并返回一个空指针。dynamic_cast只能用于含有虚函数的类,因为运行时类型检查需要运行时的类型信息,而这个信息是存储在虚函数表中的,只有定义了虚函数的类才有虚函数表。其中,向上转换就是所说的切割/切片,复制兼容规则,是语法天然支持的,而向下转换需要进行强制类型转换。
2024-03-28 21:43:15
1005
原创 特殊类的设计
单例模式是一种设计模式(Design Pattern),设计模式就是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式的目的就是为了可重用代码、让代码更容易被他人理解、保证代码可靠性程序的重用性。单例模式指的就是一个类只能创建一个对象,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。
2024-03-28 19:44:01
623
原创 string类(一)
string();//构造一个空字符串//复制s所指的字符序列//复制s所指字符序列的前n个字符//生成n个c字符的字符串//生成str的复制品//复制str中从字符位置pos开始长度为len的字符其中npos 是一个静态成员常量值,对于 size_t 类型的元素具有最大可能值。当该值用作字符串成员函数中 len(或 sublen)参数的值时,表示“直到字符串末尾该常量定义为值 -1,因为 size_t 是无符号整数类型,所以它是该类型的最大可能表示值。使用示例。
2024-03-20 20:00:00
625
1
原创 类与对象(二)
这是由于类中一旦显示定义,编译器将不再自动生成默认构造函数。6.关于编译器生成的默认构造函数,很多人可能会有疑问:不实现构造的情况下,编译器会生成默认的构造函数,但是看起来默认构造函数又没有什么用?假设d1调用了编译器生成的默认构造函数,而_year,_month,_day依旧是随机值,如图其实不然,我们知道c++把类型分为内置类型和自定义类型。
2024-03-20 15:39:03
1128
1
原创 类与对象(一)
/由成员函数和成员变量组成//后面的分号不能漏class为定义类的关键字,className为类名,{ }中为类的主体,注意类定义结束时后面分号不能省略,类体中内容成为类的成员,类体中变量称为成员变量,类体中函数称为成员函数。1.声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理,可能会造成代码冗余。//声明和定义全部放在类体中public://显示基本信息public:char* _sex;int _age;//声明放在头文件person.h中。
2024-03-20 15:17:34
877
1
原创 Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)
那么我们将makefile中的依赖关系和依赖方法写得麻烦一点呢,会怎么样?我们继续来探究一下,例如下面这种情形。它自然而然地根据链接关系自上向下递归式地执行依赖关系和依赖方法。那么如果我们将依赖关系和方法的顺序打乱呢是否会影响make推导呢,下面我们来进行下试验我们发现用make指令照样可以生成各类可执行文件。
2024-03-04 14:56:27
946
1
原创 Shell的运行原理以及Linux当中的权限问题
而你希望的是你自己和你所在小组的其他成员能看到,剩下的人看不到,这是就引入了所属组。Shell对于Linux具有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核,反馈结果再通过内核运行出结果,通过Shell解析给用户。字符表示法中的每一个字符所在位置所表示的结果只有两种可能,要么为真,要么为假,因此我们可以将这三个字符换为三个二进制位,进而换为一个八进制位进行表示。然后将之前的新建文件的默认权限值和新建目录的默认权限值分别与其进行按位与操作,得到的就是我们创建出来的文件和目录的权限值。
2024-03-04 14:38:15
879
1
原创 Linux下的基本指令
其中我们需要注意的是:cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。1)-p dirname可以是一个路径名称,此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录。磁盘上的文件和目录被组成一颗目录树,每个节点都是目录或文件。而下面的'
2024-03-04 14:11:58
886
1
原创 C++入门基础
定义命名空间需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。一、正常的命名空间定义//一般项目中是用项目名做命名空间名//命名空间中可以定义变量,函数等int x;二、命名空间可以嵌套int x;int y;int a;int b;三、同一个工程中允许出现多个相同的命名空间,编译器最后会合成同一个命名空间中P.S 一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
2024-01-19 22:56:51
823
原创 关于序列中删除指定数字的两种方法
有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。
2023-03-04 15:59:50
177
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人