STL算法之遍历
摘要:遍历算法 for_each 可有有返回值 可以绑定参数进行输出 transform 将容器中的数据进行搬运到另一个容器中 注意:transform 目标容器需要开辟空间 for_each(iterator beg, iterator end, _callback); 遍历算法 遍历容器元素 @par
阅读全文
STL算法概述
摘要:算法概述 算法主要是由头文件<algorithm> <functional> <numeric>组成。 <algorithm>是所有STL头文件中最大的一个,其中常用的功能涉及到比较,交换,查找,遍历,复制,修改,反转,排序,合并等... <numeric>体积很小,只包括在几个序列容器上进行的简单
阅读全文
STL适配器
摘要:函数适配器bind1st bind2nd 现在我有这个需求 在遍历容器的时候,我希望将容器中的值全部加上100之后显示出来,怎么做? 我们直接给函数对象绑定参数 编译阶段就会报错 for_each(v.begin(), v.end(), bind2nd(myprint(),100)); 如果我们想使
阅读全文
STL内建函数对象使用 functional
摘要:内建函数对象 STL内建了一些函数对象。分为:算数类函数对象,关系运算类函数对象,逻辑运算类仿函数。这些仿函数所产生的对象,用法和一般函数完全相同,当然我们还可以产生无名的临时对象来履行函数功能。使用内建函数对象,需要引入头文件 #include<functional> 1. #define _CR
阅读全文
STL谓词及lambda基本语法
摘要:谓词 普通函数或者仿函数返回值 bool类型 一元 一个参数 二元 两个参数 一元 查找 大于20的数字 find_if 返回迭代器 二元 排序 谓词是指普通函数或重载的operator()返回值是bool类型的函数对象(仿函数)。如果operator接受一个参数,那么叫做一元谓词,如果接受两个参数
阅读全文
STL函数对象(仿函数)
摘要:函数对象 重载 () 所以函数的对象 使用()像函数调用 是类 而不是普通的函数 内部记录状态 作为类型 与模板进行配合使用 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对
阅读全文
STL容器map基本概念及常用API
摘要:每个元素 都是一个pair 对于map而言 key是不可以重复 multimap可以 4种插入方式 count 统计 map 0 或1 multimap可能大于1 排序规则自己指定 基本概念 Map的特性是,所有元素都会根据元素的键值自动排序。Map所有的元素都是pair,同时拥有实值和键值,pai
阅读全文
STL容器之set容器API(二)无重复元素原理、set容器排序、自定义数据
摘要:1.set如何实现无重复元素 void printSet(set<int>& s) { for (set<int>::iterator it = s.begin(); it != s.end(); it++) { cout << *it << " "; } cout << endl; } //set
阅读全文
STL容器pair对组
摘要:1. #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; //创建对组 void test01() { //第一种 pair<string, int> p(string(
阅读全文
STL容器之set容器API(一)
摘要:关联式容器 插入数据自动排序 按照key insert 插入值 erase 参数可以传值 或者 迭代器 find() 返回值 迭代器 找不到返回的 end() count 计数 对于set而言 结果 就是 0 或者1 lower_bound(keyElem);//返回第一个key>=keyElem元
阅读全文
STL容器之set基本概念
摘要:set基本概念 Set的特性是。所有元素都会根据元素的键值自动被排序。Set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值。Set不允许两个元素有相同的键值。 我们可以通过set的迭代器改变set元素的值吗?不行,因为set元素值就是其键值,关系到set元素的排序规则。如果
阅读全文
STL容器list使用remove删除自定义类型数据
摘要:1. #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #include <list> //自定义数据类型 class Person { public: Person(string name, int a
阅读全文
STL容器list容器API的常规用法
摘要:赋值、构造、大小、为空、删除 、添加 移除 remove( 10 ) 删除容器中所有与10 匹配的元素 双向循环链表 迭代器是不支持随机访问的 反转排序 reverse 反转 排序 成员函数 sort 默认排序 从小到大 自定义数据类型,必须指定排序规则 高级 多排序规则 #define _CRT_
阅读全文
STL容器list容器API
摘要:1. /* list构造函数 list<T> lstT;//list采用采用模板类实现,对象的默认构造形式: list(beg,end);//构造函数将[beg, end)区间中的元素拷贝给本身。 list(n,elem);//构造函数将n个elem拷贝给本身。 list(const list &l
阅读全文
STL容器之list基本概念
摘要:基本概念 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相较于vector的连续
阅读全文
STL容器queue的API
摘要:先进先出 没有迭代器 队头 front 队尾 back 入队 push 弹出队头 pop 大小 size 为空 empty #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #include <queue
阅读全文
STL容器stack的API
摘要:先进后出 没有迭代器 栈顶 top 压栈 push 弹出栈顶 pop 大小 size 为空 empty /* stack构造函数 stack<T> stkT;//stack采用模板类实现, stack对象的默认构造形式: stack(const stack &stk);//拷贝构造函数 stack赋
阅读全文
STL排序算法sort
摘要:排序 sort 引用头文件 algorithm sort(d.begin(),d.end()) 从小到大 #include <algorithm> #include <deque> void printDeque(const deque<int>& d) { for (deque<int>::con
阅读全文
STL容器deque容器API
摘要:双端数组 没有容量 API 赋值、构造、大小、交换、插入 、删除 头部删除 头部插入 pop_front push_front 3中迭代器 iterator 普通 reverse_iterator 逆序迭代器 const_iterator只读迭代器 排序 sort 引用头文件 algorithm s
阅读全文
STL迭代器分类
摘要:1.普通迭代器 iterator 2.逆序迭代器 reverse_iterator 3.只读迭代器 const_iterator 4.双向Bidirectional Iterators
阅读全文
STL容器deque概念
摘要:常数项时间:以固定的步骤完成一系列操作 基本概念 Vector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当然,vector容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,无法被接受。 Deque容器
阅读全文
STL容器单端和双端
摘要:单端数组 只有一个开口,如vector 双端数组 双向开口
阅读全文
STL逆序迭代器(reverse_iterator)
摘要:1. //逆时针遍历 void test02() { vector<int>v; for (int i = 0; i < 10; i++) { v.push_back(i); } printVector(v); //逆序迭代器 reverse_iterator for (vector<int>::r
阅读全文
STL容器之vector容器API(二)
摘要:存取操作 插入和删除 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #include <vector> /* vector数据存取操作 at(int idx); //返回索引idx所指的数据,如果id
阅读全文
STL容器之vector容器巧用swap收缩空间
摘要:1.原理图 实例: #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #include <vector> //巧用swap收缩空间 void test01() { vector<int> v; for (
阅读全文
STL容器之vector容器API(一)
摘要:ector容器 单端数组(只有一个开口)、动态数组(动态扩展空间) 构造、赋值、 大小 size 重置大小 resize 容量 capacity 是否为空 empty 交换 swap #define _CRT_SECURE_NO_WARNINGS #include <iostream> using
阅读全文
STL容器vector概念和注意事项(每次扩充都会重新开辟空间,释放原空间,即首元素地址会变一次)
摘要:1.vector容器基本概念 vector的数据安排以及操作方式,与array非常相似,两者的唯一差别在于空间的运用的灵活性。Array是静态空间,一旦配置了就不能改变,要换大一点或者小一点的空间,可以,一切琐碎得由自己来,首先配置一块新的空间,然后将旧空间的数据搬往新空间,再释放原来的空间。Vec
阅读全文
STL容器之string内存重定义
摘要:修改string字符串的内容,下标操作符[]和at都会返回字符的引用。但当字符串的内存被重新分配之后,可能发生错误 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #include <string> v
阅读全文
STL容器之string与c_style类型转换
摘要:1.直接调用API转换 2.隐式类型转换 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #include <string> /* string和c-style字符串转换 //string 转 char
阅读全文
STL容器之string插入和删除
摘要:1. /* 插入和删除操作 string& insert(int pos, const char* s); //插入字符串 string& insert(int pos, const string& str); //插入字符串 string& insert(int pos, int n, char
阅读全文
STL容器之string字串
摘要:字串 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #include <string> /* 字串 string substr(int pos = 0, int n = npos) const;//返
阅读全文
STL容器之string比较
摘要:比较第一个不相同的字符的大小 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #include <string> /* 比较 compare函数在>时返回 1,<时返回 -1,==时返回 0。 比较区分
阅读全文
STL容器之string查找和替换
摘要:1.查找和替换 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; /* 查找和替换 int find(const string& str, int pos = 0) c
阅读全文
STL容器之string拼接
摘要:1.拼接 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #include <string> /* 拼接操作 string& operator+=(const string& str);//重载+=操作
阅读全文
STL容器之string存取字符串 []和at访问区别
摘要:存取字符串 char& operator[](int n);//通过[]方式取字符 char& at(int n);//通过at方法获取字符 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #inclu
阅读全文
STL容器之string构造函数和基本赋值
摘要:1.构造函数和基本赋值 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #include <string> /* 构造函数 string();//创建一个空的字符串 例如: string str; st
阅读全文
STL容器之string容器成员
摘要:基本概念 C风格字符串(以空字符结尾的字符数组)太过复杂难于掌握,不适合大程序的开发,所以C++标准库定义了一种string类,定义在头文件<string>。 String和c风格字符串对比: Char*是一个指针,String是一个类 string封装了char*,管理这个字符串,是一个char*
阅读全文
STL容器嵌套
摘要:vector STL 中的标准容器之一 :动态数组 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #include <vector> #include <algorithm> void myPrint
阅读全文
STL三大组件(容器、算法、迭代器)初始及区分*it和it
摘要:容器 vector 算法 for_each 头 algorithm 迭代器 iterator 每个容器有专属迭代器 vector<int >v vector<int>::iterator it = ….. v.begin() 指向第一个数据 v.end 指向 最后一个数据的下一个地址 #define
阅读全文
文件读写
摘要:和文件有关系的输入输出类主要在fstream.h这个头文件中被定义,在这个头文件中主要被定义了三个类,由这三个类控制对文件的各种输入输出操作,他们分别是ifstream、ofstream、fstream,其中fstream类是由iostream类派生而来,他们之间的继承关系见下图所示: 打开并写入文
阅读全文
标准输出流
摘要:字符输出 cout.flush() //刷新缓冲区 Linux下有效 cout.put() //向缓冲区写字符 cout.write() //从buffer中写num个字节到当前输出流中 cout.put() cout.write() 格式化输出 实例: void test02() { int nu
阅读全文
用cin.sync()清空输入缓冲区是错误的
摘要:在vs中使用cin.sync()无法清空输入缓冲区 两种比较好的方法: cin.ignore(numeric_limits<streamsize>::max(),'\n') //需要包含<limits> 或者 cin.ignore(cin.rdbuf()->in_avail()) 实例: void
阅读全文
标志位与清空缓冲区--???
摘要:让用户输入指定范围内的数字,如果不正确 重新输入 cin.fail() 看标志位 0正常 1不正常 cin.clear()重置标志位 cin.syne() 清空缓冲区 解决不了死循环问题 void test07() { int num; cout << "请输入0-10的数字" << endl; w
阅读全文
标准输入流
摘要:标准输入流 cin.get 缓冲区中读取一个字符 cin.get(两个参数) 不读换行符 cin.getline () 读取换行 并且扔掉 cin.ignore 忽略 (N) N代表忽略字符数 cin.peek 偷窥 偷看1个字符然后放回去 cin.putback 放回 把字符放回缓冲区 cin.g
阅读全文
输入和输出流
摘要:流的概念和流类库的结构 程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件。 C++输入输出包含以下三个方面的内容: 对系统指定的标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。 以外存磁盘文件为对象进行输
阅读全文
编写自己的异常类
摘要:编写自己的异常类 自己的异常类 需要继承于 exception 重写 虚析构 what() 内部维护以错误信息 字符串 构造时候传入 错误信息字符串,what返回这个字符串 string 转 char * .c_str(); #define _CRT_SECURE_NO_WARNINGS #incl
阅读全文
使用系统提供的标准异常
摘要:标准异常库 #incldue <stdexcept> throw out_of_range(”aaa”) 。。。 catch(out_of_range & e) cout << e.what(); #define _CRT_SECURE_NO_WARNINGS #include <iostream>
阅读全文
标准异常库
摘要:标准异常库 ① 在上述继承体系中,每个类都有提供了构造函数、复制构造函数、和赋值操作符重载。 ② logic_error类及其子类、runtime_error类及其子类,它们的构造函数是接受一个string类型的形式参数,用于异常信息的描述 ③ 所有的异常类都有一个what()方法,返回const
阅读全文
异常的多态使用
摘要:异常的多态使用 利用多态来实现 printError同一个接口调用 抛出不同的错误对象,提示不同错误 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; //异常基类 class BaseException
阅读全文
异常变量的声明周期
摘要:异常变量的声明周期 如果 MyException e,会多开销一份数据 ,调用拷贝构造 如果 MyExcepiton *e , 不 new提前释放对象 new 自己管理delete 推荐 MyException &e 容易些 而且 就一份数据 #define _CRT_SECURE_NO_WARNI
阅读全文
异常的接口声明
摘要:如果想抛出特定的类型异常 ,可以利用异常的接口声明 void func() throw ( int) 只能抛出 int类型 throw() 不抛出任何类型异常 使用QT创建项目 #include "mainwindow.h" #include <QApplication> #include <QDe
阅读全文
栈解旋(unwinding)
摘要:概念 异常被抛出后,从进入try块起,到异常被抛掷前,这期间在栈上构造的所有对象,都会被自动析构。析构的顺序与构造的顺序相反,这一过程称为栈的解旋(unwinding). #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namesp
阅读全文
自定义异常
摘要:#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class myException { public: void printError() { cout << "自定义异常" << endl; } };
阅读全文
异常的基本使用
摘要:异常 异常处理就是处理程序中的错误。所谓错误是指在程序运行的过程中发生的一些异常事件(如:除0溢出,数组下标越界,所要读取的文件不存在,空指针,内存不足等等) try 试图执行 try{}中的内容 在可能出现异常的地方 抛出异常 throw try下面 catch捕获异常 catch( 捕获类型 )
阅读全文
重新解释转换(reinterpret_cast)
摘要:最不安全,最鸡肋 不推荐 class Base {}; class Child :public Base {}; class Other {}; //重新解释转换(reinterpre_cast) void test02() { int a = 10; int* p = reinterpret_ca
阅读全文
类型转换(常量转换和引用转换)
摘要:常量转换 不能对非指针或者非引用进行转换 对引用转换 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; void test01() { const int* p = NULL; //取出const int
阅读全文
类型转换(动态转换)dynamic_cast
摘要:动态转换 不可以转换基础数据类型 父子之间可以转换 父转子 不可以 子转父 可以 发生多态 都可以 1.基础类型不可以转换 2.父子关系 向上转 可以 向下转 不安全就不可以 注意: dynamic_cast如果发生了多态,那么可以让基类转成派生类,向下转换 #define _CRT_SECURE_
阅读全文
类型转换(静态转换:static_cast)
摘要:静态转换 使用方式 static_cast< 目标类型>(原始数据) 可以进行基础数据类型转换 父与子类型转换 没有父子关系的自定义类型不可以转换 1.普通类型 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace s
阅读全文
类模板碰到友元函数(类外实现)
摘要:难点 1.不注意普通函数加上template<> 就成了模板函数, 而友元函数声明的时普通函数, 找不到普通函数的实现链接 err1 2.类内声明了模板函数,但此时声明因为有 <>所以编译器看不到,需要在这之前先声明函数 3.声明了函数还是会报错,因为函数中的参数 Person类并没有声明,所以还要
阅读全文
类模板碰到友元函数(类内实现)
摘要:友元函数类内实现 friend void printPerson( Person<T1 ,T2> & p ) 友元函数类外实现 friend void printPerson<>(Person<T1, T2> & p); //没有<>普通函数 声明 加上 <>模板函数声明 让编译器看到 函数 并且看
阅读全文
类模板的分文件编写的问题和解决(要引入.cpp而不是头文件)
摘要:分文件解决 .h .cpp分别写声明和实现 但是由于 类模板的成员函数运行阶段才去创建,导致包含.h头文件,不会创建函数的实现,无法解析外部命令 解决方案 保护 .cpp文件 (不推荐) 不要进行分文件编写,写到同一个文件中,进行声明和实现,后缀名改为.hpp 约定俗成的 (.hpp文件即分文件模板
阅读全文
类模板的类外实现成员函数
摘要:1. template <class T1, class T2> Person<T1, T2>::Person(T1 name, T2 age) #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using n
阅读全文
类模板继承问题
摘要:基类如果是模板类,必须让子类告诉编译器 基类中的T到底是什么类型 如果不告诉,那么无法分配内存,编译不过 利用参数列表class Child :public Base<int> #define _CRT_SECURE_NO_WARNINGS #include <iostream> using nam
阅读全文
查看数据类型
摘要:1. typeid(T).name(); //可以查看泛型传入的时什么类型数据
阅读全文
类模板做函数参数
摘要:三种方式 显示指定类型 参数模板化 整体模板化 实例: #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; //类模板 template<class NameT, cla
阅读全文
类模板基本使用
摘要:类模板 语法:template <T…> 紧跟着是类 区别: 与函数模板区别,可以有默认类型参数 函数模板可以进行自动类型推导,而类模板不可以 类模板中的成员函数 一开始不会创建出来,而是在运行时才去创建 #define _CRT_SECURE_NO_WARNINGS #include <iostr
阅读全文
函数模板的局限性级解决方法(第三代具体化)
摘要:1. #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; class Person { public: Person(string name, int age) { th
阅读全文
模板实现机制
摘要:函数模板机制结论: 编译器并不是把函数模板处理成能够处理任何类型的函数,模板不是万能的,不能通用所有的数据类型 函数模板通过具体类型产生不同的函数,模板并不能直接调用,生成后的模板函数才可以调用 编译器会对函数模板进行两次编译,在声明的地方对模板代码本身进行编译,在调用的地方对参数替换后的代码进行编
阅读全文
函数模板与普通函数的区别以及调用规则
摘要:区别 普通函数可以进行隐式类型转换 模板不可以 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; //1.普通函数和函数模板的区别 template<class T> T myPlus(T a, T b)
阅读全文
函数模板基本用法及泛型
摘要:函数模板 template < class / typename T> 告诉编译器紧跟的代码里出现T不要报错 mySwap( T &a T &b ) 类型也需要传入 ,类型参数化 myswap(a,b) 自动类型推导 按照a b的类型 来替换T myswap<int>(a,b) 显示指定类型 实例:
阅读全文
向上类型转换和向下类型转换
摘要:1. 基类转派生类 向下类型转换 不安全的 派生类转 基类 向上类型转换 安全 如果发生多态 总是安全的 父类中如果写了虚函数,而子类没有任何重写,有意义吗? 没有意义
阅读全文
虚析构和纯虚析构
摘要:虚析构 virtual ~类名() {} 解决问题: 通过父类指针指向子类对象释放时候不干净导致的问题 纯虚析构函数 写法 virtual ~类名() = 0 类内声明 类外实现 如果出现了纯虚析构函数,这个类也算抽象类,不可以实例化对象 不用虚析构的化,delete子类的时候,只会调用父类的析构
阅读全文
纯虚函数和抽象类
摘要:纯虚函数 仅想对基类进行向上类型转换,使用它的接口,而不希望用户实际的创建一个基类的对象 抽象类 在基类中加入至少一个纯虚函数(pure virtual function),使得基类称为抽象类(abstract class). 纯虚函数使用关键字virtual,并在其后面加上=0。如果试图去实例化一
阅读全文
多态原理
摘要:解析 当父类中有了虚函数后,内部结构就发生了改变 内部多了一个 vfprt virtual function pointer 虚函数表指针 指向 vftable 虚函数表 父类中结构 vfptr &Animal::speak 子类中 进行继承 会继承 vfptr vftable 构造函数中 会将虚函
阅读全文
静态联编和动态联编即多态的概念
摘要:多态的成立条件 有继承 子类重写父类虚函数函数 返回值,函数名字,函数参数,必须和父类完全一致(析构函数除外) 子类中virtual关键字可写可不写,建议写 类型兼容,父类指针,父类引用 指向 子类对象 多态分类 静态多态 函数重载 动态多态 虚函数 继承关系 c++支持编译时多态(静态多态)和运行
阅读全文
虚基类的内部工作原理
摘要:1。对照表来看 代码: #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Animal { public: int m_Age; }; //虚基类 Sheep class Sheep:virt
阅读全文
菱形继承问题的解决方案--虚基类
摘要:菱形继承解决方案 利用虚继承 操作的时共享的一份数据 sheepTuo内部结构 vbptr 虚基类指针 v:virtual b:base p:pointer 指向一张 虚基类表 通过表找到偏移量 找到共有的数据 如图:类Sheep和Tuo保留的只是虚函数指针,只有Animal里才有数据 实例: #d
阅读全文
菱形继承(钻石继承)
摘要:两个派生类继承同一个基类而又有某个类同时继承者两个派生类,这种继承被称为菱形继承,或者钻石型继承。 这种继承所带来的问题: 羊继承了动物的数据和函数,鸵同样继承了动物的数据和函数,当草泥马调用函数或者数据时,就会产生二义性。 草泥马继承自动物的函数和数据继承了两份,其实我们应该清楚,这份数据我们只需
阅读全文
多继承
摘要:同时继承多个基类 class A : public B1, public B2,…. 引发二义性问题 想解决二义性问题,就需要通过作用域来进行区分 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; cla
阅读全文
非自动继承的函数
摘要:1.构造函数 2.析构函数 3.operator=
阅读全文
继承中的静态成员的处理
摘要:类似非静态成员函数处理 如果想访问父类中的成员,加作用域即可 1.子类可以继承静态成员属性 如果有重名静态成员,就近原则 静态成员方法 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Bas
阅读全文
继承中的同名处理(就近原则)
摘要:处理方法 当子类成员和父类成员同名时,子类依然从父类继承同名成员 如果子类有成员和父类同名,子类访问其成员默认访问子类的成员(本作用域,就近原则) 在子类通过作用域::进行同名成员区分(在派生类中使用基类的同名成员,显示使用类名限定符) 成员属性 直接调用先调用子类,如果想调用父类 需要作用域 成员
阅读全文
继承中的构造和析构
摘要:调用原则: 子类对象在创建时会首先调用父类的构造函数 父类构造函数执行完毕后,才会调用子类的构造函数 当父类构造函数有参数时,需要在子类初始化列表(参数列表)中显示调用父类构造函数 析构函数调用顺序和构造函数相反 1.顺序 1.1 子类创建对象时,先调用父类的构造,然后调用自身构造 1.2 析构顺序
阅读全文
查看class数据模型的操作
摘要:1.打开vs2019开发人员命令提示 进入问价夹,dir查看文件在不在 然后输入固定语法: cl /d1 报告单个类的布局[跟类名] 属于哪个cpp文件 cl /d1 reportSingleClassLayoutSon test.cpp 可以看到
阅读全文
继承中的对象模型
摘要:1.子类中 会继承父类的私有成员,只是被编译器隐藏起来了,无法访问父类的私有成员,但是sizeof会给私有成员空间 子类会继承父类中所有的内容 ,包括了 私有属性 只是我们访问不到,编译器给隐藏了 cl /d1 reportSingleClassLayout类名 文件名 #define _CRT_S
阅读全文
继承方式
摘要:public:公有继承 protected:保护继承 private:私有继承 关系: 不管公有继承 保护 还是私有 基类中的私有属性 ,都不可以继承下去 公有继承 父类中的protected 在子类中是 protected 父类中的public 在子类中是 public 保护继承 父类中的prot
阅读全文
继承语法
摘要:减少代码的重复 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class BasePage { public: void Header() { cout << "公共头部" << endl; } };
阅读全文
运算符和结合性
摘要:1. 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 -- () 圆括号 (表达式)/函数名(形参表) -- . 成员选择(对象) 对象.成员名 -- -> 成员选择(指针) 对象指针->成员名 -- 2 - 负号运算符 -表达式 右到左 单目
阅读全文
符号重载总结
摘要:l =, [], () 和 -> 操作符只能通过成员函数进行重载 l << 和 >>只能通过全局函数配合友元函数进行重载 l 不要重载 && 和 || 操作符,因为无法实现短路规则
阅读全文
函数调用运算符()重载及仿函数概念
摘要:用法一: #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; class myPrint { public: //()重载 void operator()(string
阅读全文
关系运算符重载(==和!=)
摘要:1. int strcmp(const char *s1, const char *s2); 功能:比较 s1 和 s2 的大小,比较的是不相同的第一个字符ASCII码大小。 参数: s1:字符串1首地址 s2:字符串2首地址 返回值: 相等:0 大于:>0 小于:<0 实例: #define _C
阅读全文
[]运算符重载(数组索引)
摘要:1.1 返回数组索引的引用 1.2 int & operator[](int index) 1.3 return this->pAddress[index] int& operator[](int index) { return this->p_Address[index]; }
阅读全文
赋值运算符重载
摘要:一个类默认创建时 默认构造、析构、拷贝构造和operator=赋值运算符重载(浅拷贝) 进行简单的值传递 1.1 系统默认给类提供 赋值运算符写法 是简单值拷贝 1.2 导致如果类中有指向堆区的指针,就可能出现深浅拷贝的问题 #define _CRT_SECURE_NO_WARNINGS #incl
阅读全文
智能指针的实现(指针运算符重载)
摘要:智能指针的实现 Person类有showAge 成员函数 如果new出来的Person对象,就要让程序员自觉的去释放 delete 有了智能指针,让智能指针托管这个Person对象,对象的释放就不用操心了,让智能指针管理 为了让智能指针想普通的Person*指针一样使用 就要重载 -> 和* #de
阅读全文
前置后置运算符重载
摘要:前置和后置自增 自己实现int类型 MyInteger 内部维护以int数据 MyInteger myInt myInt ++ 后置 ++myInt 前置 重载++运算符 operator++() 前置 operator++(int) 后置 前置理念 先++ 后返回自身 后置理念 先保存住原有值 内
阅读全文
重载左移运算符并作为友元函数
摘要:不要随意乱用符号重载 内置数据类型 的运算符不可以重载 cout << 直接对Person自定义数据类型 进行输出 写到全局函数中 ostream& operator<< ( ostream & cout, Person & p1 ) {} #define _CRT_SECURE_NO_WARNIN
阅读全文
运算符重载
摘要:加号运算符重载 如果想让自定义数据类型 进行+运算,那么就需要重载 + 运算符 在成员函数 或者 全局函数里 重写一个+运算符的函数 函数名 operator+ () {} 运算符重载 也可以提供多个版本 #define _CRT_SECURE_NO_WARNINGS #include <iostr
阅读全文
成员函数做友元函数
摘要:成员函数做友元函数 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; //只让Visit可以作为友元函数 Visit2不可以 class House; //先声明,防止
阅读全文
类做友元类,类内声明,类外实现
摘要:友元语法 friend关键字只出现在声明处 其他类、类成员函数、全局函数都可声明为友元 友元函数不是类的成员,不带this指针 友元函数可访问对象任意成员属性,包括私有属性 友元类 friend class 类名 友元类 是单向,不可传递的 #define _CRT_SECURE_NO_WARNIN
阅读全文
友元函数 friend
摘要:全局函数做友元函数 全局函数写到类中做声明 并且使用友元函数关键字friend 实现 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; class House { fr
阅读全文
mutable关键字
摘要:需要修改常函数里的数值,需要加上mutable关键字 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Person { public: Person() { //构造中修改属性 //this
阅读全文
const修饰成员函数(常函数 )和常对象
摘要:常函数 void func() const {} 常函数 修饰是this指针 const Type * const this, 不能修改this指针指向的值 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std
阅读全文
空指针访问成员函数
摘要:如果成员函数没有用到this,那么空指针可以直接访问 如果成员函数用的this指针,就要注意,可以加if判断,如果this为NULL就return, 否则直接报错 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace
阅读全文
链式编程和this的使用
摘要:this指针的使用 指针永远指向当前对象 解决命名冲突 *this 指向对象本体 非静态的成员函数才有this指针 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Person { publ
阅读全文
指定内存对齐
摘要:链接:https://www.jianshu.com/p/d994731f658d #pragma pack() 1.#pragma简述: 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一
阅读全文
面向对象模型初探
摘要:成员变量和函数的存储 c++实现了“封装”,那么数据(成员属性)和操作(成员函数)是什么样的呢? “数据”和“处理数据的操作(函数)”是分开存储的。 c++中的非静态数据成员直接内含在类对象中,就像c struct一样。 成员函数(member function)虽然内含在class声明之内,却不出
阅读全文
单例
摘要:单例实现 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Singleton { public: static Singleton* Instance() //只提供一个公有化的指针返回 {
阅读全文
静态成员变量
摘要:静态成员变量 在类定义中,它的成员(包括成员变量和成员函数),这些成员可以用关键字static声明为静态的,称为静态成员。 不管这个类创建了多少个对象,静态成员只有一个拷贝,这个拷贝被所有属于这个类的对象共享。 在一个类中,若将一个成员变量声明为static,这种成员称为静态成员变量。与一般的数据成
阅读全文
动态对象创建new运算符
摘要:对象创建 当创建一个c++对象时会发生两件事: 为对象分配内存 调用构造函数来初始化那块内存 第一步我们能保证实现,需要我们确保第二步一定能发生。c++强迫我们这么做是因为使用未初始化的对象是程序出错的一个重要原因 动态分配内存方法 为了在运行时动态分配内存,c在他的标准库中提供了一些函数,mall
阅读全文
类对象作为类成员
摘要:1.类的类成员的类中要有默认构造参数 2.构造顺序 当类对象作为类的成员时,构造顺序是先依次构造类成员的构造,然后再构造自己 3.析构顺序 析构与构造相反,先析构自己,再以相反顺序依次析构成员 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #
阅读全文
类的初始化列表
摘要:利用初始化列表来初始化数据 构造函数后面 + : 属性1(参数1), 属性2(参数2),…… class Test { public: /* Test(int a, int b, int c) { m_A = a; m_B = b; m_C = c; }*/ Test(int a, int b, i
阅读全文
深拷贝和浅拷贝
摘要:浅拷贝 同一类型的对象之间可以赋值,使得两个对象的成员变量的值相同,两个对象仍然是独立的两个对象,这种情况被称为浅拷贝. 一般情况下,浅拷贝没有任何副作用,但是当类中有指针,并且指针指向动态分配的内存空间,析构函数做了动态内存释放的处理,会导致内存问题。 浅拷贝引发的问题 深拷贝 当类中有指针,并且
阅读全文
构造函数调用规则
摘要:系统默认给一个类提供3个函数 默认构造、拷贝构造、析构函数 1.当我们有了有参构造函数,那么系统就不会再提供默认构造函数了 没有有参构造函数时: 2.但是 系统还会提供默认拷贝构造函数,即使没有定义拷贝构造,也可以直接调用,进行简单的值拷贝 3.当我们提供了拷贝构造,那么系统就不会提供其它构造了,如
阅读全文
Release优化
摘要:debug和release调试结果不同是因为release下会将代码再次优化 void test02() { Person p; p.age = 10; doWork(p); } Person doWork2() { Person p1; return p1; //复制一个新的数据返回 } void
阅读全文
构造和析构
摘要:class Person { Person() //构造 { } //可以重载和有参 ~Person() //析构 { } } 构造函数 与类名相同,不用写void 分类 参数分类:无参构造函数 有参构造函数 类型分类:普通构造函数 拷贝构造函数 #include <iostream> using
阅读全文
const修饰的成员函数
摘要:#include <iostream> using namespace std; class Cube { public: void SetL(int l) { m_L = l; } int GetL() const //只有用const修饰的方法,compareCube才能用const做形参 {
阅读全文
class和struct权限
摘要:class 成员默认权限是private struct 成员默认权限是public
阅读全文
封装加强
摘要:C语言封装 属性和行为分开处理了,类型检测不够 typedef struct _Person{ char name[64]; int age; }Person; typedef struct _Aninal{ char name[64]; int age; int type; //动物种类 }Ain
阅读全文
函数重载实现原理
摘要:编辑器为了实现重载函数,用不同类型来修饰不同的函数名,比如 void func(); 编辑器会修饰成_func 碰到void func(int x),编辑器会修饰成_func_int 碰到void func(int x , char c),可能就会修饰成_func_int_char
阅读全文
Unity2019破解hub
摘要:激活软件激活以后还是不能打开, 删除Program Files\Unity\Editor\Editor\Data\Resources\Licensing目录
阅读全文
Lua模拟stack
摘要:原文引自:https://blog.csdn.net/weixin_30535913/article/details/96012323 LuaStack.lua local stack = {} stack.__index = stack function stack:new() local tem
阅读全文
函数重载
摘要:1.相同的作用域 2.有默认参数时,要注意避免二义性问题 void func(int a, int b = 20) { } void func(int a ) { } void test() { func(20); //error 不知道调用哪个 }
阅读全文
LeanTween
摘要:原文链接:https://blog.csdn.net/qq_35373690/article/details/86901002 物体本身大小 LeanTween.scale(Cube, new Vector3(0, 0, 0), 0.5f); //3个参数1.变换的物体,2变化的大小,3.时间 //
阅读全文
占位参数和默认参数
摘要:函数占位参数 占位参数只有参数类型声明,⽽而没有参数名声明 一般情况下,在函数体内部⽆无法使⽤用占位参数, 只有重载的时候才有用 占位参数可以有默认值 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; /
阅读全文
获取所有的失活的子孙物体
摘要:原文链接:https://blog.csdn.net/ChinarCSDN/article/details/80878900 查询所有失活的子孙物体 using UnityEngine; /// <summary> /// 查找物体 /// </summary> public class China
阅读全文
内联函数
摘要:早期作用是用来代替宏 宏函数的缺陷 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; //缺陷1:没有类型 //#define MyAdd(x,y) x+y //解决方法:加括号 #define MyAd
阅读全文
int *const p,const int *p和int const *p的区别
摘要:原文地址:https://blog.csdn.net/u013412497/article/details/24495271 在学习c语言的过程中,可能我们很少见到int int *const p,const int *p和int const *p,但当我们在学习c++的过程中,就会遇到这些模糊不清
阅读全文
C++对C语言的拓展
摘要:引用 变量名 变量名实质上是一段连续存储空间的别名,是一个标号(门牌号) 通过变量来申请并命名内存空间. 通过变量的名字可以使用存储空间. 引用的概念 变量名,本身是一段内存的引用,即别名(alias). 引用可以看作一个已定义变量的别名。 引用的语法:Type&
阅读全文
C++对C的增强
摘要:命名空间 实用性增强 C语⾔言中的变量都必须在作⽤用域开始的位置定义!! C++中更强调语⾔言的“实⽤用性”,所有的变量都可以在需要使⽤用时再定义。 using namespace std; int main(void) { int i = 0; cout << "i = " << i << end
阅读全文
BSS段
摘要:C/C++对于定义的没赋值的变量开辟的空间在BSS段,BSS段的数据全部为0 赋值的变量的数据被定义在data的数据段内
阅读全文
二义性
摘要:#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; namespace LOL { int swkId = 1; } void test01() { int swkId = 2; using LOL::sw
阅读全文
c++基础
摘要:::作用域运算符 ::双冒号为全局运算符 #include <iostream> using namespace std; int atk = 200; void Test() { int atk = 100; cout << "Test内部:" << atk << endl; cout << "T
阅读全文
VS里面设置类似于#1或者#2之类的程序快捷输入
摘要:原文引自:https://blog.csdn.net/sisixiaocainiao/article/details/104238085 C语言版点击工具->代码片段管理器 语言选择Visual C++ ->以class为模板-> 复制位置路径 进入文件资源管理器,将class文件复制到本路径下。
阅读全文