2 运算符重载两种方式
运算符重载的两种方式1 基本概念基础 运算符时具有特殊名字的函数:由关键字operator和气候定义的运算符共同组成。 可以被重载的运算符 方式 将运算符重载为类的成员函数。 重载运算符函数,并声明为类的友元。 规则 重载后的运算符必须至少有一个操作数是用户定义的类型,这是为了防止程序员为标准类型重载运算符,可以确保程序正确运行。 不能修改运算符的优先级,不能违反运算符原本的运算规则。例如在重载加号时,不能提供两个形参(友元除外),例如下面的这种重载方式就是不被允许的;因为加法是一种双目运算符。在重载为类的成员函数后,加法运算的第一项应该是调用函数的一个对象。所以在运算符重载时,参数表中的参数数目应该是重载运算符的操作数减1。 1Time operator+(const Time &t1,const Time &t2) const; 不能创造新的运算符,例如不能定义operator**()运算符; 不能重载以下运算符; 12345.:成员运算符.*:成员指针运算符:: :作用域运算符?::条件运算符siezof:sizeof运算符。 很多运算...
3 类与对象
面向对象程序设计 参考文献 多态的三种方式 虚继承和虚基类 面向对象的基本概念 数据抽象和封装(在语法基础部分讲解过了) 继承 多态(动态绑定) 1 面向对象程序设计核心思想 抽象:类的接口与实现分离。 封装:隐藏内部实现细节。访问控制运算符public/private/protect 继承:定义相似的类型,对相似的关系建模。实现代码重用。 多态:可以在以一定程度上忽略相似类型的区别。 继承概念 继承、泛化 继承:联系在一起的类构成以中层次关系 基类:层次关系的根部 派生类:其他类则直接或间接地从基类继承而来。 派生类与基类的函数继承: 与类型相关的函数。基类与派生类类型不同,需要重写。 与类型无关的函数。派生类直接继承,不需要修改。 类派生列表:派生类通过类派生列表,明确指出它的基类。 1234class Dog:public Animal{public: double price()const override;} 派生类可以通过override关键字注明改写基类的函数。 多态(动态绑定)...
4 继承与派生
继承与派生1 继承定义基类12345678910111213141516class Quote{public: Quote() = default; Quote(string book,double sales_price):book_no(book),price(sales_price){}; string isbn()const{ return this.book_no; } virtual double net_price(int n)const{ return n*price; } virtual ~Quote()=default;private: string book_no;protected: double price;}; 定义派生类12345678910class Bulk_quote:public Quote{public: Bulk_quote()=default; Bulk...
19 内存对齐
概述概念 编译器为程序中的每个“数据单元”安排在适当的位置上。 原因 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。 性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。 补充观点:字节对齐主要是为了提高内存的访问效率,比如intel 32位cpu,每个总线周期都是从偶地址开始读取32位的内存数据,如果数据存放地址不是从偶数开始,则可能出现需要两个总线周期才能读取到想要的数据,因此需要在内存中存放数据时进行对齐。 例如64位操作系统,存储32位int值。如果两个int值占用同一个64位的寻址空间,那么方位第二个int值,需要两次寻址过程。首先找到地址,然后得到偏移。 规则每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。 数据成员...
20 字符串类实现
基本功能 实现头文件的封装:MyString.h 缺省构造函数对字符串的初始化MyString() 使用构造函数初始化字符串的另外两种方式,动态指针+拷贝构造函数 ) 析构函数,释放动态申请的字符串空间 重载输出运算符 << 重载赋值运算符 = 重载下标运算符 [],索引输出 拓展功能. 字符串长度的比较 字符串的排序功能 字符串的倒置 字符串中指定两个字符的交换 查找某字符串是否位于指定的字符串中(采用暴力查找) 实现1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211...
3.3 接雨水问题
接雨水问题 这个问题也太经典了,能用的这些思路,也太神奇了。 1 接雨水问题给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方图,在这种情况下,可以接 6 个单位的水(蓝色部分表示水)。 感谢 Marcos 贡献此图。 示例: 链接 1234输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6 问题分析 问题抽象 问题分类:线性数组 1.1 接雨水问题——动态规划策略算则 动态规划 算法设计 左扫一遍,求每个位置的左最大值。 右扫一遍,取每个位置的右最大值。 取两个最大值的最小值。作为该位置能接雨水的高度。 算法分析 时间复杂度O(n) 空间复杂度O(n) 算法实现12345678910111213141516171819202122class Solution {public: int trap(vector<int>& height) { int n=height....
5.4 最长回文串
最长回文串问题描述给你一个字符串 s,找到 s 中最长的回文子串。 问题分析策略选择算法设计 问题分解划分阶段:规模增长的方向有两个,第一个是最长回文串的长度,第二个是字符串的长度。 确定状态变量dp[i][j]。表示长度为i,以j为起点的字符串是否是回文串。 确定状态转移方程。长度减2,起始位置为j+1的回文字符串。$$dp[i][j]=dp[i-2][j+1] and s[j]==s[j+1-1]$$ 确定边界实现过程。i增长的边界是n,表示最大长度为n,i=0,和i=1时,值都初始化为1;j增长的边界是0到n-i 算法分析 时间复杂度O(n^2) 空间复杂度O(n^2) 算法实现1234567891011121314151617181920212223242526272829class Solution {public:// 思路1 动态规划 string longestPalindrome(string s) { int n=s.size(); if(n==0)re...
1 用户界面
1 菜单栏文件编辑选择查看转到运行终端2 侧边栏文件搜索版本调试插件用户设置3 状态栏4 编辑器
2 代码片段
2代码片段 参考vscode官方文档 1 内置片段2 扩展片段 扩展插件中包含对应语言的代码片段 3 自定义片段123456789101112131415161718{ "hello world": { "prefix": "hello", "body": [ "#include <iostream>", "#include <vector>", "using namespace std;", "int main()", "{", "\tvector<int> vec;", "\t${1:elemet}", "\tcout<<endl;", ...
3 运行调试
编译、运行、调试编译tasktasks.json tasks是终端的一部分。就像在.code-snippets json中配置snippet一样,可以用来提供代码片段。在tasks.json,配置命令执行的脚本。然后使用tasks命令执行。 tasks负责执行一些任务。主要由vscode的脚本提供支持。是vscode用来运行操作系统脚本的工具。 tasks可以在命令列表>tasks:中找到, 其中C/C++插件提供了默认的内容 。 12345678910111213141516171819{ "version": "2.0.0", "tasks": [ { "type": "shell", "label": "C/C++: g++.exe build active file", "command": "C:\\Program Files...














