自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 硕士论文小技巧

*注意在开始写之前,最好将封面和相对应的字体格式整好(尤其是所有涉及数字和字母格式要使用英文格式Times New Roman;表格内字体为五号字体)1、去除页眉横线:选中,然后ctrl+shift+n;2、写好每个章节的大框架,然后去填充内容;3、图最好用Visio画出来再用系统截图或直接系统截图;4、每个图片的标题名要首先光标图片后“引用”“插入题注”,然后如下图 1所示,如需在正文中在图片编号改变后自动改变正文中的图片编号需要“引用”“交叉引用”图1 标题名命名5、插入..

2021-12-18 17:09:39 515

原创 虚函数表重点

1、只有一个直接基类1)派生类和基类会共用一个虚函数表。2) 如果基类中的虚函数被覆盖,那么原本基类虚函数的位置会被覆盖它的派生类的虚函数替代。3) 派生类中未覆盖基类中成员函数的虚函数也会被放进虚函数表中,接在基类后面,虽然不能被基类指针调用。2、有多个直接基类1)有几个直接基类,就有几个虚函数表。2)如果基类中的虚函数被覆盖,那么原本基类虚函数的位置会被覆盖它的派生类的虚函数替代。3) 派生类中未覆盖基类中成员函数的虚函数会被放入第一个虚函数表中,接在基类后面。...

2021-09-18 17:50:44 568 2

原创 C++抽象类与接口究极区别总结

最近面试遭到嘲讽,这个问题被爆破多chi,特此愤怒总结:共同点:都不能被实例化抽象类与接口区别 抽象类 接口 可定义构造方法 没有构造方法 可以有抽象方法(纯虚函数)和具体方法 方法只能是抽象方法 可以有普通成员变量和静态方法 不可以有普通成员变量和静态方法 可包含静态成员变量且访问类型任意 静态成员变量的访问类型只能是public static final(默认) 抽象方法可以有public、protected访问类型 抽象方法的访问类..

2021-09-08 11:19:49 156

原创 静态局部、静态全局、局部、全局变量理清

C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。从作用域看:全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包括全局变量定义的源文件需要用extern关键字再次声明这个全局变量。静态局部变量具有局部作用域。它只被初始化一次,自从第一次初始化直到程序与你新内阁结束都一直存在,他和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终

2021-08-28 10:39:59 620

原创 几种线程同步方式区别、特点

1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。2.互斥量:为协调共同对一个共享资源的单独访问而设计的。3.信号量:为控制一个具有有限数量用户资源而设计。4.事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。总结:1. 互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建,就可

2021-08-26 21:44:02 525

原创 虚函数虚继承多种情况下的内存对齐

1、虚继承class COneMember{public:COneMember(int iValue = 0){m_iOne = iValue;};private:int m_iOne;};class CTwoMember:virtual public COneMember{private: int m_iTwo;};长度:12内存结构:E8 2F 42 00 //指针,指向一个关于偏移量的数组,且称之虚基类偏移量表指针C...

2021-08-13 18:51:30 233

原创 include“ “和include<>区别

一般来说 #include <> 的查找位置是标准库头文件所在目录, #include “” 的查找位置是当前源文件所在目录。不过这些都可由编译器调用参数等配置更改。而""首先在当前目录下寻找,如果找不到,再到系统目录中寻找。 这个用于include自定义的头文件,让系统优先使用当前目录中定义的。若 #include “” 查找成功,则遮蔽 #include <> 所能找到的同名文件;否则再按照 #include <> 的方式查找文件。另外标准库头文件都放在 #inc

2021-08-09 11:56:52 2565

原创 使用指针时注意的问题

1、指针定义后要初始化,没有指向时指向NULL;2、指针赋值时一定要保证类型匹配,由于指针类型确定指针所指向对象的类型,因此初始化或赋值时必须保证类型匹配;3、两个指针最好不要指向同一块内存,一个指针的释放会导致另外一个指针成为悬垂指针,造成不堪设想的后果;4、释放指针内存后要将该指针置空;5、指针分配成功后才可以使用,要走注意分配后的大小,不要越界。...

