指针

c++复习 多态

偶尔善良 提交于 2020-02-19 00:55:27
虚函数 什么是虚函数? 指向基类的指针在操作它的多态类对象时,会根据不同的类对象调用其相应的函数,这个函数就是虚函数,用virtaul修饰函数名。 虚函数的作用是在程序运行阶段动态地选择合适的成员函数 在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型,(参数顺序也要一致),以实现统一接口, 如果派生类中没有重新定义虚函数,则它集成基类的虚函数 虚函数的重写 虚函数的重写:派生类中有一个跟基类的完全相同虚函数,我们就称子类的虚函数重写了基类的虚函数,完全相同是指:函数名、参数、返回值都相同。另外虚函数的重写也叫作虚函数的覆盖。 class Person { public : virtual void BuyTicket ( ) { cout << "买票-全价" << endl ; } } ; class Student : public Person { public : virtual void BuyTicket ( ) { cout << "买票-半价" << endl ; } } ; void Func ( Person & p ) { p . BuyTicket ( ) ; } int main ( ) { Person ps ; Student st ; Func ( ps ) ; Func ( st ) ; return 0 ; } 不规范的重写行为

2020/2/18-C语言复习-字符串与指针

无人久伴 提交于 2020-02-18 21:27:03
C语言复习-字符串与指针 例一: 【字符串处理 去除C代码中的注释】      C/C++代码中有两种注释,/* */和//。编译器编译预处理时会先移除注释。就是把/*和*/之间的部分去掉,把//以及之后的部分删掉。这里约定,如果出现了/* AAAA /* BBBB */的情况,也就是/**/中出现了/*,那么第二个/*是不当作注释起始的。编写函数void removeComment(char *str)。    分析:对于字符串”int c=4,/*c累计量*/ a=3;/*变量*/ // a初值为3 ”先用 strstr函数 在str中确认”/*” 是否出现过,是则再确认”*/” 是否出现过,是则 把str中自”*/”出现位置后2个字符起始的字符串复制到str中”/*”开始的位置,覆盖掉注释部分。 循环查找直到找不到”/*”为止;再用strstr在str中确认”//” 是否出现过,是则 把出现”//”的位置上置为’\0’ 。 #include <stdio.h> #include <string.h> void removeComment(char *str) { char *p=str, *q; while ((p=strstr(p, "/*")) != NULL) { q=strstr(p, "*/"); if (q != NULL) strcpy(p, q+2); } p

第二天 函数指针

旧时模样 提交于 2020-02-18 15:44:23
#include <stdio.h> #include <stdlib.h> void initScores(int *data, int size) { for (int i = 0; i < size; i++) { /* code */ printf("请输入第%d个数据 \n",i+1); scanf("%d",*data); if(*data>100 || *data < 0){ printf("非法输入"); } } } void printScores(int *data, int size) { for (int i = 0; i < size; i++) { /* code */ printf("第%d个学生 分数是=%d \n",i-1, data[i]); } } int getMax(int *data, int size) { int max; max = *data; for (int i = 0; i < size; i++) { /* code */ if(max < *data){ max = *data; } } return max; } int getMin(int *data, int size) { int min; min = *data; for (int i = 0; i < size; i++) { /* code */ if

双指针总结

