C++
文章平均质量分 67
hp_cpp
这个作者很懒,什么都没留下…
展开
-
C++重载相等运算符operator==的两种方式
最近复习了一下C++的一些基础知识,发现之前理解得不够深刻,或者当时只是简单过了一遍,复习的时候,有了一些新的收获。闲言少叙,书归正文:问题:C++的重载相等运算符operator==可以写成类成员函数,也可以写成全局普通函数,请问这对于同一个类型的两种重载相等运算符可以同时存在么?如何可以,那么它们的调用优先顺序是怎么样的?我们还是用一个例子来说明:#include <iostream>class Person{private: int m_age;public: Per原创 2020-09-02 10:47:36 · 18697 阅读 · 3 评论 -
C++的重载操作符(operator)介绍
转自:https://blog.csdn.net/liitdar/article/details/80654324本文主要介绍C++中的重载操作符(operator)的相关知识。目录1. 概述1.1 what1.2 why1.3 how1.3.1 将操作符重载实现为类的成员函数1.3.2 操作符重载实现为非类的成员函数(即全局函数)1.3.4 操作符重载的方式选择1.3.5 操作符重载的限制1.3.6 操作符重载的详细用法1. 概述1.1 whatoperator 是C++的一个关键字,它和运算符转载 2020-09-01 20:52:55 · 1377 阅读 · 0 评论 -
C++中istringstream的简单用法
C++98中std::istringstream的构造函数是explicit istringstream (const string& str, ios_base::openmode which = ios_base::in);(默认构造函数,已经其他构造函数这里省略,只列举经常用到的构造函数)cplusplus上的文档第一个参数是const string& str可以通过const string& str对istrings原创 2020-08-20 19:37:11 · 13273 阅读 · 0 评论 -
由一个typedef问题引发的思考
百度百科中的typedefhttps://baike.baidu.com/item/typedef/9558154?fr=aladdin同样,可以像下面这样隐藏指针语法:typedef char* pstr;int mystrcmp(const pstr p1,const pstr p3);用GNU的gcc和g++编译器,是会出现警告的,按照顺序,“const pstr”被解释为“char* const”(一个指向char的指针常量),而事实上,const char和char const表达的原创 2020-05-13 10:34:01 · 289 阅读 · 0 评论 -
谈一谈#define中#和##的作用
最近在阅读大佬们写的开源库的时候,看到一些宏定义,不是很明白它的用法,就查了很多资料,弄清楚它们的用法后,在这里记录一下。(1)#的作用#param指把param当成符号,就是把#后面的看成字符串#define TEST1(param) #param#include <iostream>int main(int argc, char *argv[]){ cons...原创 2020-05-04 18:32:15 · 391 阅读 · 0 评论 -
c++ 编写接口类(interface)举例
接口类简介:接口是一系列抽象方法的声明,是一些方法特征的集合,这些方法都应该是抽象的,需要由具体的类去实现,然后第三方就可以通过这组抽象方法调用,让具体的类执行具体的方法。用c++实现接口类时需要注意一下几点:1、接口类中不应该声明成员变量,静态变量。2、可以声明静态常量作为接口的返回值状态,这些静态变量需要初始化,访问时需要使用"接口类型::静态常量名"访问2、定义的接口方法使用vir...原创 2020-03-22 10:02:41 · 5176 阅读 · 1 评论 -
C++:如何正确的定义一个接口类
C++中如何定义接口类?首先给接口类下了定义:接口类应该是只提供方法声明,而自身不提供方法定义的抽象类。接口类自身不能实例化,接口类的方法定义/实现只能由接口类的子类来完成。而对于C++,其接口类一般具有以下特征:1.最好不要有成员变量,但可以有静态常量(static const或enum)2.要有纯虚接口方法3.要有虚析构函数,并提供默认实现4.不要声明构造函数如下就是一个最简单的...转载 2020-03-22 08:38:14 · 1294 阅读 · 0 评论 -
C++中遇到的_CrtlsValidHeapPointer(block)错误引发的思考
肇事的代码在此:#include<iostream>#include<string>using namespace std;class Operation{public: Operation() :num1(0), num2(0) {} void setnum1(double num1) { this->num1 = num1; } O...原创 2020-02-14 22:32:45 · 14038 阅读 · 2 评论 -
C++中的虚析构函数
以前没太注意基类的C++的析构函数是否为虚函数的问题,今天在拷贝一个教程的例子下来跑的时候报错了,后面发现该例子中的析构函数都没写,报了一个错,等下再说这个错误。先看看基类析构函数为虚析构函数的应用场景:一个基类指针指向子类,当删除这个基类指针时,在基类的析构函数为虚函数前提下,此时会自动调用子类的析构函数,释放子类所有内存的目的,防止内存泄漏。我们通过例子来体会这段话:例一:#incl...原创 2020-02-14 22:15:49 · 817 阅读 · 0 评论 -
c++11新特性std::is_trivial
首先 std::is_trivila 定义template< class T >struct is_trivial;结构成员函数: value返回true,如果T 包含默认的构造函数。其他情况下,返回false。一种可能的实现方式::template< class T >struct is_trivial : std::integral_constant&...转载 2020-01-16 21:20:05 · 2432 阅读 · 0 评论 -
智能指针被释放后的原始指针不可再用
#include <iostream>#include <string>#include <memory>class MyClass{public: MyClass() { m_count = 1; m_strName = "xiao ming"; } void Increase() { m_count++; std::...原创 2019-12-12 16:11:48 · 466 阅读 · 0 评论 -
std::make_shared的误用造成的内存泄露
这个例子是在Qt中使用std::make_shared传参数的时候误用发现的。我将原来的代码简化,模拟了一下:#include <iostream>#include <memory>class Base{public: Base() { std::cout << "Base Constructor" << std::endl; ...原创 2019-12-11 09:04:54 · 1247 阅读 · 0 评论 -
给shared_ptr添加自定义删除器的几种方式
将回调函数传递给 shared_ptr 的构造函数,该构造函数将从其析构函数中调用以进行删除方式一、使用普通函数// 自定义删除器void deleter(Sample * x){ std::cout << "Deleter function called" << std::endl; delete[] x;}// 构造函数传递自定义删除器指针std::s...原创 2019-12-09 09:37:14 · 5461 阅读 · 3 评论 -
C++11 基于范围的for循环
对于基于范围的for循环而言,冒号后面的表达式只会被执行一次。#include <iostream>#include <vector>std::vector<int> arr = { 1, 2, 3, 4, 5 };std::vector<int>& get_range(void){ std::cout << "g...原创 2019-11-27 09:12:25 · 169 阅读 · 0 评论 -
利用std::shared_ptr的custom_deleter来减轻资源管理负担
现代C++的资源管理思路,即无需手动释放资源,而是通过将资源与对象生命期绑定,在对象析构的时候自动释放资源,从而把资源管理转换为对象生命期管理,而后者是早已解决的事情。是正是C++最重要的编程技法:RAII以上这段话摘自:《linux多线程编程 使用muduo C++网路库》#include <stdio.h>#include <memory>#include &l...原创 2019-11-23 08:28:01 · 206 阅读 · 0 评论 -
unique_ptr指定删除器
unique_ptr指定删除器有几种方式:默认删除器普通函数std::function仿函数普通函数#include <memory>#include <iostream>#include <functional>int main(){ { std::unique_ptr<int[], void(*)(int *)> ...原创 2019-11-23 08:02:37 · 7013 阅读 · 3 评论 -
Qt中使用lambda表达式
新建一个工程,选择wiget,在widget.h中添加一个成员变量 int m_count = 0;在UI编辑器中添加3个按钮,添加3个按钮响应:#include "widget.h"#include "ui_widget.h"#include <QDebug>Widget::Widget(QWidget *parent) : QWidget(pare...原创 2019-11-22 11:22:09 · 668 阅读 · 0 评论 -
利用智能指针管理第三方库分配内存
《深入应用C++11代码优化与工程级应用》第四章的读书笔记,以及自己写的一些测试demo第三方库分配的内存一般需要通过第三方库提供的释放接口才能释放,由于第三方库返回的指针一般都是原始指针,用完之后如果没有调用第三方库的释放接口,就很容易造成内存泄露。例如void *p = GetHandle()->Create();//do somethingGetHandle()->Re...原创 2019-11-22 09:19:50 · 345 阅读 · 0 评论 -
C++17 入门经典第17章学习笔记
这章的代码#include <iostream>#include <vector>#include <algorithm>#include <stdexcept>using namespace std;template <typename T>class Array{private: T* elements; si...原创 2019-10-24 15:41:44 · 375 阅读 · 0 评论 -
QML基本类型color的使用
QML基本类型color的使用color可以用以下几种方式表示: (1)颜色名 (2)”#RRGGBB”格式的十六进制(不带透明度) (3)”#AARRGGBB”格式的十六进制(AA表示透明度)00~FF表示透明度,00代表完全透明,FF表示完全不透明 举例: Rectangle { color: "steelblue" width: 40; height: 4...原创 2018-06-27 10:16:14 · 5227 阅读 · 2 评论 -
ZeroMQ下载、编译和使用
下载地址:https://github.com/zeromq/libzmq/releases 我下载的是最新版zeromq-4.2.5.zip 解压后,进入builds文件夹, 我在windows上运行的,用的编译器是vs2015,进入msvc文件夹后,直接用对应工程的文件,直接编译就行。 测试: 编译后,会生成对应版本的,比如是release版本还是debug版本,32位,还是...原创 2018-07-27 17:08:35 · 10070 阅读 · 3 评论 -
Protobuf C++ serialize到char*,便于在网络传输
看到这篇文章 https://blog.csdn.net/mycwq/article/details/19619875 作者的原因:在以上例子中,protobuf 序列化的 string 数据里含有 ‘\0’ 字符。如果以 char* 取protobuf序列化后的数据,将会丢失部分数据。 看到下面的回复中: 手册里也说了。string只是当成容器用。里面放的还是二进制数据。bool S...原创 2018-08-10 15:57:38 · 10825 阅读 · 0 评论 -
[Qt]QObject::connect: Cannot queue arguments of type 'QString&'的解决方法
参考:https://blog.csdn.net/tokary/article/details/5777141 遇到的问题是,在主线程和子线程中,通过信号与槽发送QString,遇到QObject::connect: Cannot queue arguments of type 'QString&amp;'原博客内容是这样: it is not allowed to pass...原创 2018-08-27 17:54:46 · 5054 阅读 · 1 评论 -
MongoDB C++库编译,windows平台+VS2015(QT中也可以用)
编译准备工作: (1)mongo-c-driver下载地址: https://github.com/mongodb/mongo-c-driver/releases 下载最新版:mongo-c-driver 1.12.0的Souce code版(2)mongodb/mongo-cxx-driver下载地址: https://github.com/mongodb/mongo-cxx-dri...原创 2018-09-04 16:40:38 · 3023 阅读 · 12 评论 -
Qt 实现 Logger 日志----轻量级开源库QsLog的使用
github的下载地址:https://github.com/victronenergy/QsLog下载后,解压到非中文目录,用qt creator打开(qt5.8.0,windows平台上,亲测可用),如图:编译:(1)编译QsLogSharedLibrary,在windows平台上,会生成QsLog2.lib和QsLog2.dll(2)编译官方给的demo,log_example_s...原创 2018-10-31 12:14:47 · 9385 阅读 · 4 评论 -
Qt 中的信号与槽,连接日志库QsLog,在界面上显示出日志信息
新建一个基于QWidget的工程,在界面上添加一个QTextBrowser控件,用来在界面显示日志信息。在pro文件中添加QsLog的头文件和lib库INCLUDEPATH += include/QsLog.h \ include/QsLogDest.h \ include/QsLogDestConsole.h \ ...原创 2018-11-01 12:25:34 · 3594 阅读 · 0 评论 -
C++ 智能指针shared_ptr的实现
转自:http://www.cnblogs.com/xuelisheng/p/9739812.html#include <memory>#include <iostream>using namespace std;template<typename T>class smart{private: T* _ptr; int* _count; //...转载 2018-12-21 10:01:02 · 427 阅读 · 0 评论 -
C++中基类的析构函数为什么要用virtual虚析构函数
转自:https://blog.csdn.net/yhc166188/article/details/81587442大家知道,析构函数是为了在对象不被使用之后释放它的资源,虚函数是为了实现多态。那么把析构函数声明为vitual有什么作用呢? 直接的讲,C++中基类采用virtual虚析构函数是为了防止内存泄漏。具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放。假设...转载 2019-06-11 09:38:57 · 847 阅读 · 0 评论 -
c++消息映射到处理函数(类似表驱动或者消息映射)
转自:https://blog.csdn.net/yangyang031213/article/details/80716226头文件,消息定义,函数指针声明、处理函数声明、消息产生函数声明:#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QDebug>#includ...转载 2019-08-11 22:32:39 · 501 阅读 · 0 评论 -
Bind2nd源码解析
例如:#include <iostream>#include <vector>#include <functional>#include <algorithm>using namespace std;int main(int argc, char *argv[]){ vector<int> coll{ 1, 3, 5, ...原创 2019-08-15 23:01:44 · 224 阅读 · 0 评论 -
关于 STL 的 remove_if
关于 STL 的 remove_if转自:https://blog.csdn.net/u010982765/article/details/77619285函数原型:#include <algorithm>forward_iterator remove_if( forward_iterator start, forward_iterator end, Predicate p )...转载 2019-08-27 20:47:43 · 371 阅读 · 0 评论 -
c++中的lambda表达式
c++ lambda表达式lambda的组成部分Capture 子句(捕获列表)[ ] 空捕获列表,不捕获任何变量**[=] 拷贝捕获[&] 引用捕获[=, &] 拷贝与引用混合[names] 指定引用或拷贝[this] 捕获 this 指针lambda表达式的嵌套可变lambda指定lambda返回类型lambda抛出异常在 C++ 11 中,lambda 表达式(通常称为 “...原创 2019-08-28 11:42:47 · 525 阅读 · 0 评论 -
搭建maya2015 maya2017 API C++ plugin开发环境
第一步:从maya2015安装路径复制开发需要的文件到Visual Studio对应的目录。 (根据Maya版本最好选择对应的vs版本,才能保证编译的插件不出差,具有良好的兼容性。当然高手可以修改一些配置,也可以用高版本的vs进行编译maya的插件。) 我本机中的maya C++插件开发包在这个路径中C:\Program Files\Autodesk\Maya2015\devkit...原创 2018-05-10 13:58:45 · 2563 阅读 · 0 评论