2021-08-05 16:57:26 3166

原创 c++11 多线程

1. std::threadstd::thread为C++11的线程类,使用方法和boost接口一样,非常方便,同时,C++11的std::thread解决了boost::thread中构成参数限制的问题,我想这都是得益于C++11的可变参数的设计风格。我们通过如下代码熟悉下std::thread使用风格: 1//c11.cpp 2#include<iostream> 3#include<thread> 4voidthreadfun1() 5{ 6...

2021-07-15 21:12:23 290

原创 c++11之STL

1. std::array其实std::array跟数组没什么区别,只是增加了迭代器的功能。2. std::forward_liststd::forward_list为c++11新增的线性表,与list区别在于它是单向链表,而list是双向链表。链表在对数据进行插入和删除是比顺序存储的线性表有优势,因此在插入和删除操作频繁的应用场景中,使用list和forward_list比使用array、vector和deque效率要高很多。3. std::unordered_mapstd::unor

2021-07-15 20:41:54 226

原创 C++11智能指针

简单地说,智能指针是用对象去管理一个资源指针,同时用一个计数器计算引用当前指针对象的个数,当管理指针的对象增加或减少时,计数器也相应加1或减1,当最后一个指针管理对象销毁时,计数器为1,此时在销毁指针管理对象的同时,也对指针管理对象所管理的指针进行delete操作。下面我们介绍两个常用的智能指针std::shared_ptr和std::weak_ptr。1.1 std::shared_ptrstd::shared_ptr包装了new操作符动态分配的内存,可以自由拷贝复制,基本上是使用最多的一个智

2021-07-15 17:56:31 88

原创 C++11常见属性

1. 常用属性1.1 auto关键字及其用法auto关键字可以用于定义变量和函数的返回值(包括声明和定义都可以),但不能用于函数形参和模板类型。示例如下: #include "stdio.h" auto add(int a, int b) { return a+b; } int main() { int a = 2, b = 3; auto c = add(a, b); fprintf(stder

2021-07-15 16:11:20 442

原创 for循环内冒号

在C++11中经常有如下的写法for (int &n : nums) n++;//nums是一个数组,或者其他的容器for循环的含义等同于for (int i=0; i<nums.size(); i++),其中n=nums[i],注意在n前面加入引用符号,这样数组中的值才是可以更改的,如果没有加入,则数组是可读的,不能更改。...

2021-07-15 11:25:11 942

原创 BCB中动态链接库的建立和调用

1.创建DLL工程文件->新建->其他->DLL Wizard,单击确定后,source type选择C++,单击ok。在文件的末尾写入自己的代码(这里以调用PO法计算RCS函数为例,复制了旧工程中)如下图1所示。(注意:__declspec,__fastcall这里的横线是两个横线组成)图1 建立DLL并在文件末尾输入代码2.生成DLL和LIB文件注意:在写入代码后,有一些该函数中调用的但是本工程中没有的函数、变量以及一些头文件要加上去,不然运行时会报错,加的函.

2021-07-13 16:44:36 338

原创 Union内存对齐

当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。在C Programming Language 一书中对于联合体是这么描述的: 1)联合体是一个结构; 2)它的所有成员相对于基地址的偏移量都为0; 3)此结构空间要大到足够容纳最"宽"的成员;4)其对齐方式要适合其中所有的成员;下面解释这四条描述: 由于联合体中的所有成员是共享一段内存的,因此每个成员的存放首地址相对于于联合体变量的基地址的偏移量为0...

2021-07-13 16:18:37 1914

原创 传值与传址

首先介绍一下函数中传值与传址的概念:传值:传值,实际是把实参的值赋值给行参,相当于copy。那么对行参的修改,不会影响实参的值 。传址: 实际是传值的一种特殊方式,只是他传递的是地址,不是普通的赋值,那么传地址以后,实参和行参都指向同一个对象,因此对形参的修改会影响到实参。下来用两个例子来说明:先看看这个代码#include<stdio.h>void swap(int n1,int n2){ int temp; temp=n1; n1=n2; ...

