
C++
文章平均质量分 63
总结一些C++的知识点
贝勒里恩
用生命写代码,用灵魂做界面!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
理解C++的【内部链接】和【外部链接】
描述:一个声明将一个名称引入一个作用域声明可以理解为,我现在声称有这个东西,但是这个东西具体是啥样,我不清楚。C++中在同一个作用域中可以重复声明,除了类中的成员函数与成员变量的声明//外部引用声明// typedef声明Class A;//类的前置声明//名字空间引用声明friend f;//友元声明//函数前置声明描述:定义决定了一个实体在一个作用域的唯一描述定义可以这么理解,声明是声称有这个东西,但是具体是啥样还不清楚;定义就清清楚楚、明明白白的告诉你,这个东西是啥样。同一作用域。原创 2024-09-04 10:55:52 · 1120 阅读 · 0 评论 -
C/C++ 静态代码检查工具cppCheck
Cppcheck是一个用于C/C++代码的静态分析工具,它可以帮助开发者检测代码中的错误;Cppcheck可以检测出许多类型的错误,包括语法错误、未使用的函数、内存泄漏、未初始化的变量等;Cppcheck还支持用户自定义规则,这使得开发者可以根据自己的需求定制Cppcheck的行为;使用--suppress如果你想要忽略某些警告,可以在命令行中使用 --suppress 选项。原创 2023-12-13 16:16:15 · 3431 阅读 · 2 评论 -
C++测试代码运行时间
【代码】C++测试代码运行时间。原创 2023-12-05 11:23:50 · 280 阅读 · 0 评论 -
C++11 std::function
std::function是一个函数包装器,该函数包装器模板能包装任何类型的可调用实体,如普通函数,函数对象,lamda表达式等;包装器可拷贝,移动等,并且包装器类型仅仅依赖于调用特征,而不依赖于可调用元素自身的类型。std::function是C++11的新特性,包含在头文件一个std::function类型对象实例可以包装下列这几种可调用实体:函数、函数指针、成员函数、静态函数、lamda表达式和函数对象。std::function对象实例可被拷贝和移动,并且可以使用指定的调用特征来直接调用目标元素。原创 2022-10-18 10:28:58 · 896 阅读 · 0 评论 -
点到线段的距离
一、前言点到直线的距离很简单,直接套用公式计算就行;点到线段的距离要分情况讨论:1、点的投射在线段上,等效于点到直线;2、点的投射在线段外,点到线段的距离为该点到线段最近端点的距离;3、点在线段上,距离为0;二、详细代码#ifndef DOT_LINE_DIS_H#define DOT_LINE_DIS_H#include <QObject>#include <qmath.h>#include <QPointF>const double原创 2022-03-15 10:00:51 · 3166 阅读 · 0 评论 -
C语言内存操作函数记录
一、动态内存分配函数名称malloc / calloc功能动态内存分配函数头文件#include<stdlib.h>函数原型void* malloc(size_t size); void* calloc(size_t num, size_t size);参数size(分配内存块的大小)、num(分配内存块的个数)返回值成功返回分配内存块的首地址,失败返回NULL注意malloc和calloc都可以分配内存区,但malloc一次只能原创 2021-10-09 12:24:03 · 208 阅读 · 0 评论 -
关于explicit的理解
一、术语解释关键字explicit(显式转换调用):阻止隐式转换调用,必须显式的指定函数调用;关键字implicit(隐式转换调用):构造函数默认自带,当存在默认构造函数时,自动使用默认构造函数生成对象,然后将生成的对象作为实参调用函数;二、默认构造函数默认构造函数:一个可被调用,而不带任何实参的构造函数;这个函数要不就没有形参,要不就是形参都有默认值;例如,下面的类A和类B都有默认构造函数class A{public: A(); //默认构造函数 ~A();};cla原创 2021-07-09 10:37:34 · 349 阅读 · 0 评论 -
关于友元的理解
友元友元是C++提供的一种破坏数据封装和数据隐藏的机制;通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息;可以使用友元函数和友元类;为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元;1、友元函数面向对象的三大特性:封装、继承和多态,封装使得成员变量和成员方法隐藏起来了,用户必须通过预留的接口来使用类,一定程度上提供了安全性。在类定义中,使用访问说明符来指定成员权限:public:类内自由访问、类外通过对象访问;private原创 2021-07-08 09:36:51 · 381 阅读 · 0 评论 -
关于this指针的理解
1.1、理解this有如下类定义,该类中有一个成员变量:name以及两个成员方法,set_name、get_name成员方法中使用了this指针,这个类生成了多个对象,当不同的对象访问成员函数时,this是如何定位到不同的对象呢?class student{public: student(); ~student(); void set_name(QString name); QString get_name() const; private:原创 2021-07-07 18:26:21 · 415 阅读 · 0 评论 -
程序调试技巧总结
一、assert(断言)作用:如果它的条件为假,则终止程序执行,并打印报错地点;这个宏通常用来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。注意:程序一般分为Debug版本和Release版本,Debug版本用于内部调试,Release版本发行给用户使用,断言assert是仅在Debug版本起作用的宏,用于检查“不应该”发生的情况;在调试结束后,可以在#include<assert.h>语句之前插入#define NDEBUG来禁用a原创 2021-07-06 10:30:59 · 715 阅读 · 0 评论 -
C++中四种类型转换
1、static_case作用:主要用于C++中内置的基本数据类型之间的转换,例如:enum、struct、int、char、float等注意:static_cast没有运行时类型检查来保证转换的安全性,需要程序猿自己判断转换是否安全;int x = -1;uint y = static_cast<uint>(x); //转换错误 double x = 1.23;int y = static_cast<int>(x); //转换丢失精度static_原创 2021-07-05 12:03:51 · 1915 阅读 · 1 评论 -
C语言--面向对象编程思想
1.1、前言面向对象编程(OOP)并不是一种特定的语言或者工具,它只是一种设计方法、设计思想;它表现出来的三个最基本的特性就是封装、继承和多态;1.2、封装概念:封装就是把数据和方法打包到一个类里;其实C标准库中的文件操作就用到了面向对象的思想,例如:fopen()、fclose()和fwrite()等函数的操作对象就是FILE;数据内容就是FILE,fopen()可看做构造函数,fclose()可看做析构函数,数据的读写操作分别是fread()、fwrite();实例:实现一个单身狗类/原创 2021-05-10 14:12:17 · 1173 阅读 · 5 评论 -
回调函数
一、前言最近在编程过程中碰到一个问题,大概结构如下图示,类A中定义了B的实例,想在类B中访问类A,由于类A用引用了类B,类B中就不能再引用类A,否则会因相互引用而报错。类B是一个自定义类继承自QwtPlot,由于QwtPlot不是QObject的直接子类,所以无法导入宏Q_OBJECT,所以无法在该类中使用信号槽机制。后面考虑用双继承方式,双继承方式必须将QObject写在前面,例如:class Plot_View : public QObject, public QwtPlot{ Q_OBJE原创 2020-12-24 11:20:22 · 757 阅读 · 0 评论 -
C/C++函数指针总结
一 、函数指针介绍函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关。举例如下:int add(int nLeft,int nRight);//函数定义 该函数类型为int(int,int),要想声明一个指向该类函数的指针,只需用指针替换函数名即可:int (*pf)(int,int);//未初始化 则pf可指向int(int,int)类型的函数。pf前面有*,说明pf是指针,右侧是形参列表,表示pf指向的是函数,左侧为int,说明pf指向的函数返回值为int。则原创 2020-12-24 10:26:31 · 301 阅读 · 0 评论 -
求解表达式
一、计算机求解表达式的难处我们常用的表达式为中缀表达式,例如3+2*(5-1),不仅运算符有优先级,而且随着括号的加入,优先级也会发生变化,所以在计算机中如果直接求解中缀表达式是非常难以处理的。二、求解方法可以考虑将中缀表达式转换为后缀表达式进行求解。后缀表达式,又称逆波兰式,指的是不包含括号,运算法放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)三、中缀表达式转后缀表达式方法计算机求解方法:如果遇到操作数,则直接输出;如果遇到操作符,则依次原创 2020-11-05 17:04:38 · 1421 阅读 · 0 评论 -
C++中的sort函数总结
1、sort函数包含在头文件为#include的c++标准库中,调用标准库里的排序方法可以实现对数据的排序,但是sort函数是如何实现的,我们不用考虑!2、sort函数的模板有三个参数:void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);第一个参数first:是要排序的数组的起始地址。第二个参数last:是结束的地址(最后一个数据的后一个数据的地址)第三个参数comp是排序的原创 2020-09-10 13:58:51 · 1491 阅读 · 0 评论 -
C++多重继承
警告:C++是支持多重继承的,但一定要慎用,因为很容易出现各种各样的问题。#include <iostream>using namespace std;class B1{public: B1(){cout<<"B1\n";}};class B2{public: B2(){cout<<"B2\n";}};class C:public B2,public B1{ //:之后称为类派生表,表的顺序决定基类构造函数调用的顺序,析构函数原创 2020-09-03 17:11:02 · 417 阅读 · 0 评论 -
派生类对象构造和析构流程
创建派生类对象,必须首先创建基类对象;如果不调用基类构造函数,程序将使用默认的基类构造函数,因此如下代码等效:RatedPlayer(unsigned int r = 0, const string & fn = "none", const string & ln = "none", bool ht = false) { rating = r;}RatedPlayer(unsigned int r =原创 2020-09-03 15:39:01 · 727 阅读 · 0 评论 -
多态公有继承
多态:同一个方法在派生类和基类中的行为是不同的,方法的行为应取决于调用该方法的对象,即同一个方法的行为随上下文而异实现方式:在派生类中重新定义基类的方法使用虚函数程序示例:class Brass{private: std::string fullName; long acctNum; double balance;public: Brass(const std::string & s = "Nullbody", long an原创 2020-09-03 15:38:06 · 216 阅读 · 0 评论 -
虚函数的工作原理
通常,编译器处理虚函数的方法是:给每个对象添加一个隐藏成员,隐藏成员中保存了一个指向函数地址数组(虚函数表)的指针,虚函数表中存储了为类对象进行声明的虚函数的地址,例如:class Scientist { ... char name[40];public: virtual void show_name(); virtual void show_all();};class Physicist : public Scientist{ ... char fie原创 2020-09-03 15:37:04 · 331 阅读 · 0 评论 -
抽象基类(ABC)
当某个类是一个类的特殊情况时(例如:圆是长轴和短轴相等的椭圆),可以考虑采用继承的方式来实现。但是派生类可能并不需要继承基类所有的成员变量和成员方法,例如:椭圆包括中心坐标、长半轴长,短半轴长、方向角等成员变量,移动椭圆、返回椭圆面积、旋转椭圆、缩放长半轴和短半轴等成员方法;而圆只需要中心坐标、半径等成员变量,成员方法也有一些是不需要的或者实现方式是不同的,所以这样分析下来,还不如直接定义一个圆的类来的方便。但是,将圆的类单独定义,就忽略了它和椭圆具有共性这一事实 。为了解决这一问题,可以采用抽象基类(A原创 2020-09-03 15:35:45 · 568 阅读 · 0 评论 -
三种继承方式的区别
公有继承:基类成员在派生类中的访问权限保持不变,也就是说,基类中的成员访问权限,在派生类中仍然保持原来的访问权限基类成员访问属性派生类成员访问属性private成员无法访问protected成员protectedpublic成员public私有继承:基类所有成员在派生类中的访问权限都会变为private基类成员访问属性派生类成员访问属性private成员无法访问protected成员privatepublic成员priva原创 2020-09-03 15:34:55 · 1290 阅读 · 0 评论 -
函数模板
如果需要一个用于交换两个int值的函数,我们可以这样定义:void Swap(int a, int b){ int temp; temp = a; a = b; b = temp;}void Swap(int a, int b){ int temp; temp = a; a = b; b = temp;}但是现在如果需要交换的值不是int型,而是double型,又得重新重载一下Swap函数:doublevoid Swap(d原创 2020-08-14 11:16:03 · 221 阅读 · 0 评论 -
C++继承
1、派生类对象包含基类对象,使用公有派生,基类的公有成员将成为派生类的公有成员,基类的私有部分也将成为派生类的一部分,但只能通过基类的公有和保护方法访问。2、派生类对象存储了基类的数据成员,派生类对象可以使用基类的方法。3、继承示例://基类//tableTennis.hclass TableTennisPlayer{private: string firstname; string lastname; bool hasTable; public:原创 2020-08-13 11:21:55 · 267 阅读 · 0 评论 -
Linux--C/C++编程入门
文章目录一、前提二、安装编译器,并开始第一个程序三、C与C++混合编程四、编译五、编写makefile一、前提以下环境均采用树莓派环境下编程想要在Linux上进行编辑,必须学会Linux基本编辑命令和其他基本命令有编程基础二、安装编译器,并开始第一个程序1、安装编译器gcc & g++sudo apt-get install gcc g++2、编写第一个程序编辑...原创 2020-05-05 23:26:59 · 622 阅读 · 0 评论 -
C++基础知识总结-3
一、隐式类型转换首先,对于内置类型,低精度的变量给高精度的变量赋值是会发生隐式类型转换。其次,对于只存在单个参数的构造函数的对象构造来说,函数调用可以直接使用该参数传入,编译器会自动调用其构造函数生成临时对象。二、new/delete和molloc/free的区别首先,new/delete是C++的关键字,而molloc/free是C语言的库函数,后者使用不许指明申请内存空间的大小,对于类类...原创 2020-03-08 11:29:32 · 463 阅读 · 0 评论 -
C++基础知识总结-2
一、为什么析构函数必须是虚函数?为什么默认的析构函数不是虚函数?(1)、将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象时,释放基类指针可以释放掉子类的空间,防止内存泄漏。(2)、C++默认的析构函数不是虚函数是因为虚函数需要额外的虚函数表和虚表指针,占用额外的内存。而对于不会被继承的类来说,其析构函数如果是虚函数,就会浪费内存。因此C+...原创 2020-03-06 17:03:15 · 321 阅读 · 0 评论 -
C++基础知识总结-1
C++基础知识总结-1一、static关键字的作用1、全局静态变量在全局变量前加上关键字static,全局变量就定义成一个全局静态变量。静态存储区,在整个程序运行期间一直存在。初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非它被显示初始化);作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾。2、局部静态变量在局部变...原创 2020-03-06 11:18:50 · 323 阅读 · 0 评论 -
C++ 数据类型总结
C++ 数据类型总结一、常用整型类型长度取值范围char1Byte(-28,28-1)short (signed and unsigned)2Byte(-216,216-1)int (signed and unsigned)4Byte(-232,232-1)long (signed and unsigned)4Byte(-232,232-...原创 2020-02-27 22:34:24 · 407 阅读 · 0 评论 -
C/C++ const总结
C/C++ const总结一、常变量const type arguement_name || type const arguementconst int a = 5; //定义一个int型的常量,其值不能修改const int b; //定义const常量时必须初始化b = 10; //错误,const常量声明后不能进行初始化或修改...原创 2020-02-27 11:27:31 · 214 阅读 · 0 评论 -
C/C++ 可变参数列表
C++原型与ANSI C原型的区别ANSI C借鉴了C++中的原型,但这两种语言还有有区别的。其中最重要的区别是,为与基本C兼容,ANSI C中的原型是可选的,但在C++中,原型是必不可少的。例如,请看下面的函数声明:void say_hi();在C++中,括号为空与在括号中使用关键字void是等效的–意味着函数没有参数。在ANSI C中,括号为空意味着不指定参数–这意味着在后面定义参数列...原创 2020-02-27 09:41:27 · 1785 阅读 · 0 评论 -
Stack与Queue总结
Stack与Queue总结一、Stack堆栈是一个线性表,插入和删除只在表的一端进行。这一端称为栈顶,另一端称为栈底。堆栈的元素插入称为入栈,元素的删除则为出栈。特点:先入后出使用stack首先导入头文件#include<stack>。用法总结如下:用法说明stack s;创建一个名为s的堆栈s.push(x);将元素x压入栈中s.p...原创 2020-02-26 21:17:37 · 307 阅读 · 0 评论 -
Vector总结
Vector总结一、简介C++ vector类为内置数组提供了一种替代表示,与string类一样 vector 类是随标准 C++引入的标准库的一部分,使用时需包含头文件: #include <vector> , vector属于std命名域的,因此需要通过命名限定 , 建议使用全局的命名域方式:using namespace std。vector是STL中最常见的容器,它是一...原创 2020-02-26 18:00:50 · 607 阅读 · 0 评论