流过昼夜 提交于 2020-02-18 14:51:08
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。 示例 2: 给定 nums = [0,0,1,1,1,2,2,3,3,4], 函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。 你不需要考虑数组中超出新长度后面的元素。 我们使用i,j两个二指针, j 在前面走。如果 j 指向的元素等于 i 指向的元素 j 直接向前移,如果 j 指向的元素不等于 i 指向的元素,i 向前移 ,将 j 指向的元素赋给 i ,j向前移 public int removeDuplicates(int[] nums) { int i=0; for(int j=1;j<nums.length;++j){ if(nums[j] != nums[i]){ if(j-i != 1){ nums[++i]=nums[j]; } else{ ++i; //i,j相邻 直接 ++i } } } return i+1; } 给定一个已按照升序排列

Delphi 记录类型- 结构指针

若如初见. 提交于 2020-02-18 09:46:53
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class (TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); end ; var Form1: TForm1; implementation { $R *.dfm } type TRec = record { 定义结构 TRec } name: string [ 12 ]; age: Word; end ; TPRec = ^TRec; { 定义 TRec 结构的指针类型 TPRec } var Rec: TRec; { 声明结构变量 } PRec1,PRec2: TPRec; { 声明

boost智能指针小结

你说的曾经没有我的故事 提交于 2020-02-18 06:29:39
1.STL的指针auto_ptr当拷贝构造或者赋值时会发生控制权的转移,所以不能被当做元素存储到数组或者标准库的容器中去,当然也不能用指向数组的指针去初始化一个auto_pt对象。下面介绍几个此类的几个关键方法。 ap.reset(p); 如果p与ap的值不相同,则删除ap指向的对象并且将ap绑定到p。 ap.release(); 返回ap所保存的指针并且使ap成为未绑定的。 ap.get(); 返回ap所保存的指针。 2.boost::scoped_ptr/boost::scoped::array。 这两个只能指针不会存在所有权转移的问题,因为他们的拷贝构造函数和=操作符被声明为私有成员。。。重载了*和->操作符;还有一个reset()函数可以手动销毁指向的对象。 3.boost::shared_ptr/boost::shared_array。 该智能指针也重载了*和->操作符; reset()也是用于显式手动销毁对象的函数; use_count()用来检查当前指向所管理对象的shared_ptr的个数。 由于采用和引用计数机制来实现共享语意,所以可以存储到STL的容器中去,但是不可避免的出现了循环计数的问题。此问题用boost::weak_ptr来解决。boost::weak_ptr中存储的是指向一个已经由boost::shared_ptr所管理对象的弱引用

c++重温之函数指针和模板篇

天大地大妈咪最大 提交于 2020-02-18 05:25:50
函数指针 引入: 何为函数指针,和普通指针有什么区别!函数也是一段二进制码而已,所以也是要占用存储空间的,只是它的空间比普通的空间更安全。所以我们可以用指针指向它。 常用自定义形式: typedef int(*ADD)(int, int) ; using pADD = int(*)(int, int); //应该c++17可用 代码举例: typedef int(*ADD)(int, int) ; using pADD = int(*)(int, int); int Add(int a, int b) { return a + b; } int main() { //第一种 ADD pAdd = Add; cout << pAdd(3, 6) << endl; //第二种 pADD pAdd = Add; cout << pAdd(3, 6) << endl; } 结果: 函数模板 引入: 为什么要引入函数模板的问题呢?还是为了解决代码重复性问题! 例如: int Add(int a, int b) //int 加法 { return a + b; } float Add(float a, float b) //float 加法 { return a + b; } double Add(double a, double b) //double 加法 { return a + b;

【C语言】- 指向一维数组元素的指针!学习不需要带口罩,只要带脑子

 ̄綄美尐妖づ 提交于 2020-02-17 22:47:46
前面我们已经学习了指针,如果指针存储了某个变量的地址,我们就可以说指针指向这个变量。数组及其数组元素都占有存储空间,都有自己的地址,因此指针变量可以指向整个数组,也可以指向数组元素。 一、用指针指向一维数组的元素 输出结果: 说明已经通过指针间接修改了数组元素的值,跟指向一个普通int类型变量是一样的。 由于数组名代表着数组的首地址,即a == &a[0],因此第8行代码等价于: // 让指针指向数组的第0个元素 p = a; 内存分析图如下,一个指针变量占用2个字节,一个int类型的数组元素占用2个字节 二、用指针遍历数组元素 1.最普通的遍历方式是用数组下标来遍历元素 输出结果: 2.接下来我们用指针来遍历数组元素 先定义一个指针,指向数组的第一个元素 p的值是a[0]的地址,因此,现在我们利用指针p只能访问数组的第0个元素a[0],用*p就可取出a[0]的值1。要想访问其他元素,就必须拿到元素的地址,可以发现每个元素的地址差值为2,因为在16位编译器环境下,一个int类型的变量占用2个字节。现在只是知道a[0]的地址值为p,怎么根据a[0]的地址获取其他元素的地址呢?其实非常简单,p+1就是a[1]的地址。注意了,这里的p+1代表着p的值加2,并不是p的值加1,比如p的值为ffc3,p+1则为ffc5,而非ffc4。依次类推,p+2就是a[2]的地址ffc7,p+3就是a[3

Interview_C++_day10

☆樱花仙子☆ 提交于 2020-02-17 19:48:43
堆区和自由存储区 基本上所有的 \(C\) ++ 编译器默认使用堆来实现自由存储,也就是缺省的 \(new/delete\) 是通过 \(malloc/free\) 方式来实现的,这时候可以说他从堆上分配内存,也可以说他从自由存储区分配内存。但程序员可以通过重载操作符,改用其他内存实现自由存储。 堆区是操作系统维护的一块内存,而自由存储区是 \(C\) ++ 中用于 \(new/delete\) 动态分配和释放对象的 抽象概念 。 四种 \(cast\) 转换 四种 \(cast\) 转换为: \(const\_cast、static\_cast、dynamic\_cast、reinterpret\_cast\) 。 \(const\_cast:\) 用于将 \(const\) 变量转换成非 \(const\) 。 \(static\_cast:\) 用于各种隐式转换,比如非 \(const\) 转 \(const\) 、 \(void*\) 转指针等,能用于多态中向上转化,向下转化能成功但结果未知。 \(dynamic\_cast:\) 动态类型转换,只能用于含有虚函数的类,用于类层次间的向上和向下转化,只能转指针或引用。向下转换时,如果非法,对于指针返回 \(NULL\) ,对于引用抛出异常。 \(reinterpret\_cast:\) 几乎什么都可以转,但可能会出问题。 \

我的大厂面试经历

被刻印的时光 ゝ 提交于 2020-02-17 17:31:41
2020-02-17 10:53:03 在这里提供一下自己复习的东西吧,我也就把这个东西给搞了一遍,然后面试基本没啥问题了,如果问的很深的话,那就只能只求多福了兄弟!其中可能有一些错误或者由于编译环境有差异请大家自动忽略这些错误。 1:信号的生命周期? 信号产生-》信号在进程中注册-》信号在进程中的注销-》执行信号处理函数 2:信号的产生方式? (1)当用户按某些终端键时产生信号(2)硬件异常产生信号【内存非法访问】(3)软件异常产生信号【某一个条件达到时】(4)调用kill函数产生信号【接受和发送的所有者必须相同,或者发送的进程所有者必须为超级用户】(5)运行kill命令产生信号 3:信号处理方式? (1)执行默认处理方式(2)忽略处理(3)执行用户自定义的函数 4:如何消除隐式转换? 使用explicit关键字进行修饰 5:重载,重写和隐藏的区别? 重载:即函数重载 重写【覆盖】:即用于虚函数 隐藏:只要派生类的函数名与基类相同就会隐藏 6:volatile表示什么?有什么作用? 易变的,不会被编译器进行优化,让程序取数据直接去内存中的。 7:Static_cast<>,dynamic_cast<>,const_cast<>,reinterpret_cast<>的各自作用和使用环境? Static_cast:能完成大部分转换功能,但是并不确保安全 Const_cast