C++
文章平均质量分 64
C++、C++11新特性、C++常用技巧等
luoyayun361
不积跬步无以至千里
展开
-
C++11 tuple元组基本用法
元组tuple是C++11的一个新特性,它是一个固定大小的不同类型值的集合,是泛化的std::pair。也可以当作一个通用的结构体来用,不需要创建结构体又获取结构体的特征,在某些情况下可以取代结构体,使程序更简洁、直观。tuple可以说是一个既简单又复杂的类型,简单的一面是很容易使用,复杂的是它内部隐藏了很多细节,往往要和模板元的一些技巧结合起来使用。原创 2023-04-11 10:10:17 · 1265 阅读 · 0 评论 -
C++单例类宏定义,方便快速实现单例类
前言之前已经写过两篇博客关于单例类的写法:Qt C++单例类写法C++设计模式–单例模式(Singleton)及单例通用模板今天再加个菜,通过宏定义,用更简单的方式来实现单例类。使用非常方便。正文话不多说,直接上代码,定义一个头文件,singleton.h#pragma once/* * @brief :定义单例类宏 */#include <mutex>#define DISABLE_COPY(Class) \ Class(const Class&am原创 2022-05-13 17:53:06 · 1776 阅读 · 1 评论 -
C++11:搞清楚万能引用和右值引用
前言我们通过一个问题来进入今天的话题:1.形如 “type&&” 的结构,就是右值引用吗?2.以下哪些属于右值引用?① void fun(Widget && param);② Widget && var1= Widget();③ auto && var2 = var1;④ template<typename T> void f(std::vector<T>&& param);⑤ temp原创 2022-03-23 22:00:16 · 1828 阅读 · 0 评论 -
C++11:lambda表达式详细介绍
前言Lambda(匿名函数)表达式是C++11最重要的特性之一,lambda来源于函数式编程的概念,也是现代编程语言的一个特点。优点如下:声明式编程风格:就地匿名定义目标函数或函数对象,有更好的可读性和可维护性。简洁:不需要额外写一个命名函数或函数对象,,避免了代码膨胀和功能分散。更加灵活:在需要的时间和地点实现功能闭包。概念及基本用法lambda表达式定义了一个匿名函数,并且可以捕获一定范围内的变量。语法形式如下:[ capture ] ( params ) opt -> ret原创 2022-03-15 12:43:53 · 10362 阅读 · 2 评论 -
C++11:继承构造函数
前言首先我们来看一种情况,有如下示例:class Base{public: Base(int i):x(i),y(0){} Base(int i,double j):x(i),y(j){} Base(int i,double j,const string & str):x(i),y(j),s(str){}private: int x; double y; string s;};class Derived : Base{};i原创 2022-03-13 16:41:22 · 3057 阅读 · 0 评论 -
C++11:委托构造函数
前言如果一个类中重载了多个构造函数,并且在每个构造函数中都需要对某些变量进行初始化,这时候就会出现很多重复的代码,在C++11之前存在这个问题。而C++11中新增的委托构造函数,就是为了解决这个问题,它允许在同一个类中一个构造函数可以调用另外一个构造函数,从而可以在初始化时简化变量的初始化。委托构造函数我们先来看一个老版本的写法示例:class ClassA{public: ClassA(){} ClassA(int max){ m_max = max >原创 2022-03-13 15:21:33 · 2364 阅读 · 0 评论 -
那些常见的C++、Qt基础面试题
前言又到了金三银四的季节,每年这个时候都是跳槽的高峰期,在整理电脑资料的过程中发现一些之前记录的面试过程中最常提到的C++和Qt相关问题,其实都是些很基础的知识点,但是在面试过程中出镜率非常高。总结如下,暂不附答案,仅供参考。正文废话不多说,直接上题。C++基础篇1.线程同步的方式有哪些2.线程间通信如何实现3.进程间通信如何实现4.IO模型用过哪些5.IO实现的方式有哪些6.用过哪些STL7.迭代器实现怎么产生的,如何避免8.vector、list、map实现原理9.如何实现多原创 2022-03-05 08:58:33 · 10129 阅读 · 2 评论 -
C++11:内联命名空间,无缝升级库代码
前言想象这样一种场景:如果A代码库提供一个接口foo来完成一些工作,突然某天由于加入了新特性,需要升级接口,而有些用户喜欢新的特性但是并不愿意为了新接口去修改他们的代码,还有部分用户认为新接口影响了稳定性,想继续使用老接口。最直接的办法就是提供两个不同的接口函数来对应不同的版本,但是如果库中函数很多,则会出现大量需要修改的地方。那么为了解决这种特定场景的问题,C++提供了一个新的方式来实现,叫做:内联命名空间。命名空间如果开发一个大工程,必然会有很多人员参与,而且还会引入很多第三方库,这导致程序原创 2021-11-22 21:38:32 · 1123 阅读 · 2 评论 -
C++之仿函数简介
概述仿函数(Functor)又称为函数对象(Function Object),函数对象是一个对象,但是使用的形式看起来像函数调用,实际上也执行了函数调用,因而得名。仿函数的语法普通的函数调用一样,调用仿函数,实际上就是通过类对象调用重载后的operator()运算符。所以作为仿函数的类,必须重载operator()运算符。仿函数的作用:可替代函数指针,使用更加灵活可存储状态,形成一种类似...原创 2021-04-19 23:41:07 · 1317 阅读 · 0 评论 -
C++11:move移动语义
前言我们知道移动语义是通过右值引用来匹配临时值,那么,普通的左值是否也能借助移动语义来优化性能呢,C++11为了解决这个问题,提供了std::move方法来将左值转换成右值。正文move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存拷贝。move实际上并不能移动任何东西,它只是将一个左值强制转换成一个右值引用,使我们可以通过右值引用使用该值,以用于移动语义,强制转换为右值的目的是为了方便实现移动构造。这种move语义是很有用的,比如一个对象中有一些指针资源或者动态数组,在对原创 2021-04-11 09:21:58 · 2308 阅读 · 0 评论 -
C++11:forward及完美转发
代码using namespace std;template<typename T>void PrintT(int &t){ cout << "lvalue" << endl;}template<typename T>void PrintT(int &&t){ cout << "rvalue" << endl;}template<typename T>voi原创 2021-04-10 23:52:11 · 1609 阅读 · 2 评论 -
C++最简单的方式实现split分割函数
前言C++的字符串string中没有提供分割函数,比如将字符串 “1,2,3,4” 分割成 {“1”,“2”,“3”,“4”},这个场景在编码中很常见,那么既然没有现成的,就只能自己实现咯,方法很多,可以通过循环遍历进行拆解。这里提供一个更简单的方法,代码更简洁。上代码std::vector<string> split(const string &str, const string &del){ std::regex re{ del }; return s原创 2021-04-10 23:30:25 · 1482 阅读 · 2 评论 -
C++中检查vector是否包含给定元素的几种方式
概述在编码中经常会遇到一种场景,就是要在数组或列表中查找某个元素是否存在,其实对于这种线性操作,自己实现一个循环来检查是非常简单的事情,那既然这样,为啥还要专门写篇博客来分享呢?一个最重要的原因就是我们原本就可以用更简洁直观高效的方式去替代手写for循环,这个方式就是使用C++标准库函数。再啰嗦几句。通常在面试的时候,为了考察面试者的编码功底,会让其从头实现某些基础的算法,但是在实际开发中,很多东西都有现成的封装。只有把语言、标准库“双剑合璧”才能算是真正的C++。而且据C++标准委员会的安排,今后原创 2020-08-15 11:04:06 · 24564 阅读 · 7 评论 -
C++面向对象设计原则详解
概述C++面向对象设计原则主要包括以下几点:依赖倒置原则开放封闭原则单一职责原则里氏替换原则接口隔离原则封装变化点原则面向接口编程原则优先使用对象组合,而不是类继承接下来详细的分析每一项原则。详细说明依赖倒置原则高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定) 。抽象(稳定)不应该依赖于实现细节(变化) ,实现细节应该依赖于抽象(稳定)。...原创 2020-03-29 18:04:37 · 1200 阅读 · 1 评论 -
C/C++基础知识点(四)
文章目录37.静态变量什么时候初始化38.HTTP和HTTPS的区别39.HTTPS的优缺点40.IP地址和MAC地址的作用41.GET和POST的区别37.静态变量什么时候初始化静态变量存储在虚拟地址空间的数据段和bss段,C语言中其在代码执行之前初始化,属于编译期初始化。而C++中由于引入对象,对象生成必须调用构造函数,因此C++规定全局或局部静态对象当且仅当对象首次用到时进行构造。38...原创 2020-03-29 17:20:41 · 865 阅读 · 0 评论 -
C/C++基础知识点(三)
25.STL中迭代器的作用,有指针为何还要迭代器?1.迭代器iterator(迭代器)模式又称Cursor(游标)模式,用于提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示。由于迭代器的以上特性:与聚合对象耦合,在一定程度上限制了它的广泛运用,一般仅用于底层聚合支持类,如stl中list、vector、stack等容器类以及ostream_iterator等扩展it...原创 2020-03-24 19:42:06 · 755 阅读 · 0 评论 -
C/C++基础知识点(二)
13.C++如何定义常量,常量放在内存的哪个位置?常量在C++里的定义是一个top-level const加上对象类型,常量定义必须初始化。对于局部对象,常量存放在栈区,对于全局对象,常量存放在全局/静态存储区。对于字面值常量,常量存放在常量存储区。14.const修饰成员函数的目的是什么?const修饰成员函数标明函数调用不会对对象作出任何更改,事实上,如果确认不会对对象做更改,就应该为函...原创 2020-03-22 20:50:01 · 837 阅读 · 0 评论 -
C/C++基础知识点(一)
1.static关键字的作用全局静态变量:在全局变量前加上关键字static,就定义成一个全局静态变量。作用域:全局静态变量在声明它的文件之外是不可见的。局部静态变量:在局部变量之前加上static,局部变量就变成局部静态变量。作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域结束。但是当局部静态变量离开作用域后,不会销毁,会一直在内存中,只不过不能再进行访问,直到该函...原创 2020-03-22 19:14:44 · 1589 阅读 · 1 评论 -
C++的拷贝构造函数、operator=运算符重载,深拷贝和浅拷贝、explicit关键字
1、在C++编码过程中,类的创建十分频繁。简单的功能,当然不用考虑太多,但是从进一步深刻理解C++的内涵,类的结构和用法,编写更好的代码的角度去考虑,我们就需要用到标题所提到的这些内容。最近,在看单例模式,觉得十分有趣,然而如果想要掌握单例模式,就必须掌握这些内容。下面是我的一些学习总结,参考了很多博客内容。文末将注明出处。2、先上代码// testSingleMode.cpp...转载 2018-05-09 08:01:23 · 341 阅读 · 0 评论 -
C/C++ typedef用法详解
第一、四个用途用途一:定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量; 以下则可行: typedef char* PCHAR; // 一般用大写 PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针 虽...转载 2018-05-10 07:04:38 · 303 阅读 · 0 评论 -
C++之 ostream详细用法
概述在 C++中,ostream表示输出流,英文”output stream“的简称。在 C++中常见的输出流对象就是标准输出流cout,很少自定义ostream的对象,更多的是直接使用cout。那么 ostream 有什么用呢,来看一个场景:class CPoint{public: CPoint(int x_,int y_):x(x_),y(y_){} int x,y;...原创 2019-03-01 07:24:15 · 70658 阅读 · 17 评论 -
函数指针和指针函数用法和区别
前言函数指针和指针函数,在学习 C 语言的时候遇到这两个东西简直头疼,当然还有更头疼的,比如什么函数指针函数、指针函数指针、数组指针、指针数组、函数指针数组等等,描述越长其定义就越复杂,当然理解起来就越难,特别是刚开始学习这门语言的童鞋,估计碰到这些东西就已经要崩溃了,然后好不容易死记硬背下来应付考试或者面试,然后过了几天发现,又是根本不会用,也不知道该在哪些地方用,这就尴尬了。 今天这里只...原创 2018-05-24 08:11:10 · 296932 阅读 · 72 评论 -
C++之 RTTI
RTTI(Runtime Type Indentification) 即运行阶段类型识别。这是 C++新引进的特性之一。RTTI旨在为程序在运行阶段确定对象的类型提供一种标准方式。原创 2019-03-12 20:56:17 · 2264 阅读 · 1 评论 -
C++ warning:’xxx‘ has no out-of-line virtual method definitions...
前言最近在复习一些 C++基础知识,写了一些 C++的代码,当我在类中定义了虚函数并且直接在类定义内部实现这些虚函数时,编译器就会报警告:’xxx‘ has no out-of-line virtual method definitions;its vtable will be emitted in every translation unit.如下图:如何解决以前好像从来没留意过这些问...原创 2019-03-09 19:03:35 · 7436 阅读 · 3 评论 -
C++之dynamic_cast、static_cast、const_cast、reinterpret_cast的用法和区别
简述C++中有四个类型转换符,旨在严格限制允许的类型转换,使转换更规范。这四个转换符分别是:dynamic_caststatic_castconst_castreinterpret_cast可以根据目的选择一个适合的运算符,而不是使用通用的类型转换。让编译器能够检查程序的行为是否与设计者想法吻合。接下来看看每个类型转换符的用法以及它们之间的区别。dynamic_cast...原创 2019-03-16 12:42:05 · 465 阅读 · 0 评论 -
C++之虚析构函数
定义顾名思义,虚析构函数就是给析构函数声明为 virtual。作用虚析构函数可以正常的销毁多态模式下的派生类对象,防止造成一个诡异的“局部销毁”对象,从而防止形成内存泄漏。使用场景带有多态性质的基类应该声明一个 virtual 析构函数。如果 class 带有任何 virtual 函数,它就应该拥有一个 virtual 析构函数。类的设计目的如果不是作为基类使用,或不是为了具备多态性...原创 2019-03-17 14:37:08 · 1082 阅读 · 0 评论 -
C++11 auto和decltype关键字
auto可以用 auto 关键字定义变量,编译器会自动判断变量的类型。例如:auto i =100; // i 是 intauto p = new A(); // p 是 A*auto k = 34343LL; // k 是 long long有时,变量的类型名特别长,使用 auto 就会很方便。例如:map <string, int, greater <strin...转载 2019-05-26 19:26:58 · 434 阅读 · 0 评论 -
C++11 Lambda表达式(匿名函数)详解
使用 STL 时,往往会大量用到函数对象,为此要编写很多函数对象类。有的函数对象类只用来定义了一个对象,而且这个对象也只使用了一次,编写这样的函数对象类就有点浪费。而且,定义函数对象类的地方和使用函数对象的地方可能相隔较远,看到函数对象,想要查看其 operator() 成员函数到底是做什么的也会比较麻烦。对于只使用一次的函数对象类,能否直接在使用它的地方定义呢?Lambda 表达式能够解决这...转载 2019-05-26 19:43:00 · 618 阅读 · 1 评论 -
C++类成员函数指针使用介绍
前言在之前写过的博客中有介绍过函数指针和指针函数的区别和简单用法(文章在这里),当时的Demo非常简单,都是C语言的写法,但是当在C++中直接像C那样使用类成员函数指针时就会报错:reference to non-static member function must be called所以如果是C++中的成员函数指针其使用方法是有区别的,这里针对不同的场景做个补充说明。类成员函数的指针(非...原创 2019-09-21 18:03:53 · 22051 阅读 · 9 评论 -
C++拷贝构造函数(深拷贝与浅拷贝)
对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=88; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。#include <iostream>using namespace std;class CExample {private: int a;public:...转载 2018-05-09 07:42:42 · 333 阅读 · 0 评论