![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 94
微分忧伤,积分希望
这个作者很懒,什么都没留下…
展开
-
C++中的多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。上图中,我们发现不同对象传递过去,调用不同函数。其中多态调用看的是指向的对象,普通调用则看的是当前者的类型。其中在继承中要够成多态还有两个条件(极其重要,缺一不可必须通过基类的指针或者引用调用虚函数。(注意基类两字)派生类必须对基类的虚函数进行重写。这里先看一道题,求sizeof(Base)是多少?原创 2024-04-02 10:15:05 · 970 阅读 · 0 评论 -
C++中的继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。以下代码中Student类和Teacher类就继承了Person类。//父类public:protected:string _name = "张三";//姓名//年龄//子类。原创 2024-04-02 09:00:00 · 974 阅读 · 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 · 2101 阅读 · 0 评论 -
可变参数模板
函数的可变参数模板定义方式如下:返回类型 函数名(Args… args)//函数体{}模板参数Args前面有省略号,代表它是一个可变模板参数,我们把带省略号的参数称为参数包,参数包里面可以包含0到N ( N ≥ 0 )个模板参数,而args则是一个函数形参参数包。例如我们调用ShowList函数时就可以传入任意多个参数了,并且这些参数可以是不同类型的。return 0;我们可以在函数模板中通过sizeof计算参数包中参数的个数。原创 2024-04-01 09:12:21 · 728 阅读 · 0 评论 -
C++模板进阶操作 —— 非类型模板参数、模板的特化以及模板的分离编译
判断结果是这两个字符串不相等,这是因为我们希望的是该函数能够判断两个字符串的内容是否相等,而该函数实际上是判断这两个字符串的首元素的地址(函数传入的参数为数组名,数组名为数组首元素的地址)是否相同,这是两个存在于栈区的字符串,其地址显然是不同的。对于上述实例,使用模板可以实现一些与类型无关的代码,但对于一些特殊的类型可能会得到一些错误的结果,此时就需要对模板进行特化,即在原模板的基础上,针对特殊类型进行特殊化的实现方式.使用非类型模板参数后,我们就可以在实例化对象的时候指定所要创建的静态数组的大小了。原创 2024-03-31 08:41:25 · 1043 阅读 · 1 评论 -
左值引用与右值引用(移动语义)
但在深拷贝的类中引入C++11的移动构造后,这里仍然需要再调用一次赋值运算符重载函数进行深拷贝,因此深拷贝的类不仅需要实现移动构造,还需要实现移动赋值。例如下面这种情形。原创 2024-03-30 21:08:20 · 892 阅读 · 1 评论 -
智能指针(C++11)
因为静态成员变量是所有类型对象共享的,这会导致管理相同资源的对象和管理不同资源的对象用到的都是同一个引用计数。原创 2024-03-30 20:59:41 · 1972 阅读 · 1 评论 -
C++11入门
在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加。创建对象时也可以使用列表初始化的方式调用构造函数初始化。std::initializer_list概念C++11中新增了initializer_list容器,该容器只提供了四个成员函数,其中begin和end用于迭代器遍历,size用于获取容器原创 2024-03-29 22:58:51 · 380 阅读 · 0 评论 -
类的新功能
上述代码中用一个右值去构造s2对象,但由于Person类没有生成默认的移动构造函数,因此这里会调用Person的拷贝构造函数(拷贝构造既能接收左值也能接收右值),这时在Person的拷贝构造函数中就会调用string的拷贝构造函数对name成员进行深拷贝。对于内置类型的成员会完成值拷贝(浅拷贝),对于自定义类型的成员,如果该成员实现了移动构造就调用它的移动构造,否则就调用它的拷贝构造。要验证Person类中默认生成的移动赋值函数可以用下面的代码,验证方式和上面验证移动构造的方式是一样的。原创 2024-03-29 13:43:26 · 803 阅读 · 1 评论 -
C++的类型转换
使用dynamic_cast进行向下转换是安全的,如果父类的指针(或引用)指向的是子类对象那么dynamic_cast会转换成功,但如果父类的指针(或引用)指向的是父类对象那么dynamic_cast会转换失败并返回一个空指针。dynamic_cast只能用于含有虚函数的类,因为运行时类型检查需要运行时的类型信息,而这个信息是存储在虚函数表中的,只有定义了虚函数的类才有虚函数表。其中,向上转换就是所说的切割/切片,复制兼容规则,是语法天然支持的,而向下转换需要进行强制类型转换。原创 2024-03-28 21:43:15 · 1007 阅读 · 0 评论 -
特殊类的设计
单例模式是一种设计模式(Design Pattern),设计模式就是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式的目的就是为了可重用代码、让代码更容易被他人理解、保证代码可靠性程序的重用性。单例模式指的就是一个类只能创建一个对象,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。原创 2024-03-28 19:44:01 · 625 阅读 · 0 评论 -
C++模板详解 —— 函数模板与类模板
class 类模板名//类内成员声明示例代码如下。原创 2024-03-21 09:00:00 · 804 阅读 · 1 评论 -
类与对象(一)
/由成员函数和成员变量组成//后面的分号不能漏class为定义类的关键字,className为类名,{ }中为类的主体,注意类定义结束时后面分号不能省略,类体中内容成为类的成员,类体中变量称为成员变量,类体中函数称为成员函数。1.声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理,可能会造成代码冗余。//声明和定义全部放在类体中public://显示基本信息public:char* _sex;int _age;//声明放在头文件person.h中。原创 2024-03-20 15:17:34 · 880 阅读 · 1 评论 -
类和对象(三)
3. 类静态成员只可用。原创 2024-03-20 17:00:00 · 2062 阅读 · 1 评论 -
类与对象(二)
这是由于类中一旦显示定义,编译器将不再自动生成默认构造函数。6.关于编译器生成的默认构造函数,很多人可能会有疑问:不实现构造的情况下,编译器会生成默认的构造函数,但是看起来默认构造函数又没有什么用?假设d1调用了编译器生成的默认构造函数,而_year,_month,_day依旧是随机值,如图其实不然,我们知道c++把类型分为内置类型和自定义类型。原创 2024-03-20 15:39:03 · 1131 阅读 · 1 评论 -
C++入门基础
定义命名空间需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。一、正常的命名空间定义//一般项目中是用项目名做命名空间名//命名空间中可以定义变量,函数等int x;二、命名空间可以嵌套int x;int y;int a;int b;三、同一个工程中允许出现多个相同的命名空间,编译器最后会合成同一个命名空间中P.S 一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。原创 2024-01-19 22:56:51 · 826 阅读 · 0 评论