c++
121大魔王
这个作者很懒,什么都没留下…
展开
-
C++ 关于不能将A** 转换为const A**的原因
在C++中,类似于const int *a=(int*)b这种非常量转化为常量是允许的,但是如果两边都再加一个星号就不允许了。 int *p; const int **a=&p;//报错为什么要这样设计呢?其实这是C++才加入的规则用来弥补之前的一个漏洞,这个漏洞就是这种双重常量指针可能会发生中间指针被篡改的事情,我们可以看下面这个代码 const int x=1; int *p; const int **a=&p; *a=&x; *p原创 2022-01-24 16:27:53 · 735 阅读 · 0 评论 -
C++ 关于函数形参中const的作用
在上 C++ 课的时候老师会要求一般类对象作为参数传递时要把形参写成 const 引用的形式,也就是这样的void fun(const string &a,const string &b){ }那么写成这样有什么好处?如果不这么写会怎样?我们先一个个来,讲一下引用的作用引用,其实就是给绑定的对象起了个别名,之后对这个别名的所有操作都可以看出对绑定对象的直接操作,那么当引用作为形参,函数调用时也可以看成将传递的实参绑定给它,这样我们在函数体内对这个引用做的一切操作都有可能影原创 2022-01-24 00:28:34 · 5508 阅读 · 4 评论 -
C++ 关于protected
这里不是要介绍protected,相关的访问权限学习了C++应该都会了解的。主要是想谈谈关于它的一条重要性质:派生类的成员或友元只能通过派生类对象来访问基类的受保护成员。派生类对于一个基类对象中的受保护成员没有任何访问特权不知道大家初学C++的时候有没有人跟我有一样的疑问,既然private是为了不让包括派生类在内的任何开发者,用户访问某个成员,public是为了完全放开某个成员,那么作为他们的中间产物protected,即派生类可以直接访问,而用户不能访问,真的能做到保护作用吗?比如我定义一个普通原创 2022-01-02 23:51:53 · 1709 阅读 · 0 评论 -
C++ lambda
相当于一个可以在函数内部定义的函数,主要用于可以把谓词当做参数的算法。格式如下:[捕获列表] (参数) {函数体}捕获列表中的是函数可能要用到的这个lambda所在函数中的局部变量,其它的跟普通函数差不多。捕获列表的作用主要是一般算法的谓词只接受一个参数或者两个参数,如果要用到不止这么多,就要用到捕获列表。另外如果在当前这个函数的外部的变量,就可以不用捕获列表,函数体内直接使用了。#include<iostream>#include<vector>#include<原创 2022-01-01 00:08:37 · 338 阅读 · 0 评论 -
C++ 顺序容器之emplace
C++中顺序容器一般都含有push_back,insert,push_front操作,这些操作的参数必然会包含容器相对应类型的对象或者迭代器。于是在某个版本后提供了与之相对性的emplace_back,emplace,emplace_front,不同是这几个方法的参数是容器对应类型的构造函数参数,当调用这个方法时,参数会被调到对应的类型的构造函数中,构造出对象不加入容器中,直接看代码可能直观点。#include<iostream>#include<vector>#include原创 2021-12-31 22:28:33 · 898 阅读 · 0 评论 -
C++ assign
赋值运算符要求左边和右边的运算对象既有相同的类型。它将右边运算对象中所有元素拷贝到左边运算对象中。顺序容器(array除外)还定义了一个名为 assign 的成员,允许我们从一个不用但相容的类型赋值,或者从容器的一个子序列赋值。意思就是我可以做类似于把list中的一段元素赋值给vector这样的操作。list<string>a;vector<const char *>b;a.assign(b.cbegin(),b.cend()); //const char*可以转换成st.原创 2021-12-30 23:37:57 · 1117 阅读 · 0 评论 -
C++ array
array是新C++标准增加的类型。与内置数组相比,array是一种更安全、更容易使用的数组类型。既然C++ Primer这么说了,那就学一下吧。array<int,42>p构造,规定数组元素类型和大小。array<int,42>p={1,2,3}初始化列表,前三个位置为相应数字,之后的是默认值。这里因为有默认值,所以如果构造类型是自定义的类,这个类就必须有默认构造才能这样初始化。相比普通的内置数组,这种数组支持拷贝操作array<int,10>q=p或.原创 2021-12-30 23:25:21 · 1389 阅读 · 1 评论 -
C++ 关于输入到文件结束
输入到文件结束应该是所有大学计算机刚学c语言时写oj一定会碰到的,那时候几乎会把以下几句死记硬背下来while(~scanf("%d",&a))while(scanf("%d",a)!=EOF)while(cin>>a)其中c++ 的这句while(cin>>a)到底是什么含义呢。直观上看就是到文件结束就返回一个0,否则非0.实际上cin是C++输入流的一个对象,而输入流是否运行正常,其本身是有一个状态的。为了表现这种状态,每个输入流对象都会有一个rdstate原创 2021-12-29 23:54:03 · 2327 阅读 · 0 评论 -
C++ 智能指针
详情请看以下三篇shared_ptrunique_ptrweak_ptr原创 2021-12-26 23:43:02 · 124 阅读 · 0 评论 -
C++ weak_ptr
weak_ptr是一种弱引用,即不会影响到指向对象的生存周期。通俗的讲,这个指针指向的都是shared_ptr所指向的对象,且不会对其计数器有改变,当shared_ptr被全部释放后,即使有weak_ptr指向该对象,这个对象也会自己释放。常用方法q.reset()将指针p空置p,use_count()返回计数器数p.expired()若p.use_count()为0,返回truep.lock()返回一个指向其对象的shared_ptr,如果没有对象,则返回原创 2021-12-26 23:40:40 · 233 阅读 · 0 评论 -
C++ unique_ptr
另一种智能指针,和shared_ptr不一样的是,它能独享所指向的对象,也就是如果有计数器,计数器的值必须小于等于1。常用方法u=nullptr释放u指向的对象,将u置为空u.release()u返回指针,并放弃对指针的控制权,置位空u.reset(q)u指向q对于unique_ptr的构造方法,C++ primer说没有提供类似于make_shared的方法,所以只能指向一个new返回的指针,但似乎在某个版本之后有了make_unique,我的看法是就用这个原创 2021-12-26 23:06:01 · 166 阅读 · 0 评论 -
C++ std::move
这个move其实跟移动没什么关系,只是在赋值的时候有移动的效果,其本身的作用是强行把左值变为右值,然后在赋值的时候因为变成了右值所以被当做临时资源给释放了,所以有移动的效果。左值就是有名字的变量,右值就是没有名字的临时变量,如"123",0.简单示例#include<iostream>#include<memory>#include<memory.h>using namespace std;string s = "123";int main(){ st原创 2021-12-24 22:28:54 · 478 阅读 · 0 评论 -
C++ shared_ptr
shared_ptr 其实就是对资源做引用计数——当引用计数为 0 的时候,自动释放资源。原创 2021-12-24 20:43:29 · 133 阅读 · 0 评论 -
C++ 手写 unordered_map 实现
insert(Key,Value)插入映射直接通过 [] 查询虽然写的是泛型,但暂时不知道非整形的类型要怎么获取hash数,回头学下#include<iostream>#include<string>using namespace std;#ifndef UNORDEREDMAP#define UNORDEREDMAPtemplate<typename Key, typename Value>class hashNode{public: Key k原创 2021-12-23 23:20:34 · 1065 阅读 · 1 评论 -
c++ 手写vector实现
主要实现功能:resize(n):容器大小改为nreserve(n):空间开辟大小改为npush_back(n):向数组末尾推入一个元素nsize():返回当前容器大小capcity():返回开辟空间大小front:返回第一个元素back:返回最后一个元素删除功能后序补以上所有功能涉及下标取值时如果超过size()大小会抛出异常。#include<iostream>using namespace std;#ifndef VECTOR_H#define VECTOR_H原创 2021-12-23 21:09:17 · 1395 阅读 · 0 评论 -
C++ explicit
主要用于类的构造函数限制其只允许显示构造,而不能隐式构造,所以只修饰单参构造,因为无参和多参构造本来就是显示的,所谓隐式构造可以看以下例子。#include<iostream>using namespace std;class Explicit{private: int val;public: Explicit(int x) :val(x) { cout << "int" << endl; } Explicit(const char* str)原创 2021-12-23 20:15:22 · 214 阅读 · 0 评论