C++日常
记录日常C++知识和问题
友善啊,朋友
这个作者很懒,什么都没留下…
展开
-
c++自定义定时器
我们公司最近被qt公司盯上说侵权,现在在去qt化,本博文的定时器可以代替QTimer。这个代码可用,不卡GUI,缺点是每创建一个对象就创建一个子线程。原创 2024-06-05 11:14:54 · 651 阅读 · 6 评论 -
for循环遍历列表的注意事项
一图流:原创 2023-07-20 10:31:22 · 1664 阅读 · 0 评论 -
int和位数组互转
int和位数组互转原创 2022-06-30 16:52:05 · 896 阅读 · 0 评论 -
南科大C++课程知识点
视频:快速学习C和C++,基础语法和优化策略,学了不再怕指针(南科大计算机系原版)_哔哩哔哩_bilibili南方科技大学计算机系“C/C++程序设计”课程视频。课件、例程等请访问 https://github.com/ShiqiYu/CPP (致谢:广东省在线开放课程项目,教育部-华为“智能基座”)https://www.bilibili.com/video/BV1Vf4y1P7pq强烈推荐这个课程,老师讲得太好了,无论是小白还是熟手都适合学习。g++编译文件1、编译 hello.cpp 文件原创 2022-04-30 23:32:48 · 1543 阅读 · 0 评论 -
模板特化、重载
模板特化将模板中的参数指定为特定的类型,模板特化之后可以针对特效类型实现特定的功能。模板全特化所有参数都特化为确定的类型。模板类和模板函数都可以全特化。全特化的模板参数列表是空的。示例1,函数全特化:template<typename T> T add(T t1,T t2){ return t1 + t2;}这个模板函数int类型可以正常使用,但char不行,这时候可以特化一个char类型的:template<typename T>原创 2021-09-12 12:57:21 · 222 阅读 · 0 评论 -
指针数组和数组指针
指针数组int a,b,c;int * p [3];p[0] = &a;p[1] = &b;p[2] = &c;数组指针int (*p) [3];int a[3] = {1,2,3};p = &a;p指向一个int类型有3个元素的数组。数组指针p指向整个数组a,而不是数组a的首元素。看起来数组指针和指针数组很像,不过数组指针多了个括号包住指针变量。...原创 2021-09-04 15:05:44 · 130 阅读 · 0 评论 -
c++内存分配相关知识点
malloc() 和 free()C语言中依靠malloc()从堆内存中申请空间,通过free()释放空间。 int * const p = static_cast<int*>(malloc(sizeof (int) * 10)); free(p);应该对指针p加上const,使得不能修改p的指向。若修改了p的指向则不能正确释放内存。new 和 deletenew首先在堆内存分配空间,然后调用构造函数初始化,并返回空间的首地址。delete首先调用析构函.原创 2021-09-04 11:00:44 · 128 阅读 · 0 评论 -
sizeof与结构体数据对齐
数据对齐处理结构体中的成员时,成员在内存中的起始地址编码必须是成员类型所占字节数的整数倍。数据类型所占字节数见:类型尺寸。sizeof计算结构体尺寸规则结果必须是结构体中占用空间最多的成员所占字节数的整数倍。例1:计算此结构体的空间 sizeof(st1)struct st1{ char a; short b; int c; double d;};此结构体成员中占空间最多的成员是double类型,8字节。即结果是8的整数倍16。例2.原创 2021-09-02 23:54:48 · 643 阅读 · 4 评论 -
c++关于类型转换的知识点
一、C语言中的类型转换int i = 1;double d = 1.5;double i2d = (double)i;int d2i = (int)d二、static_cast用途:对于基本类型。static_cast可以替代C语言风格的类型转换。 转换指针时,如果两个类之间有继承关系(不管谁A继承B还是B继承A),可成功转换。不相关的类无法相互转换。不安全的场景:QWidget * w = new QWidget;QWidget * l1 = new QLabel;原创 2021-09-01 22:35:51 · 231 阅读 · 0 评论 -
一图流:源程序处理流程
原创 2021-09-01 20:29:33 · 178 阅读 · 0 评论 -
内置类型的最值
#include <limits>#define debug qDebug()<<int main(int argc, char *argv[]){ debug "最大的int" <<std::numeric_limits<int>::max(); debug "最小的int" <<std::numeric_limits<int>::min(); debug "最大的uint" <<std::.原创 2021-03-10 22:55:30 · 99 阅读 · 0 评论 -
访问控制
1、一图流:2、class成员默认是private的,struct成员默认是public的。3、成员变量不要声明为protected。4、声明为protected的成员一般是供派生类使用的成员。5、class默认是private继承,struct默认是public继承。6、继承方式与基类中的成员在派生类中(及派生类的友元函数中)的情况:继承方式/基类成员 public成员 protected成员 private成员 public继承 public原创 2021-03-07 16:07:09 · 261 阅读 · 0 评论 -
派生类的知识点
1、派生一个类没有多余的内存开销,所需的内存就是储存成员的内存。2、派生类一般将基类部分的数据放在前面:#define debug qDebug()<<class A{public: int a;};class B : public A{public: int b;};int main(int argc, char *argv[]){ B bb; bb.a = 666; bb.b = 888; debug.原创 2021-03-06 23:07:54 · 694 阅读 · 0 评论 -
virtual与析构函数
当一个类作为其他类的基类时,它的析构函数应该加上virtual。#define debug qDebug()<<class A{public: virtual ~A() { debug "A 析构"; }};class B : public A{public: ~B() { debug "B 析构"; }};int main(int argc, char *argv[]){ A原创 2021-03-03 13:30:30 · 1495 阅读 · 1 评论 -
嵌套类
#define debug qDebug()<<class outside{public: explicit outside(int f,int s):frist{f},second{s} { } void debugValue() { debug four; debug frist; debug second; } static int four;private: int.原创 2021-03-02 23:30:22 · 505 阅读 · 0 评论 -
mutable关键字
1、变量用mutable修饰即使在const函数里也能修改变量:struct ceshi{ explicit constexpr ceshi(int frist,int second) :frist(frist),second(second) { } mutable int frist; int second; void addFrist() const { ++frist; }};2、mutabl原创 2021-03-02 12:47:05 · 205 阅读 · 0 评论 -
对于“句柄”这个概念的个人理解
“句柄”这个词是从“handle”翻译的,这个词在编程里应该作为名词而不是动词,英文里handle作为名词意思是“xxx的柄 / xxx的把手”,在编程里,句柄常用于资源管理,资源的柄/资源的把手,可以理解成握住了把柄/把手就控制住了资源,使用句柄可操控资源。《c++程序设计语言 第4版》第13.3章节举了一个例子,大概是这样:#define debug qDebug()<<int main(int argc, char *argv[]){ QFile f("d://测试.原创 2021-02-25 13:37:32 · 717 阅读 · 0 评论 -
访问其他文件中的变量
如下图,在此头文件中定义一个全局变量:然后在另一个文件里使用它:会报“重复定义”的错:查看编译输出:这两个文件都生成了.o文件,也就是编译没问题,问题出在链接的时候。出现此问题的原因是这两个文件是分开编译的,main.cpp文件包含(include)了<widget.h>文件,在编译器预处理时会将#include指令指定的头文件包含进来,也就是编译前main.cpp里面包含了一份<widget.h>文件的拷贝副本,没有语法错误则编译没问题,每个文件原创 2021-02-28 23:05:44 · 603 阅读 · 0 评论 -
关于名称空间的一些知识点
可以从多个分离的名称空间中向名称空间添加内容,如:namespace A{ void fun01();}namespace A{ void fun02();}名称空间A中有两个函数。这个特性非常有用,可以使不同文件中的函数置于同一个名称空间。...原创 2021-02-26 12:58:01 · 200 阅读 · 0 评论 -
宏
《c++程序设计语言 第四版》12.6章节1、不到万不得已不要使用宏(如果要定义常量应该用const而不是宏)。2、带参数的宏:#define debug qDebug()<<#define GETMIN(a,b) std::min(a,b)int main(int argc, char *argv[]){ debug GETMIN(4,5);}3、宏不能重载、不能处理递归。4、编译器无法在宏定义的时候发现错误。5、宏名称应该大写。6、#可将参数转.原创 2021-02-24 13:29:38 · 158 阅读 · 0 评论 -
[[noteturn]]函数
《c++程序设计语言 第四版》 12.1.7章节形如[[...]]的概念被称为属性,属性可以置于任何位置,通常用来描述某种性质。c++只包含了两个标准属性[[noreturn]]、[[carries_dependency]]。[[noteturn]]表示不希望程序中有任何返回,如果有,程序运行时会出现未定义行为(不影响编译通过)。#define debug qDebug()<<[[noreturn]]void debugSomeThing(){ debug 1;原创 2021-02-23 13:27:49 · 135 阅读 · 0 评论 -
后置返回类型
《c++程序设计语言 第四版》12.1.4章节后置返回类型在声明/定义函数时把返回值放在后面auto getValue(int value)->int{ return value*2;}这种用法主要用于模板,模板有时候不能确定返回值类型:template<class T1,class T2>auto getValue(T1 v1,T2 v2)->decltype (v1 + v2){ return v1 + v2;}#define d原创 2021-02-23 12:34:14 · 473 阅读 · 0 评论 -
关于运算符的一些知识点
1、可以用关键字代替逻辑运算符:#define debug qDebug()<<int main(int argc, char *argv[]){ debug (true and false);}2、c++没有明确规定表达式的求值顺序,不能假定表达式是从左到右求值的,为了避免奇怪的运行结果,要避免在同一个表达式同时读写同一个对象(如避免写v[i] = i++这种代码)。3、逗号运算符、逻辑与(&&)、逻辑或(||)规定它们左侧运算对象先被求值。逗.原创 2021-02-15 23:04:31 · 317 阅读 · 0 评论 -
关于枚举的一些知识点
《c++程序设计语言(第四版)》8.4章节1、枚举分成两种enum class和enum,前者枚举值不会隐式转换成其他类型,后者值会转成整数。一般应该使用前者。2、枚举值类型一般是int,如果认为int类型浪费空间也可以显示地指定其他类型:enum class color:char{ red, green, yellow};3、枚举的位运算:enum class color:char{ red = 5, green = 6, ye原创 2021-02-15 14:48:15 · 450 阅读 · 0 评论 -
关于struct的一些知识点
1、布局在为成员分配内存空间时,分配的顺序与声明结构的顺序一致,如下结构:struct ceshi{ char frist; int second; char three;};在内存中的的布局是这样(类型尺寸):成员按照从大到小的顺序可以减少空间的浪费:这时候在内存中的布局是这样的:2、如果不添加构造函数,用初始化列表方式初始化{},那将按照默认顺序初始化成员:struct ceshi{ int frist; int原创 2021-02-15 13:27:46 · 152 阅读 · 0 评论 -
关于数组名和指针的一些知识点
1、数组名可以看做指向数组首元素的指针。#define debug qDebug()<<int main(int argc, char *argv[]){ char v[] = "this is a string"; char * p2 = v; debug strlen(p2); debug strlen(v);}这里做了隐式转换: char * p2 = "this is a string";这是c语言风格的字符串。2.原创 2021-02-14 21:30:53 · 239 阅读 · 0 评论 -
std::string/QString原始字符串字面值常量
当要写一个字符串里面有很多斜杠的时候(比如正则表达式),为了便于书写和不出错,可以使用原始字符串字面值常量。1、std::string的原始字符串字面值常量#define debug qDebug()<<#define cppdebug std::cout <<int main(int argc, char *argv[]){ std::string s = R"(asdfghjkl\n\t\y\z6666\\\\\////)"; cppdebug原创 2021-02-14 17:53:33 · 1313 阅读 · 0 评论 -
关于c++声明的一些知识点
《c++程序设计语言(第四版)》6.3章节1、声明变量时并没有为它分配内存空间,定义变量时才分配内存空间。2、同一个变量可以多次声明,但只能定义一次。3、使用作用域解析运算符::可以访问被屏蔽的全局变量:int x = 666;int main(int argc, char *argv[]){ int x = 3; debug x << ::x;}4、当不使用auto定义变量时建议使用如下形式:int i {666};当使用auto时使用原创 2021-02-14 15:03:29 · 613 阅读 · 0 评论 -
关于c++基本类型的一些知识点
《c++程序设计语言(第四版)》6.2章节原创 2021-02-13 23:24:32 · 140 阅读 · 0 评论 -
自定义类型重载std::cout和qDebug()
struct ceshi{ int frist; int second; ceshi(int one = 0,int two = 0):frist{one},second{two} { } friend std::ostream& operator<<(std::ostream&,const ceshi&); friend QDebug operator<<(QDebug dbg, const ces.原创 2021-02-12 10:11:25 · 955 阅读 · 0 评论 -
函数对象
《c++程序设计语言(第四版)》3.4.3章节所谓的函数对象是类的一种用法,将函数封装程度一个类,可以将函数的部分或者全部参数封装成类的成员变量,也可以不封装参数。重载类的“()”运算符,在该运算符函数里实现函数操作。创建对象并使用“()”运算符调用函数。例1:class intLessThan{private: int val;public: intLessThan(const int & v):val{v}{} bool operator ()(con原创 2021-02-11 20:04:14 · 172 阅读 · 0 评论 -
移动对象的知识点
《c++程序设计语言(第四版)》3.3.2移动构造函数是构造函数的一种,用移动其他对象的资源的方式构造对象。#define debug qDebug()<<struct ceshi{ int frist; int second; ceshi(int one = 0,int two = 0):frist{one},second{two} { } ceshi(ceshi && c):frist{c.frist},sec原创 2021-02-11 16:04:38 · 323 阅读 · 0 评论 -
异常处理
《c++程序设计语言(第四版)》2.4.3章节1、异常#include <stdio.h>#define debug qDebug()<<int main(int argc, char *argv[]){ int x[2]{1,2}; int i = 2; try { if(i >= 2) { throw std::out_of_range("数组越界了");原创 2021-02-11 09:41:55 · 218 阅读 · 0 评论 -
变量初始化的一些知识点
《c++程序设计语言(第四版)》2.2.2章节1、尽可能使用初始化列表:{}的形式给变量初始化,而不是“=”;2、初始化列表不会窄化类型转换(如:int i = 7.2);3、除了以下情况,尽可能使用auto:变量定义在一个较大的作用域中 需要明确精度和范围时(如double和float)...原创 2021-02-10 13:54:41 · 167 阅读 · 0 评论 -
c++类型尺寸
内置类型所有c++类型的尺寸都可以表示为char类型的整数倍。类型的尺寸在不同的机器上可能不同,可以使用sizeof运算符获取。#define debug qDebug()<<int main(int argc, char *argv[]){ debug sizeof(bool); debug sizeof(char); debug sizeof(int); debug sizeof(double);}自定义类型class .原创 2021-02-10 11:42:19 · 308 阅读 · 0 评论 -
移除类型中的引用:remove_reference
#define debug qDebug()<<int main(int argc, char *argv[]){ std::remove_reference<int&>::type d; d = 6; debug d;}std::remove_reference<int&>::type去掉了int&中的引用,结果是int,等于: int d; d = 6;应用: int a .原创 2021-02-07 17:28:26 · 1561 阅读 · 0 评论 -
根据表达式推断类型的关键字:decltype
这个关键字可以推断出表达式的类型。struct{ int frist = 2; int second = 3;}ceshi;上面是一个匿名结构体对象,变量名是ceshi,类型不知道。如果要使用这个结构体的类型,就用到了decltype: decltype(ceshi)创建一个同类型的对象并赋值返回:struct{ int frist = 2; int second = 3;}ceshi;decltype(ceshi)原创 2021-01-30 17:05:07 · 161 阅读 · 0 评论 -
右值引用
《c++ primer》13.6.1章节左值:指表达式结束后依然存在的持久对象,可以取地址,具名变量或对象右值:表达式结束后就不再存在的临时对象或者字面值常量,不可以取地址,没有名字。如: int i = 10; int & r = i;i和r赋值完了在作用域内一直存在,都可以取地址。 i = i * 30;i * 30取i的值乘30将结果赋给一个临时的int对象,这个临时的int对象再给i赋值,这里的“i * 30”就是右值,执行完这一句临时对象..原创 2021-02-05 13:30:26 · 262 阅读 · 0 评论 -
类的交换函数
struct ceshi{ explicit constexpr ceshi(int frist,int second) :frist(frist),second(second) { } int frist; int second; void swap(ceshi & c1,ceshi & c2) { qDebug()<<"调用自己的swap()"; std::swap..原创 2021-02-04 22:51:39 · 412 阅读 · 0 评论 -
对象拷贝知识点
《c++ primer》13.1章节《c++程序设计语言 第四版》17.5.1章节1、拷贝操作有两种:拷贝构造函数:A(const A&)。初始化一片未经初始化的内存 拷贝赋值运算符:A& operator=(const A&)。处理的目标对象已构造且可能拥有资源的情况2、拷贝初始化:定义变量时拷贝其他对象的值来给对象初始化,在以下情况发生:用 = 定义变量时 将对象作为实参传递给非引用类型的形参时 从返回类型为非引用类型的函数返回对象时 用{}列表初始化数原创 2021-02-01 23:31:49 · 679 阅读 · 0 评论
分享