cpp多态的基本概念
07-0 多态的基本概念 多态是cpp面向对象的三大特性之一 复习:cpp面向对象的三大特性: 封装 继承 多态 多态分为两类: 静态多态:函数重载 和 运算符重载 就属于静态多态,复用函数名。 动态多态:派生类和虚函数实现运行时多态。 复习: 函数重载: 函数重载的简单概念是:在某种特定的条件下,…
cpp菱形继承
06-8 菱形继承 菱形继承的概念:存在着两个派生类(类B和类C)继承同一个基类(类A),同时存在着另外一个类(类D)同时继承这两个派生类。这种继承称之为菱形继承,又称之为钻石继承。 我们可以举个例子,这样可能好理解一点: 有一个父类,叫做动物,这个类下面有两个类,一个类是羊,另外一个类是驼。这个很…
cpp多继承
06-7 继承语法-多继承语法 在之前我们学习过了 c++中的基本继承语法,我们可以复习一下。 复习: c++中,类与对象的继承语法是:class 子类名 :继承方式 父类 其中,有三种继承方式,对应着 c++中类内对象的三种权限: 公共继承(public) 保护继承(protected) 私有继承…
cpp继承同名静态成员处理方式
06-6 继承同名静态成员处理方式 复习: 静态成员:静态成员分为: 静态成员属性(在成员变量前加上ststic) 所有对象共享一份数据; 在编译阶段分配内存(一般的数据存放在栈区) 类内声明,类外初始化 静态成员函数(在成员函数前加上ststic) 所有对象共享同一个函数 静态成员函数只能访问静态…
cpp继承同名成员处理方式
06-5 继承同名成员处理方式 思考:当子类和父类中出现了同名的成员,如何通过子类对象访问父类的同名成员,子类呢? #include <iostream> #include <string> using namespace std; class A { public: str…
cpp继承中构造和析构顺序
06-4 继承中构造和析构顺序 子类在继承父类后,当子类创建对象的时候,也会调用父类的构造函数。 思考:在继承的时候,创建子类对象的时候,是先构造子类对象还是父类对象?析构呢? #include <iostream> using namespace std; class A { publ…
cpp继承中的模型对象模型
06-3 继承中的模型对象模型 思考:从父类继承下来的成员,是否属于子类的对象中呢? 我们可以用sizeof关键字查看一个对象的大小。 我们可以先创建一个父类: class A { public: int m_A; protected: int m_B; private: int m_C; }; 在…
cpp继承方式
06-2 继承方式 在上一章中,我们学习了继承的语法:class 子类名称 :继承方式 父类名称。 继承一共有三种方式 公共继承(public) 保护继承(protected) 私有继承(private) 继承的三种继承方式就是类中成员的三种权限。 我们假设有一个父类A: class A { pub…
cpp继承基本语法
06-1 继承基本语法 继承的基本语法:class 子类名 :继承方式 父类 举个例子: 现在有三种猫: 猫都喜欢:伸懒腰、猫薄荷、喝马桶水 狸花猫:喜欢打架 布偶猫:喜欢装可爱 橘猫:啥都吃。 我们现在使用继承的方法,打印每一种猫喜欢的东西: #include <iostream> u…
cpp继承
06-0 继承 继承是 c++面向对象的三大特性之一。 复习:c++面向对象的三大特性: 封装 继承 多态 有一些类和其他类之间存在特殊关系,比如说: |-动物 |--猫 |---狸花猫 |---布偶猫 |---橘猫 |--狗 |---哈士奇 |---拉布拉多 |---萨摩耶 这些类中,下级的成员除…
cpp运算符重载-逻辑运算符
05-7 运算符重载-逻辑运算符 逻辑运算符包括:逻辑与(&&/and)、逻辑或(||/or)、逻辑否(!)。 可以重载的逻辑运算符是:逻辑与(&&/and)、逻辑或(||/or)。 逻辑运算符重载的作用:利用逻辑运算符,可以让两个自定义类型的对象进行对比。 提示: …
cpp仿函数
05-6 运算符重载-函数调用(小括号)运算符 函数调用运算符()也可以重载,亦成为:小括号运算符重载。 由于重载后的使用方式非常像函数的调用,所以也被称之为:仿函数。 仿函数没有固定的写发,非常灵活 提示:仿函数在后续(STL)中大量使用。05-6 运算符重载-函数调用(小括号)运算符05-6 运…
cpp运算符重载-关系运算符
05-5 运算符重载-关系运算符 关系运算符包括:大于(>)、小于(<)、等于(==)、不等于(!=)、大于或等于(>=)、小于或等于(<=)。 关系运算符重载的作用:利用关系运算符,可以让两个自定义类型的对象进行对比。 我们主要学习的是等于和不等于的判断。但是大于小于等等也…
cpp运算符重载-赋值重载
05-4 运算符重载-赋值重载 在学习类中的构造函数和析构函数的时候,我们学习过:写了一个类,c++的编译器会给这个类自动添加四个函数。 默认构造函数(无参,函数体为空) 默认析构函数(无参,函数体为空) 默认拷贝构造函数(对属性进行值拷贝) 赋值运算符operator=,用于对属性进行值拷贝 在学…
cpp运算符重载-递增递减
05-3 运算符重载-递增递减 递增递减重载的作用:让结构体或者类可以直接完成递增递减,无需将数据单独从结构体或者类拿出来。 完成左移运算符重载有两种方法: 在成员函数里面实现重载。 在全局函数里面实现重载。 使用重载的时候,需要使用关键字operator。递增递减重载的函数声明是(准确说是以递增+…
运算符重载-输入输出-右移运算符
05-2-2 运算符重载-输入输出-右移运算符 右移运算符重载的作用:让结构体或者类可以直接完成左移运算符,无需将数据单独从结构体或者类拿出来。常见的需要用到右移运算符(>>)的场景是:使用cin输入。 完成左移运算符重载有、且只有一种方法: 在全局函数里面实现重载。 使用重载的时候,需…
运算符重载-输入输出-左移运算符
05-2-1 运算符重载-输入输出-左移运算符 左移运算符重载的作用:让结构体或者类可以直接完成左移运算符,无需将数据单独从结构体或者类拿出来。常见的需要用到左移运算符(<<)的场景是:使用cout输出。 完成左移运算符重载有、且只有一种方法: 在全局函数里面实现重载。 使用重载的时候,…
cpp运算符重载-四则运算
05-1 运算符重载-四则运算 四则运算的运算符重载的作用:让结构体或者类可以直接完成四则运算,无需将数据单独从结构体或者类拿出来。 完成四则运算的运算符重载有两种方法: 在成员函数里面实现重载。 在全局函数里面实现重载。 使用重载的时候,需要使用关键字operator。四则运算运算符重载的函数声明…
cpp运算符重载
05-0 运算符重载 运算符重载在 c++中是一个非常重要的知识点。 上一次遇到重载二字是在函数之中。在函数中,不同的传入的数据类型或数据数量可以实现重载:简单来说就是使用相同的函数名称,但是传入不同的参数,所对应的函数内容也不同。 运算符重载的概念:对已有的运算符进行重新定义,赋予它另外的一种功能…
cpp成员函数做友元
04-3 友元-成员函数做友元 在声明创建类的时候,写一行friend 类名称::成员函数声明;,这个新的成员函数即可在后续访问这个类中的私有属性。 不好意思此处实在是跑不通代码......
cpp类做友元
04-2 友元-类做友元 在声明创建类的时候,写一行friend 类名称;,这个新的类即可在后续访问这个类中的私有属性。 #include <iostream> #include <string> using namespace std; //类做友元 class Build…
cpp全局函数做友元
04-1 友元-全局函数做友元 在声明创建类的时候,写一行friend 全局函数声明;,这个全局函数即可在后续访问这个类中的私有属性。 #include <iostream> #include <string> using namespace std; class Build…
cpp友元
04-0 友元 举个例子:在家中,存在客厅、寝室。在客厅中,可以用来接待所有客人。但是寝室,是只有自己可以进入的。但是如果来了好朋友,那么朋友也可以进入寝室。 在上面的例子里,客厅就相当于是public权限,而寝室就相当于是private权限。 在程序中,有些私有属性也需要被类外的一些特殊函数或者类…
cpp-常函数和常对象
03-4 常函数和常对象 常函数: 成员函数后加const后我们称这个函数为:常函数。 常函数内不可以修改成员属性 如果在成员属性声明的时候加上关键字mutable,在常函数中可以修改 常对象: 声明对象前加上const,则这个对象是常对象。 常对象只能调用常函数。 我们来试一试: 常函数: 成员函…
cpp空指针访问成员函数
03-3 空指针访问成员函数 在 c++中,允许空指针调用成员函数的,但是也需要注意有没有用到this指针。 如果用到了this指针,需要加以判断保证代码的健壮性。 #include <iostream> using namespace std; class Person { publi…
cpp-this指针
03-2 this指针 在 03-1 成员变量和成员函数分开存储 中,我们知道了在 c++中,类中的成员变量和成员函数是分开存储的。简单复习一下: 在c++中,只有类内的非静态成员变量才属于对象上,其他的(静态成员对象、成员函数)都不属于对象上。 没一个非静态的成员函数只会诞生一份函数实例,也就是所…
cpp成员变量和成员函数分开存储
03-1 成员变量和成员函数分开存储 在类中,无论是变量还是函数我们都称之为:成员。 在 c++中,类内的成员变量和成员函数是分开存储的。 只有非静态成员变量才属于类的对象上。 我们先创建一个空的类,看看占用的内存大小是多少。 #include <iostream> using name…
静态成员函数
02-8-2 静态成员函数 静态成员函数的特点: 所有对象共享同一个函数 静态成员函数只能访问静态成员变量。 同静态成员变量一样,静态成员函数也有两种访问方式 通过对象访问: #include using namespace std; class test { public: static void…
静态成员变量
02-8-1 静态成员变量 静态成员变量的特点: 所有对象共享一份数据; 在编译阶段分配内存(一般的数据存放在栈区) 相当于在运行可执行文件前就已经分配完成了。(在 windows 环境下.exe就是可执行文件)(静态成员变量数据存放在全局区) 类内声明,类外初始化 所有对象共享一份数据 #incl…
cpp静态成员
02-8-0 静态成员 成员出现在类中。无论是成员属性还是函数,我们可以称为:成员属性、成员函数。 静态变量:这个在学习内存四区的时候讲过。在变量前加上static,我们将称这个变量称之为静态变量。静态变量存储在全局区。 静态成员:静态成员出现在类中。在成员变量和成员函数前加上关键字:static。…
类对象作为类成员
02-7 类对象作为类成员 c++中,类中的成员可以是另外一个类的对象。我们称呼这样的成员为:对象成员。 比如: class A {}; class B { A a; } B类中有对象A作为成员,那么A就是对象成员。 #include <iostream> using namespace…
cpp-初始化列表
02-6 初始化列表 作用:在类中初始化类中的属性。 c++提供了初始化列表语法,用来初始化属性。 语法:构造函数():属性1(数据值1),属性2(数据值2)...{} 注意冒号:的位置:冒号位于构造函数形参列表的后面。 假设我们有这样的一个类: class Person { private: st…
cpp深拷贝和浅拷贝
02-5 深拷贝和浅拷贝 深拷贝和浅拷贝是一个经典的面试题目,也是一个常见的坑。(虽然我认为面试对我没啥用途......) 浅拷贝:简单的赋值拷贝操作 深拷贝:在堆区重新申请内存空间,进行拷贝操作 如果在类中,有属性是指向堆区的指针,做赋值操作的时候就会出现深拷贝和浅拷贝的问题。 简单来说,就是在类…
cpp构造函数调用规则
02-4 构造函数调用规则 写了一个类,c++的编译器会给这个类自动添加四个函数,但是我们目前只用知道前三个。 默认构造函数(无参,函数体为空) 默认析构函数(无参,函数体为空) 默认拷贝构造函数(对属性进行值拷贝)。 构造函数调用规则如下: 如果用户定义了有参构造函数,c++不会再自动提供默认构造…
cpp拷贝构造函数的调用时机
02-3 拷贝构造函数的调用时机 在 c++中使用拷贝构造函数的时机通常有以下三个: 使用一个已经创建完毕的对象来初始化一个新的对象(常用) 值传递的方法给函数的参数传值 以值方式返回局部对象 我们先创建一个类用于演示: class Person { private: int m_age; publ…