![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
个人学习C++的心得
baixiaofei567
如果十年前没种树,那最好的时间是现在
展开
-
C++笔试题day15
虚函数就不能内联,题目错了方法重写的时候,子类的访问权限要大于父类的int a = b = c = 10这样bc都没定义,a=b=c这样赋值是没问题的。所以不要图方便,乖乖int a; int b;数字不超过3位,字符不超过1位++操作符只能用于变量,因为a++返回的是5,所以不能对5做++操作常量成员和引用成员必须要初始化,问题就在这static成员static成员是不允许在类内初始化的,除了const,那么static const 成员是不是在初始化列表中呢?答案是NO一原创 2021-04-10 00:10:51 · 127 阅读 · 0 评论 -
C++笔试题day14
三天假期转瞬即逝,还是要加油啊,希望可以在5.1之前拿到一个像样的实习offer就可以带大仪取深圳玩了hhh以\开头的算上后一个都是一个字符,而且strlen不算上最后的\0重载函数允许默认参数,但要注意 二义性问题void foo();void foo(int a=0);比如这样,你来个foo(),编译器不知道调用哪一个也算解决了一个疑惑,在c++中可以直接link* next这样子,因为在C++中可以有不完全的类类型,就是在类中可以声明类自身的指针和引用。但是在c中只能struct l原创 2021-04-05 23:13:53 · 132 阅读 · 0 评论 -
C++笔试题day13
scanf后面是地址,数组名本身就是一个地址,所以不用&.就不能重载枚举是一个被命名的整形常数的集合,不能是双引号元素字符串。而且不用=指针名和数组名是等价的,*(p+i)和p[i]以及arr[i]是一样的,但是最后的arr+i是一个地址,要解引用 * (arr+i)才行构造函数可以重载,不能重写析构函数可以重载,也可以重写...原创 2021-04-04 22:33:27 · 119 阅读 · 0 评论 -
C++笔试题day12
摸鱼好几天,稍微做一做.运算符是类成员访问运算符,->是指针对象访问成员时用的访问运算符。.的优先等级比 *高,在 *解引用之前,a是一个地址,对地址进行->当然是错的了函数中定义的局部变量存放在栈上,“hello world”是一个常量字符串,在常量区(也就是只能读不能写的区,就是只读存储区)*操作符优先级比+=高,所以a数组变为3,2,3,4。*(b+2)=2就是,因为b是一个指针变量,b是一个地址,所以b+2,这个2会自动加上2个int的大小,再解引用后赋值的结果就是3,2,原创 2021-04-03 00:26:53 · 162 阅读 · 0 评论 -
C++笔试题day11
dynamic_cast和static_cast都不允许无关类型的指针或者引用转换,但是dynamic_cast有动态类型检查是在运行时检查的,所以l1编译时可以通过,但是转换不成功会返回NULL。static_cast连编译都过不去值传递不影响实参,指针传递的本质还是值传递,对指针变量本身进行赋值是不会影响实参的,但是对指针变量指向的值进行修改可以改变实参指向的值,这里是直接对指针变量本身进行赋值,如果想要影响实参需要用二级指针空引用可以调用静态函数,因为静态函数不属于某个对象而是属于类的原创 2021-03-29 23:22:41 · 113 阅读 · 0 评论 -
C++笔试题day10
char+double向精度高的转型没错,转为double,但是右边的double赋值给左边的char又会精度丢失,就是’A’的ASCII+1了大意了,引以为戒,其实只要把它看成i<1就行了,就循环了一次,证明<几就循环几次嘛运算符的重载规则:重载不能改变运算符运算对象(即操作数)的个数重载不能改变运算符的优先级别重载不能改变运算符的结合性c ++语言允许在重载运算符时改变运算符原来的功能,但是更提倡保留原来的功能我们把s传进去,s是个数组名,我们对s指向的值做修改可以,但是原创 2021-03-28 23:41:15 · 138 阅读 · 0 评论 -
C++笔试题day09
int (*p)[4],p是指向Int[4]的指针。p = x,指向x的首地址。p+2,即加上2个指向类型的大小,即2 * 4 = 8个int,所以 * (p+2)指向x[2][0]为什么老有这种题。。a的类型是int[3][4],所以a+1就是加上4个int,对其解引用后的类型是int[4],所以+1后是加上1个int。所以B和C都是可以的,A也一样abdd复制完后,后面你还有cccd这几个别忘记了!!这几个并没有被覆盖看成不正确了,构造函数可以被重载,重载是自身这个类实现的,不能被覆盖,覆原创 2021-03-27 23:54:15 · 105 阅读 · 0 评论 -
C++笔试题day08
用右左法则来看,首先往变量a的右边看,是【3】,再往左看,是*,所以它首先是一个指针数组,数组里存放3个指针,然后再往右看是【4】,再往左看,是int *,说明前面3个指针每个指针都指向一个数组,每个数组里存放4个int 类型的指针,所以34有12个二级指针,每个指针在32位系统占4个字节,所以48个字节p=NULL == p = 0 == p = ‘\0’,不可以用=\0来判断对于内置类型而言,new仅仅是分配内存,除非后面显示加(),相当于调用它的构造函数,对于自定义类型而言,只要一调用new,原创 2021-03-26 22:57:35 · 104 阅读 · 0 评论 -
C++笔试题day07
?:运算符优先级高于*=和=运算符,所以先计算?:的值ps:关系运算符优先级高于赋值,>高于=0x开头是16进制,0x122是116^2+216+2单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的友元函数union的大小规则是取最大成员的大小,并且要补齐为单独的最大成员的倍数,最大成员是5字节,单独最大成员是int,补成int倍数就是6。struct的内存对齐就不说了数组名退化成指针,输出字符数组A选项发生隐式转换,相当于生成3个D类对象new和delete,没原创 2021-03-23 00:02:01 · 117 阅读 · 0 评论 -
C++笔试题day06
空类的大小也是1,bool也是1,不是只有char是1的中间%*4s是读取4位字符串, *是用来忽略读取的变量的,不会赋给列表中的变量int(*p)[5]是数组指针(指向数组的指针)int * p[5]是指针数组(数组里面放的是指针)(int *)p[5]是强制类型转换int p[]是错的0开头是8进制,0x开头是16进制。0x后面必须有东西,8进制数里面不能有超过8的数字存在,比如9或者a这种父亲,客人,儿子的顺序在C++中友元函数是独立于当前类的外部函数一个友元函数可以同时定原创 2021-03-22 00:10:29 · 148 阅读 · 0 评论 -
C++笔试题day05
写二进制文件fwrite,写文本文件fputscase 后面的常量表达式实际上只起语句标号作用 , 而不起条件判断作用 , 即 " 只是开始执行处的入口标号 ". 因此 , 一旦与 switch 后面圆括号中表达式的值匹配 , 就从此标号处开始执行 , 而且执行完一个 case 后面的语句后 , 若没遇到 break 语句 , 就自动进入 下一个 case 继续执行 , 而不在判断是否与之匹配 , 直到遇到 break 语句才停止执行 , 退出 break 语句 . 因此 , 若想执行一个 case原创 2021-03-21 00:10:15 · 201 阅读 · 0 评论 -
C++笔试题day04
逗号表达式,最后返回值就是最后一个元素0加上\的就是转义字符,转义字符就是一个字符\为转义字符,\72转义为一个八进制数72,也就是十进制数的58赋值给a,a就是一个ascii码为58的字符。?代表一个字符,*代表一个或多个字符宏定义:最后的结果是(2+3)-(2+3)*5=-20二维数组是指针的指针要不就是两个括号,要不就是两个 **,要不就是一个[]一个 *。#就是预处理指令(1)头文件包含#include(2)宏定义 #define(3)条件编译 #ifdef #e原创 2021-03-19 22:13:11 · 144 阅读 · 0 评论 -
C++笔试题day03
&&的短路,前面为0后面不运行,所以k为0,m仍然为0整数取余,看前面那个数字的符号就行,栗子:-3%2,值为-1,5%-3=2初始化指针创建的字符常量只能读不能改!!char* a = “AAA”,“AAA"是字符串常量不能修改static变量在类外初始化宏替换比任何运算符都先处理,先替换成3*4+7,所以结果是19六种常量类型传参的时候类型可不一致,允许实参个数比形参少(含有默认参数)函数声明,声明是一个语句,需要”;",而且只要参数类型不需要参数名B的原创 2021-03-18 23:17:24 · 125 阅读 · 0 评论 -
C++笔试题day02
其实中间也刷了很多,但是都摸了,还是从今天开始写吧,光做不记录==白做只记录值得记录的题,错误没意义或者正确没意义的都不会记录~赋值运算符是从右往左顺序是x=x-x*x=-30x=x+x=-60优先级顺序:关系运算符(大于小于等)>逻辑运算符(与或等),赋值运算符优先级最低a>3推出11&&0推出0b=0printf函数中使用%d做控制,要输出的是整型数字,也就是字符‘c’的地址如果要输出字符‘c’,可用 fprintf(stderr, "%c原创 2021-03-17 20:47:57 · 81 阅读 · 0 评论 -
struct内存对齐+例题帮助理解
转载自https://www.zhihu.com/question/27862634/answer/208895189字节对齐主要是为了提高内存的访问效率,比如intel 32位cpu,每个总线周期都是从偶地址开始读取32位的内存数据,如果数据存放地址不是从偶数开始,则可能出现需要两个总线周期才能读取到想要的数据,因此需要在内存中存放数据时进行对齐。 因为处理器读写数据,并不是以字节为单位,而是以块(2,4,6,8,16字节)为单位进行的,如果不进行内存对齐,本来只需要一次进行的访问,可能要好几次才能完成转载 2021-02-04 11:49:39 · 210 阅读 · 1 评论 -
C++实现单例模式
单例模式单例模式一句话的来讲就是,这个类只存在一个实例化对象。如何实现实例化?既然只能有一个实例化对象,那么就要防止被多次实例化,如何防止?就要把构造函数私有化或者受保护,这样构造函数就无法被外部调用,只能被类内部的成员函数调用,所以我们需要定义一个公有函数来供外部使用,这个公有函数返回一个对象,为了保证多次调用这个公有函数都会返同一个对象,就需要将这个给对象设置为静态的。简单总结一下需要注意三点:一、构造函数需要私有或者受保护;二、定义静态对象;三、定义静态公有函数单例模式分为懒汉模式和饿原创 2021-02-03 13:16:53 · 500 阅读 · 0 评论 -
实现智能指针
智能指针是一种资源管理类,通过对原始指针进行封装,在资源管理对象进行析构时对指针指向的内存进行释放;通常使用引用计数方式进行管理。智能指针:实际指行为类似于指针的类对象 ,它的一种通用实现方法是采用引用计数的方法。1.智能指针将一个计数器与类指向的对象相关联,引用计数跟踪共有多少个类对象共享同一指针。2.每次创建类的新对象时,初始化指针并将引用计数置为1;3.当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;4.对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引原创 2021-02-03 02:00:39 · 290 阅读 · 1 评论 -
14. 最长公共前缀
暴力法,外层是遍历的位数,内层是遍历所有字符串,char c记录第一个字符串的当前位,如果后面有一个字符串的当前位不是c或者当前长度已经大于被遍历的某个字符串,都要退出,并且要退出大循环,用一个flag记录。如果一轮下来都是相同的,就让结果+=cclass Solution {public: string longestCommonPrefix(vector<string>& strs) { //来一个hash记录每个字符出现的次数肯定不行,有些字符在一个字.原创 2021-02-02 01:19:54 · 75 阅读 · 0 评论 -
手写strcpy函数和memcpy函数以及两者区别
特点及函数原型strcpy和memcpy都是标准c库函数,它们有如下特点:strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。strcpy的函数原型是:char* strcpy(char* dest,const char*src);memcpy提供了一般内存的复制。从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。即memcpy对于需要复制的内容没有限制,因此用途更广。memcpy的函数原型是原创 2021-02-01 11:14:24 · 423 阅读 · 0 评论 -
416. 分割等和子集
子集问题,一定要考虑到背包问题,也就是动态规划。最后还可以进行状态压缩,简称状压dp这句话很重要,如果你要用多次的话,就不要反向遍历。相当于对每一层反向填表。最后主要是掌握!二维dp的使用class Solution {public: bool canPartition(vector<int>& nums) { //只要是取或者不取就直接背包问题 int sum = 0; for(auto x:nums) su.原创 2021-01-29 10:48:54 · 114 阅读 · 0 评论 -
c++优先队列(priority_queue)用法详解
仅供学习参考https://blog.csdn.net/weixin_36888577/article/details/79937886既然是队列那么先要包含头文件#include , 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的和队列基本操作相同:top 访问队头元素empty 队列是否为空size 返回队列内元素个数push 插入元素到队尾转载 2021-01-29 10:35:22 · 281 阅读 · 0 评论 -
C++笔试题day01
struct的成员默认是public的构造函数绝对不可以有返回值,但是可以有参数++a返回的a+1的值,a=3/6转为int就是0,不是四舍五入的有纯虚函数的就是抽象类正则表达式匹配短路逻辑,前面为真后,后面不执行32位操作系统的*是4字节的,char data[0]长度为0,所以大小也为0,最后答案为4+0等于箭头括号牛逼空类的大小为1Byte,C++要求每个实例在内存中都有独一无二的地址。虚函数:要占用4个字节,用来指定虚函数的虚拟函数表的入口地址(虚表就是一个指针指原创 2021-01-26 01:35:55 · 103 阅读 · 0 评论 -
void*的含义以及作用
指针是一个地址,有两个属性,一个是起始地址,一个是长度,起始地址告诉编译器从哪里开始寻址,地址长度由编译器根据指针所指对象的类型进行推断,如int占4字节,double占8字节。int从指定地址向后寻找4字节作为变量的存储单元 。double从指定地址向后寻找8字节作为变量的存储单元这里补充一点:不同类型的指针+1跳过的字节数是不同的。1.void指针是一种特别的指针 void *vp //说它特别是因为它没有类型 //或者说这个类型不能判断出指向对象的长度 2.任何指针都可转载 2020-12-16 00:45:37 · 1996 阅读 · 2 评论 -
C++中的 const 关键字
转载自知乎:https://zhuanlan.zhihu.com/p/375147561. 基本描述定义变量时的限定符,表示变量值不能改变。const int bufSize = 512;bufSize = 512; // 错误:试图向const对象写值由于const一旦创建就不可更改,所以const对象必须初始化(否则定义一个默认值且不可修改的变量没有任何意义)。const int i = get_size(); // 正确const int j = 42; // 正确const int转载 2020-12-15 02:07:34 · 217 阅读 · 0 评论 -
左值引用和右值引用
转载地址:https://blog.csdn.net/qianyayun19921028/article/details/80875002https://www.cnblogs.com/xiangtingshen/p/10366697.html在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。一切常数、字符和字符串都是右值举个例子,int a = b+c, a 就是左值,其有变量名为a,通过&a可以获取该变量的地址;表达式b+c、函数int转载 2020-12-13 14:49:52 · 152 阅读 · 0 评论 -
int &*p与int *& p的区别
int &*p是不正确的,*与p靠得最近,所以p是一个指针,但是这个指针的类型是int &,所以这个是错吴的, 因为不能创建引用的指针。int *& p; 是正确的, &与p靠得最近,所以p是一个引用,这个引用的类型是int*,也就是一个指针变量的引用,但是必须初始化,否则也是错误的。....原创 2020-12-13 14:21:54 · 514 阅读 · 1 评论 -
C++中构造函数,拷贝构造函数(三种应用场景)和赋值函数的区别和实现
以下是我结合多篇文章总结的C++构造函数,拷贝构造函数以及赋值函数的问题https://www.cnblogs.com/codemeta-2020/p/12634002.htmlhttps://blog.csdn.net/milujun/article/details/41870519https://blog.csdn.net/naughfy/article/details/59055790https://blog.csdn.net/zcyzsy/article/details/52132936C转载 2020-12-13 12:59:43 · 778 阅读 · 0 评论 -
一道C++面试题(虚函数+继承问题)
一个父类A里有一个虚函数f(),被A类里另外一个普通函数g()调用,g()被构造函数调用,类B继承类A,重写f()现在A *a = new B,问调用的是哪个f(),详细说一下编译器在这里是怎么做的/*test代码*/#include<iostream>using namespace std;class A{ public: virtual void f(){ cout<<"A"; } void g(){ f(); } A(){//构造函数原创 2020-12-11 23:59:30 · 368 阅读 · 0 评论 -
C++ STL list容器底层实现(详解版)
前面在讲 STL list 容器时提到,该容器的底层是用双向链表实现的,甚至一些 STL 版本中(比如 SGI STL),list 容器的底层实现使用的是双向循环链表。图 1 双向链表( a) )和双向循环链表( b) )图 1 中,node 表示链表的头指针。如图 1 所示,使用链表存储数据,并不会将它们存储到一整块连续的内存空间中。恰恰相反,各元素占用的存储空间(又称为节点)是独立的、分散的,它们之间的线性关系通过指针(图 1 以箭头表示)来维持。list 容器节点结构通过图 1 可以看到,转载 2020-12-11 16:15:36 · 1964 阅读 · 0 评论 -
C++STL常用容器插入/删除/查找性能总结以及底层数据结构
插入/删除/查找/使用场景底层数据结构1.vector 底层数据结构为数组 ,支持快速随机访问2.list 底层数据结构为双向链表,支持快速增删3.deque 底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问deque是一个双端队列(double-ended queue),也是在堆中保存内容的.它的保存形式如下:[堆1] --> [堆2] -->[堆3] --> …转载 2020-12-10 14:52:43 · 1124 阅读 · 0 评论 -
new和malloc的区别
0. 属性new/delete的是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件支持1. 参数使用new操作符申请内存分配时无需指定内存块大小,编译器会根据其类型信息自动计算。使用malloc则需要显式地指出所需内存块的大小2. 返回类型new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将voi转载 2020-12-09 23:57:13 · 87 阅读 · 0 评论 -
C++:模板总结
写在前面模板(Template)指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计。C++ 的标准库提供许多有用的函数大多结合了模板的观念,如STL以及IO Stream。模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。模板是 C++ 的一项功能,使得类和函数能够支持泛型。模板是一种对类型进行参数化的工具;通常有两种形式:函数模板和类模板;函数模板 针对仅参数类型不同的函数;类模板转载 2020-12-09 01:54:58 · 119 阅读 · 0 评论 -
C/C++ 中的static关键字以及为什么不能在头文件定义static变量
目录静态成员变量(面向对象)静态成员函数(面向对象)静态全局变量(面向过程)静态局部变量(面向过程)静态函数(面向过程)1.(面向对象的)静态成员变量在类内成员变量的声明前加上关键字static,该数据成员就是类内的静态数据成员。//Example 5#include <iostream.h>class Myclass{public: Myclass(int a,int b,int c); void GetSum();private: int a,b,c;转载 2020-12-08 16:49:44 · 6207 阅读 · 0 评论 -
C/C++ 引用作为函数的返回值
语法:类型 &函数名(形参列表){ 函数体 }特别注意:引用作为函数的返回值时,必须在定义函数时在函数名前将&用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本//代码来源:RUNOOB#include<iostream>using namespace std;float temp;float fn1(float r){ temp=r*r*3.14; return temp;} float &fn2(float r){转载 2020-12-07 23:03:53 · 307 阅读 · 0 评论 -
1066 Root of AVL Tree (25分)
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate t原创 2020-10-28 00:46:15 · 107 阅读 · 0 评论 -
int,long,long long等范围
转载一篇文章方便自己以后查看原创 2020-10-27 14:41:06 · 79 阅读 · 0 评论 -
c++strcmp函数
在头文件cstring中strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数...原创 2020-10-24 01:44:30 · 5435 阅读 · 0 评论 -
C++的4种类型转换
前言这篇文章是我从网上一些讲的比较好的文章上整理出来的。关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的《C++的设计和演化》。最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_cast, dynamic_cast。标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_cast、和 const_cast。下面对它们一一进行介绍。C-Style类型转换旧的类型转换就是直接在变量的前面加括号原创 2020-10-23 23:54:47 · 944 阅读 · 0 评论 -
C++ vector(STL vector)底层实现机制(通俗易懂)
STL 众多容器中,vector 是最常用的容器之一,其底层所采用的数据结构非常简单,就只是一段连续的线性内存空间。通过分析 vector 容器的源代码不难发现,它就是使用 3 个迭代器(可以理解成指针)来表示的://_Alloc 表示内存分配器,此参数几乎不需要我们关心template <class _Ty, class _Alloc = allocator<_Ty>>class vector{ ...protected: pointer _Myfirst转载 2020-10-22 23:06:12 · 2003 阅读 · 0 评论 -
C++多态的实现及原理
C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。存在虚函数的类都有一个一维的虚函数表叫做虚表,类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。多态性是一个接口多种实现,是面向对象的核心,分为类的多态性和函数的多态性。多态用虚函数来实转载 2020-10-22 22:00:18 · 173 阅读 · 0 评论