2021-07-05 16:14:27 2220 2

原创 for循环中i++和++i

for 循环中 ++i 和 i++的结果是一样的,都是每次循环的代码执行完后进行自增操作,但是性能是不同的。++i的性能 > i++的性能在大量数据的时候++i的性能要比i++的性能好原因:i++由于是在使用当前值之后再+1,所以需要一个临时的变量来转存。而++i则是在直接+1,省去了对内存的操作的环节,相对而言能够提高性能。...

2021-07-03 16:10:20 2219

原创 内存对齐原则

1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)和指定对齐值(有宏 #pragma pack(N) 指定的值这里面的N一定是2的幂次方。如1,2,4,8,16等,如果没有通过宏那么在32位Linux主机上默认指定对齐值为4,64位的默认对齐值为8,AMR CPU默认指定对齐值为8)两者中的最小值的整数倍开始(比如int在32位

2021-06-22 16:41:08 90

原创 二叉树的顺序遍历和层序遍历

1、二叉树的顺序遍历可以使用递归和迭代的方法,本质都是使用栈数据结构,区别有递归的时候按照题中的要求顺序写,比如此处力扣94二叉树的中序遍历(顺序为左中右)代码如下:void traversal(TreeNode* cur,vector& vec){if (cur==NULL) return;traversal(cur->left,vec);//左vec.push_back(cur->val);//中traversal(cur->right,vec);//右}主:v

2021-06-05 17:27:45 270

原创 迭代器失效

1、对于序列式容器,比如vector,删除当前的iterator会使后面所有元素的iterator都失效。这是因为顺序容器内存是连续分配(分配一个数组作为内存),删除一个元素导致后面所有的元素会向前移动一个位置。(删除了一个元素,该元素后面的所有元素都要挪位置,所以,iter++,已经指向的是未知内存)。2、 对于关联容器(如map, set,multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前iterator即可。这是因为ma

2021-05-22 10:43:06 747

原创 static成员变量和成员方法要点

被static修饰的成员变量和成员方法独立于该类的任何对象,被类所有的实例所共享。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例对象共用同一个static变量。这也就是说不管创建多少对象,static修饰的变量只占有一块内存,不被继承。...

2021-05-16 18:00:55 82

原创 拷贝构造函数何时调用

1当用类的一个对象初始化该类的另一个对象时.例如:1当用类的一个对象初始化该类的另一个对象时.例如:int main(){ point A(1,2); point B(A);//用对象A初始化对象B,拷贝构造函数被调用。}2 如果函数的形参是类的对象,调用函数时,进行形参和实参结合时。void f(point p){}main(){ point A(1,2); f(A);//函数的形参为类的对象时,当调用函数时,拷贝构造函数被调用。}3 如果函数的返回...

2021-05-14 17:19:16 206

原创 new和malloc区别

(1)malloc和new都是在堆上开辟内存的,malloc只负责开辟内存,需要用户自己初始化;new不但开辟内存,还可以进行初始化。(2)malloc是函数,开辟内存需要传入字节数,如malloc(sizeof(int));表示在堆上开辟了4个字节的内存,返回void*,表示分配的堆内存的起始地址,因此malloc的返回值需要强转成指定类型的地址;new是运算符,开辟内存需要指定类型,返回指定类型的地址,因此不需要进行强转。(3)malloc开辟内存失败返回NULL,new开辟内存失败抛出bad_al

2021-05-13 10:39:37 239

原创 [C++ Error] gl.h(1500): E2257 , expected

[[C++ Error] gl.h(1500): E2257 , expected BCB中的错误这种问题可能是你在BCB保存的那个工程拷贝到其他路径下出现的,而且你的这个工程应该是保存在BCB的解压文件夹的(我出现的问题是这样的),现在你可以试着新建一个工程但是保存在其他的文件夹(不是BCB的源文件夹,比如C:\Program Files (x86)\Borland\CBuilder6\Bin...

2019-10-17 09:38:34 301

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除