C++
文章平均质量分 53
城北programmer
*
展开
-
C++右值引用
右值引用应该是C++11引入的一个非常重要的技术,因为它是移动语义(Move semantics)与完美转发(Perfect forwarding)的基石:移动语义:将内存的所有权从一个对象转移到另外一个对象,高效的移动用来替换效率低下的复制,对象的移动语义需要实现移动构造函数(move constructor)和移动赋值运算符(move assignment operator)。 完美转发:定义一个函数模板,该函数模板可以接收任意类型参数,然后将参数转发给其它目标函数,且保证目标函数接受的参数其类型原创 2021-09-21 21:31:01 · 181 阅读 · 0 评论 -
C++内联inline
内联函数优缺点1优点它通过避免函数调用所带来的开销来提高你程序的运行速度。 当函数调用发生时,它节省了变量弹栈、压栈的开销。 它避免了一个函数执行完返回原现场的开销。 通过将函数声明为内联,你可以把函数定义放在头文件内。缺点:因为代码的扩展,内联函数增大了可执行程序的体积。 C++内联函数的展开是中编译阶段,这就意味着如果你的内联函数发生了改动,那么就需要重新编译代码。 当你把内联函数放在头文件中时,它将会使你的头文件信息变多,不过头文件的使用者不用在意这些。 有时候内联...原创 2021-09-20 18:25:48 · 197 阅读 · 0 评论 -
C++中 new 的三种调动规则
1 plain newnew表达式,最常用的方式。先申请内存空间,再构造对象。string* ps = new string("abc");2 nothrow newnew操作符,类似于C语言中的malloc,只是负责申请内存void* buffer = operator new(sizeof(string));3 placement new定位new,在一块已经分配成功的内存上重新构造对象void* buffer = operator new(sizeof(string)原创 2021-05-15 14:54:20 · 130 阅读 · 0 评论 -
指针和引用的概念、联系、区别
指针的概念指针是一个地址变量,把地址存放在一个变量中,然后通过先找出地址变量中的值,再由此地址找到要访问的变量的方法,称为“间接访问”。引用的概念引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。引用的特性引用在定义时必须初始化一个变量可以有多个引用引用一旦引用一个实体,再不能引用其他实体两者本质指针是地址,引用是别名,都是间接访问的地址概念。汇编代码中指针和引用在编译器中的实现是一样的指针指向一块原创 2021-04-19 17:01:50 · 1253 阅读 · 0 评论 -
STL 迭代器失效问题
原创 2021-03-30 12:57:54 · 53 阅读 · 0 评论 -
OJ在线编程常见输入输出
1.计算a+b#include<iostream> using namespace std; int main(){ int a,b; while(cin >> a >> b) cout << a+b<<endl;}2.不定个数计算和#include<iostream>using namespace std;int main() { int a = 0, sum = 0;原创 2021-03-21 16:27:11 · 327 阅读 · 0 评论 -
智能指针 weak_ptr
weak_ptr (到std:shared_ptr 所管理对象的弱引用)正式介绍weak_ ptr 之前,先来回忆一下 shared_ptr 的一些知识。我们知道shared_ptr 是采用引用计数的智能指针,多个shared_ptr实例可以指向同一个动态对象,并维护了一个共享的引用计数器。对于引用计数法实现的计数,总是避免不了循环引用(或环形引用)的问题,shared_ptr 也不例外。为了解决类似这样的问题,C++11 引入了weak ptr,来打破这种循环引用。循环引用Democlas原创 2021-03-20 17:31:05 · 144 阅读 · 0 评论 -
智能指针 shared_ptr
shared_ ptr 是一个引用计数智能指针,用于共享对象的所有权也就是说它允许多个指针指向同一个对象。Demo#include<iostream>#include<memory>using namespace std;class 0bject{private: int value;public: 0bject(int x = 0) :value(x) { cout << "Constructor obje.原创 2021-03-20 17:09:24 · 345 阅读 · 1 评论 -
智能指针 unique_ptr
unique_ ptr (唯一)是- -种定义在中的智能指针(smart pointer)。unique_ ptr 对象不能进行复制操作只能进行移动操作。unique是独特的、唯- -的意思, 故名思议,unique_ ptr 可以“独占"地拥有它所指向的对象。unique_ ptr 和shared _ptr 类型指针有很大的不同:shared_ ptr 允许多个指针指向同一对象而unique_ptr 在某一时刻只能有一个指针指向该对象(两个unique_ _ptr 不能指向同一个对象.原创 2021-03-20 16:16:01 · 127 阅读 · 0 评论 -
宏、内联函数、普通函数的区别
宏和内联函数的区别宏是编译阶段处理的,纯粹是字符串替换(坑确实很多,尤其是在表达式替换的时候),没有任何的类型检查等,十分的不安全;而 inline内联函数的处理是发生在编译阶段的,有完整的语句类型检查,比宏更安全宏是无法调试的,inline 函数在 debug 版本下和普通函数一样,出了问题很方便进行断点调试,定位问题大量的宏很不方便去阅读源码,inline 函数和普通函数一样,结构模块化清晰,方便阅读代码用宏来代替函数定义,替换后还是一个正常的函数调用,有函数调用开销(栈帧开辟和回退);而是原创 2021-03-15 17:07:20 · 128 阅读 · 0 评论 -
C++中的 const,const 与 static 的区别
C++中的 const 有如下特点以及应用场景:在 C++中 const 是用来定义常量的,不能作为左值被修改,而且必须初始化。const 常量的初始值如果是一个明确的值,那么常量在编译期会被常量的初始值替换, 如下代码:const int a = 10;int *p = (int*)&a;*p = 20;cout<<a<<endl;这里 a 打印出来的值是 10,const 常量在编译时期的替换规则。在 C++中修饰的量也可以是常变量(和 C 语言相原创 2021-03-15 16:46:56 · 188 阅读 · 0 评论 -
智能指针 auto_ptr
C11标准中的四个智能指针:auto_ptr (已弃用)unique_ptrshared_ptrweak_ptrauto_ptrint* p = new int(0);auto_ptr<int> ap(p);1.两个auto_ptr,不能同时拥有一个对象。(会重复删除)2.不能用auto_ptr 管理数组指针。(析构是delete,不是delete[])3.构造函数的explicit关键词有效阻止从一个“裸”指针隐式转换成auto_ ptr 类型。...原创 2021-03-13 11:11:28 · 55 阅读 · 0 评论 -
malloc和new区别
1.malloc 和new都是在堆上开辟内存的:malloc 只负责开辟内存,没有初始化功能,需要用户自己初始化;new不但开辟内存,还可以进行初始化,如new int(10);表示在堆上开辟了一个4 字节的int整形内存, 初始值是10,再如new int[10]); 表示在堆上开辟了一个包含10个整形元素的数组,初始值都为0。2.malloc 是函数,开辟内存需要传入字节数,如malloc(100);表示在堆上开辟了100个字节的内存,返回void*,表示分配的堆内存的起始地址,因此malloc的原创 2021-03-07 16:48:22 · 1768 阅读 · 0 评论 -
strtok函数,c++多态
1.strtok 字符串切割函数头文件:#include <string.h>函数原型:char * strtok (char *str, const char * delimiters);参数:str:待分割的字符串(c-string);delimiters:分割符字符串。strtok_s函数strtok_s是Windows下的一个分割字符串安全函数,其函数原型:char *strtok_s( char *strToken, const char *strDelimit, cha原创 2021-02-27 15:55:27 · 178 阅读 · 0 评论 -
ambda表达式
ambda表达式[capture] (params) opt -> return type { body };capture :捕获列表(使用)params: 参数列表opt : 函数选项return type : 返回值类型body :函数体void fun(int a,int b){ auto x1 = [&]()->int{ int c = a+b; return c; };}[=] : 按值捕获,建立副本,可访问不可修改[&原创 2021-02-27 15:45:31 · 231 阅读 · 0 评论 -
C++知识点笔记2
1 虚函数,纯虚函数,抽象类,接口带有 virtual 关键字的函数为虚函数(必定为类的成员函数),如:virtual void draw();多态用虚函数来实现,存在虚函数的类都有一个一维的虚函数表叫做虚表,类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。虚函数加上 =0 为纯虚函数,如: virtual void draw() = 0;含有纯虚函数的类型为抽象类(不能实例化对象)全部函数都是虚函数的类是接口。2 多态C++的多态性用一原创 2021-02-20 23:43:13 · 67 阅读 · 0 评论 -
练习题
一.概念理解定义一个空类型,没有任何成员变量和成员函数,对其sizeof结果是?结果应该是1(VS编译器中),不是0;再向其中添加构造和析构函数,对其sizeof结果是?依然是1将析构函数标记为虚函数,对其sizeof结果是?因为一旦有虚函数,编译器会为该类型生成虚函数表,并向其实例中添加一个指向虚表的指针。32位机器指针占4字节,64位指针占8字节。因此结果为8。二.分析代码三. 写代码(定义一个类型或者实现成员函数)1.为如下类型添加赋值运算符函数class A{public原创 2021-02-20 23:30:19 · 57 阅读 · 0 评论 -
C++设计模式
1.简单工厂模式2.工厂方法模式3.单例模式3.1 饿汉单例模式3.2 懒汉单例模式3.3 模板加继承4.结构型模式4.1 代理模式4.2 适配器模式简单示例:5. 行为型模式5.1 观察者模式5.2迭代器模式原创 2021-02-19 23:58:52 · 122 阅读 · 0 评论 -
死锁问题及其解决方案
图论死锁产生的 4 个必要条件1、互斥:某种资源一次只允许一个线程访问,即该资源一旦分配给某个线程,其他线程就不能再访问,直到该线程访问结束。2、占有且等待:一个线程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他线程释放该资源。3、不可抢占:线程已获得的资源,在末使用完之前,不能强行剥夺。4、循环等待:存在一个线程链,使得每个线程都占有下一个线程所需的至少一种资源。当以上四个条件均满足,造成死锁,进程无法继续执行,它们所持有的资源也无法释放。导致 CPU 的吞.原创 2021-02-16 17:07:59 · 770 阅读 · 1 评论 -
C++知识点笔记1
1.对象间的关系包含一个对象是另一个对象的属性。继承一个对象是另一个对象的特例。关联一个对象的引用是另一个对象的属性。(没有特定规范)强关联:引用弱关联:指针虚表指针当对象中有虚函数时,调用 构造函数、拷贝构造函数开始第一件事就是设置虚表指针指向该对象析构函数是重置虚表指针析构函数可以设计成虚的,构造函数不可以没写析构函数的话,系统不会自动生成析构函数,只有一个语义的析构new delete new[] delete[]...原创 2021-02-13 20:22:47 · 113 阅读 · 0 评论 -
C++ 生产者消费者示例代码
#include<iostream>#include<thread>#include<chrono>#include<semaphore>#include<mutex>#include<deque>using namespace std; class Queue//用来仓储并保障线程安全{public: Queue() :qu() {} ~Queue() {} void put(int val) { u原创 2021-02-10 18:44:58 · 1735 阅读 · 0 评论 -
C++多线程基础知识
std::thread类成员函数:一 观察器:get_id:获取线程ID,返回一个类型为std::thread::id的对象。joinable:检查线程是否可被join。检查thread对象是否标识一个活动(active)的可行性线程。缺省构造的thread对象、已经完成join的thread对象、已经detach的thread对象都不是joinable。(并不是执行代码中的线程才是活跃,只要和内核关联就是活跃状态)hardware_concurrency:静态成员函数,返回当前计算机原创 2021-01-27 23:42:32 · 395 阅读 · 0 评论