08 2020 档案
摘要:虚基类:派生类A继承自多个基类B,C,..., 而B,C,...又继承自同一个基类D, 若在B,C,...基类定义继承关系时, 声明基类D为虚基类,则在A中自会产生一个基类对象作用:解决二义性问题 代码示例: #include <iostream> using namespace std; /* 虚
阅读全文
摘要:C++继承中的二义性:1 一个派生类A继承自多个具有某些同名成员a,b,c的基类B,C,..., 访问这些成员导致的二义性解决方法:1 在访问时加上基类名加作用域符2 在派生类中重新定义自己的该成员2 一个派生类A继承自多个基类B,C,..., 这些基类又是同一基类D的派生类, 在派生类A中访问继承
阅读全文
摘要:多继承 多继承: 一个类继承多个基类语法:class 派生类名:继承方式 基类名1, 继承方式 基类名2{};多继承类的派生类中访问基类同名对象基类名::变量名 代码示例: #include <iostream> using namespace std; /* 多继承: 一个类继承多个基类 语法:
阅读全文
摘要:基类不同访问权限的成员不同继承方式下访问权限 继承方式 基类成员 子类中访问权限 子类内存模块访问权限 子类对象访问性 私有继承 私有 不可访问的 不可访问 不可访问 保护 保护的 可以访问 不可访问 公有 公有的 可以访问 可以访问 保护继承 私有 不可访问的 不可访问 不可访问 保护 私有成员
阅读全文
摘要:赋值兼容规则:在公有继承的情况下,一个派生类的对象可以作为基类对象使用1 派生类对象可以赋值给基类对象2 派生类对象的地址可以赋值指向基类对象的指针3 派生类对象可以初始化基类的引用 代码示例: #include<iostream> using namespace std; /* 赋值兼容规则:在公
阅读全文
摘要:1, 派生类不会继承基类的构造 2, 派生类可以调用基类的构造 3, 使用初始化列表调用基类的构造 4, 当基类中有默认构造函数或者无任何构造函数时, 可以在派生类构造函数定义时不显式调用基类构造函数, 即编译器隐式调用 5, 当基类中无无参构造函数, 必须在派生类构造函数中显式调用基类构造函数,
阅读全文
摘要:为什么要重载赋值运算符? 在用户定义类后, 编译器会默认提供无参构造(空实现), 析构(空实现), 拷贝构造(值拷贝), 重载赋值运算符(值赋值) 但是若类成员属性为指针变量时, 编译器提供的重载赋值运算符只会简单的把指针变量的值赋值, 而不会申请一份新的内存空间, 将指针指向的变量赋值给这片内存空
阅读全文
摘要:类型:关联容器 底层数据结构:哈希表 查询速度:O(ln(n)) 插入速度:O(ln(n)) 能否扩容:能 扩容方式:哈希表 特性:元素直接无序, hash_map不允许元素键值重复, 而hash_multimap则允许 适用情形: 频繁存取的元素, 不要求有序
阅读全文
摘要:类型:关联容器 底层数据结构:哈希表 查询速度:O(ln(n)), 插入速度:O(ln(n)) 能否扩容:能 扩容方式:哈希表 特性:元素直接无序, hash_set不允许元素键值重复, 而hash_multiset则允许 适用情形: 频繁存取的元素
阅读全文
摘要:类型:关联容器 底层数据结构:RB-tree(红黑树) 查询速度:O(ln(n)), 插入速度:O(ln(n)) 能否扩容:能 扩容方式:红黑树的插入(平衡二叉搜索树) 特性:所有元素根据元素的键值自动排序, map的所有元素是pair, 同时拥有实值和键值, pair的第一个元素被视为键值, 第二
阅读全文
摘要:类型:关联容器 底层数据结构:RB-tree(红黑树) 查询速度:O(ln(n)), 插入速度:O(ln(n)) 能否扩容:能 扩容方式:红黑树的插入(平衡二叉搜索树) 特性:所有元素根据元素的键值自动排序, 一个元素的键值就是实值, 实值就是键值, set不允许两个元素有相同的值, multise
阅读全文
摘要:类型:序列式容器 底层数据结构:封闭头部开口deque, 也可以使用封闭头部开口的list 查询速度:O(1), 只能访问队首元素, 不允许遍历 插入速度:O(1), 只能在队尾插入, 不支持其他位置插入 能否扩容:能 扩容方式:等同于在deque(缺省定义)或list的尾部插入元素, 适用情形:
阅读全文
摘要:类型:序列式容器 底层数据结构:使用vector实现的max-heap(大根堆) 查询速度:O(1), 只支持查询队首元素 插入速度:O(log(n)), 使用complete binary tree.max heap(完全二叉树大根堆)根据元素的权值维护存储顺序, 权值大最大的为队首元素 能否扩容
阅读全文
摘要:类型:序列式容器 底层数据结构:封闭了头部的deque(缺省定义)或list 查询速度:O(1), 只支持在访问头部元素 插入速度:O(1), 只支持在尾部插入, 头部删除 能否扩容:能 扩容方式:同deque或者list在尾部插入元素 适用情形:需要保证先进先出, 不需要访问除队首元素外的任何元素
阅读全文
摘要:类型:序列式容器 底层数据结构:封闭头部开口deque, 也可以使用封闭头部开口的list 查询速度:O(1), 只能访问栈顶元素, 不允许遍历 插入速度:O(1), 只能在栈顶插入, 不支持其他位置插入 能否扩容:能 扩容方式:等同于在deque(缺省定义)或list的尾部插入元素, 适用情形:
阅读全文
摘要:类型:序列式容器 底层数据结构:一个map(中央控制器, 连续内存空间, 存储缓冲区的地址) + 多个array(缓冲区) 查询速度:O(1), 随机存取,常数时间, 略大于vector的O(1) 插入速度:在头部和尾部插入时间复杂度为O(1), 中间位置插入元素时间复杂度小于vector的O(n)
阅读全文
摘要:类型:序列式容器 底层数据结构:双向循环列表 查询速度:O(n) 插入速度:O(1), 找到指定位置时间复杂度为O(n), 在指定位置上插入元素时间复杂度为常数时间, 能否扩容:能 扩容方式:每次添加元素在堆上申请存储一个元素所需的内存空间, 然后修改该元素的前趋的后继指针和后继的前趋指针, 同时修
阅读全文
摘要:类型:序列式容器 底层数据结构:数组array 查询速度:O(1), 随机存取,常数时间 插入速度:O(n) 能否扩容:能 扩容方式:定义时在堆上申请一定大小内存空间, 当容器未满时, ,插入和删除不会申请空间和释放空间, 当容器已满时, 会申请当前容器容量两倍的内存空间作为,将原容器内存拷贝到新容
阅读全文
摘要:韦恩图: 在编写 C++ 时,也应该尽可能的避免使用诸如 void* 之类的程序风格。而在不得不使用 C 时,应该注意使用 extern "C" 这种特性,将 C 语言的代码与 C++ 代码进行分离编译,再统一链接这种做法. C++从来都不是C语言的超集.
阅读全文
摘要:重载自增运算符 前置自增运算符: 输出时输出的是自增后的值; 语法: 类名 &operator++() { 函数体 } 注意事项: 返回值类型必须是引用类型, 保证多次使用前置自增保证操作的是同一个对象 后置自增运算符: 输出时先输出的自增前的值 语法: 类名 &operator++(int) {
阅读全文
摘要:重载左移运算符以实现输出自定义类型一般的重载运算符有两种方式1, 使用成员函数重载2, 使用全局函数重载考虑到cout对象应该在左边, 如果使用类的成员函数重载的话, 第一个参数(左边的参数)默认为*this指向的类对象, 在左边不符合要求, 故选择使用全局函数重载运算符语法:ostream &op
阅读全文
摘要:运算符重载: 对已有的运算符进行重新定义, 赋予新的功能, 以适应不同的数据类型(多指自定义数据类型)重载方式:1,类成员函数2,全局函数一般的全局函数进行运算符重载要比类成员函数运算符重载多一个参数,因为往往使用非静态成员函数进行运算符重载, 而非静态成员函数隐含的的this指针指向的对象, 往往
阅读全文
摘要:友元成员函数: 在类A的内部声明一个属于类B的成员函数, 则该成员函数可以访问类A的私有成员语法:class A;class B { 返回值类型 函数名(参数列表);};class A { friend 返回值类型 B::函数名(参数列表);};返回值类型 B::函数名(参数列表) {函数体}注意事
阅读全文
摘要:友元类: 在A类中使用friend关键字声明B类, 则称B类为A类的友元类, 可以在B类内部访问A类的私有成员语法:class A{ friend class B;};inventory n.详细目录;库存;代码示例: #include <iostream> #include <string> us
阅读全文
摘要:全局友元函数: 在类内部声明且使用friend关键字修饰, 在类外和函数外定义的全局函数, 可以访问类中的私有成员语法:1, 声明(必须在类内部):friend 返回值类型 函数名(参数列表);2, 定义(在类外)返回值类型 函数名(参数列表) {函数体}quantity n.量,数量;总量;exp
阅读全文
摘要:使用to_string函数, 该函数包含在头文件string中 #include <string> using namespace std; struct Goods { string name; double place; string getInfo() { return "name: " +
阅读全文
摘要:常函数和常对象常函数: 在函数参数列表后, '{'前用const关键字修饰的函数, 该函数不能修改成员属性, 除非该成员属性被mutable关键字所修饰语法:返回值类型 函数名(参数列表) const {函数体}mutable adj.易变的;性情不定的;mutable关键字: 用于定义成员变量时修
阅读全文
摘要:使用空指针(指向类对象类型的)调用类的成员函数1, 成员函数访问了与*this指向的对象的静态成员属性(即对象的非静态成员属性), 会抛出异常2, 成员函数不访问与*this指向的对象的静态成员属性, 能正常运行为了防止上述1中抛出的异常, 在成员函数中使用以下内存if(this == NULL){
阅读全文
摘要:this指针: C++在类的非静态成员函数隐含的指向调用成员函数的当前对象的指针本质:指针常量(不可修改指针指向)作用:1, 解决成员函数参数和类成员变量的名称冲突2, 使用*this即可返回调用函数的对象本身注意事项:1, 欲返回当前对象本身, 成员函数的返回值类型必须是当前对象所属类(包括父类)
阅读全文
摘要:类成员变量(静态和非静态)和成员函数(静态和非静态)的存储特点当类无成员变量时, 类对象所占的内存为1个字节, 编译器用于区分不同对象并使其占用不同的内存空间当类有非静态成员变量时, 类对象所占的内存为非静态成员变量所占内存之和, 说明类非静态成员变量存储在类对象所占用的内存空间上静态成员变量存储位
阅读全文
摘要:静态成员函数特点:所有类对象共享一个成员函数可以通过类名调用(使用public修饰), 也可以通过对象调用只能访问静态成员变量, 即使未定义任何类对象, 静态成员函数仍然调用(类名调用), 假设能访问非静态成员变量, 编译器无法找到该变量所占的内存, 故假设不成立, 无法访问非静态成员变量 #inc
阅读全文
摘要:静态成员变量特点:所有类对象共享一个静态成员变量类内声明, 类完定义(初始化)(必须)编译阶段分配内存, 全局区?如果访问权限设置为公共(public), 可在类外 直接通过类名::静态成员变量名访问, 也可使用对象访问, 语法为: 对象名.静态成员变量名 #include <iostream> #
阅读全文
摘要:当类的成员属性是对象类型时, 对象的构造函数调用顺序:1, 调用成员属性的构造函数2, 调用类的构造函数3, 调用类的析构函数4, 调用成员属性的析构函数 #include <iostream> #include <string> using namespace std; /** * 当类的成员属性
阅读全文
摘要:C++在构造函数定义构造函数时, 使用初始化列表初始化对象 语法 类名(): 成员属性名(值), ..., { } 注意事项:值可以为参数列表的参数 #include <iostream> #include <string> using namespace std; /** * 语法 *类名():
阅读全文
摘要:浅拷贝构造函数和深拷贝构造函数 浅拷贝构造函数 简单的将类中的成员进行值复制, 当类的中的某个成员是指针类型时, 复制的是指针指向的地址, 即两个对象指向的是堆上的同一块内存 深拷贝构造函数 用户(程序员)通过自己义拷贝构造函数使得在进行对象拷贝时, 对指针类型的成员, 在堆上重新开辟内存, 复制的
阅读全文
摘要:C++中,定义一个类后, 编译器自动提供三个函数:1,默认构造函数(空实现)2,默认析构函数(空实现)3,默认拷贝构造函数(值拷贝) 注意事项: 1,若用户自定义有参构造函数, 编译其不再提供默认无参构造函数, 仅提供析构函数和默认拷贝构造函数 2,若用户自定义拷贝构造函数, 编译其不再提供构造函数
阅读全文
摘要:C++中类的拷贝构造函数调用的时机 1,使用已创建的对象创建新的对象 2,对象已值传递的方式作为函数参数 3,函数返回值为局部对象 #include <iostream> #include <string> using namespace std; class Rider{ private: str
阅读全文
摘要:#include <iostream> using namespace std; /** * 构造函数的分类 * 按照参数个数分类 * 1,无参构造函数 * 2,有参构造函数 * 按照类型分类 * 1,普通构造函数 * 2,拷贝构造函数 */ class Person{ public: /** *
阅读全文
摘要:构造函数 特点: 1,无返回值, 但是不需要声明返回值类型为void 2,函数名与类名相同 3,可以重载, 可以有参数 4.在创建对象时编译器自动调用, 实例化一个对象只调用一次 析构函数 特点: 1,无返回值, 不需要声明返回值类型为void 2,函数名为类名前加~ 3,不能接收参数, 不可以重载
阅读全文
摘要:#include <iostream> using namespace std; class Cube { //属性 private: //长 double length; //高 double height; //宽 double width; //行为 public: //设置长 void se
阅读全文
摘要:C++中类成员私有化的优点: 1,便于控制成员属性||变量的读写权限2,便于检验写入属性的合法性 示例代码: #include <iostream> #include <string> using namespace std; /** * C++将成员属性||成员变量私有化的优点: * 1,便于控制
阅读全文
摘要:默认成员||域访问权限不同,class中的成员默认访问权限为私有,struct中的成员默认访问权限为公共 代码示例: #include<iostream> using namespace std; /** * 类中成员默认访问权限为私有 */ class C1{ int a; }; /** * 结构
阅读全文
摘要:C++访问权限表 关键字 访问权限 public 公共权限: 类内可以访问, 类外可以访问 protected 私有权限: 类内可以访问, 类外不可以访问(包括在子类内也不可以访问) private 保护权限: 类内可以访问, 类外不可以访问(但在子类内可以访问) 代码示例: #include <i
阅读全文
摘要:定义简单类的语法 class 类名{ public: //公共权限成员 //属性||成员属性||成员变量 //... //行为||成员函数||成员方法 private: //私有权限成员 //属性||成员属性||成员变量 //... //行为||成员函数||成员方法 }; 定义简单的圆形类 #inc
阅读全文
摘要:#include<iostream> using namespace std; /** * 函数重载注意事项 * 1,函数重载和引用参数 * 变量引用和常量引用被编译器视为不同的类型, 对于两个函数名相同的函数的某个参数, 一个是变量引用类型, 一个是常量引用类型, 可以重载 * 此时调用时, 给该
阅读全文
摘要:#include<iostream> using namespace std; /** * 带占位参数的函数 * 格式 返回值类型 函数名(参数类型 参数名, ..., 占位参数类型, ...) * 占位参数可以由默认值 * 格式 返回值类型 函数名(参数类型 参数名, ..., 占位参数类型 =
阅读全文
摘要:带默认参数的函数在调用时,可以不给有默认值的参数传参, 编译器会自动使用默认值, 使用默认参数定义函数需要注意两点: 1,函数的某个位置的参数使用了默认参数, 则该参数后, 从左至右的所有参数必须给出默认参数, 否则报错:Miss default argument on parameter 'par
阅读全文
摘要:#include<iostream> using namespace std; void showValue(const int& val){ // val = 1000; //error: Cannot assign to variable 'val' with const-qualified t
阅读全文
摘要:#include<iostream> using namespace std; /** * C++const关键字和指针的结合使用 * 1,指针常量:可以修改指针变量指向地址的值,不能修改指针变量的指向(即可以给*p赋值, 不能给p赋值) * 语法: dataType *const pointerV
阅读全文
摘要:C++中的引用类型其本质就是指针常量,当我们使用引用时,编译器将会自动为我们定义一个定义指针常量并将被取别名的变量的地址赋值给该指针常量或者通过解引用指针常量来访问被取别名的变量 点击这里了解const和指针的结合使用 #include<iostream> using namespace std;
阅读全文
摘要:#include<iostream> using namespace std; /** * 返回局部变量的引用回导致非法访问栈区的内存 * @return a 局部变量a的引用 */ int& returnReferenceOfLocalVariable(){ //非静态局部变量存储在栈区,由编译器
阅读全文
摘要:使用引用传参可以实现指针类似的效果, 引用传参是指针传参的简化 #include<iostream> using namespace std; /** * 通过值传参实现两个整型变量值的交换(不能达到效果) * swap v.交换; n.交换(之物) * @param a 第一个整型变量的值 * @
阅读全文
摘要:1引用的基本使用 #include<iostream> using namespace std; int main() { int a = 10; //使用引用给变量取别名 //语法:数据类型 &别名 = 原名; int &b = a; b = 20; cout << a << endl; syst
阅读全文
摘要:内存分区模型 分区名 存储内容 代码区 存放函数体的二进制代码,由操作系统进行管理 全局区 全局变量,静态变量,常量,在程序执行结束后由操作系统管理 栈区 由编译器自动分配,释放,存放函数的参数值,局部变量 堆区 由程序员分配释放,程序运行结束,由操作系统回收 在程序未执行前就生成的区域 1代码区
阅读全文

浙公网安备 33010602011771号