C/C++
文章平均质量分 51
c++学习笔记
CHAO_^
这个作者很懒,什么都没留下…
展开
-
const修饰指针的三种效果,C语言const修饰指针详解
前面讲过,当一个变量用 const 修饰后就不允许改变它的值了。那么如果在定义指针变量的时候用 const 修饰会怎样?同样必须要在定义的时候进行初始化。当用 const 进行修饰时,根据 const 位置的不同有三种效果。原则是:修饰谁,谁的内容就不可变,其他的都可变。这三种情况在面试的时候几乎是必考的,在实际编程中也是经常使用的,所以初学者一定要掌握。原创 2023-12-16 22:00:17 · 148 阅读 · 0 评论 -
C++ 常量表达式
C++ 常量表达式原创 2022-07-28 21:24:10 · 773 阅读 · 0 评论 -
C++ explict 关键字
C++ explict 关键字原创 2022-07-28 21:19:35 · 264 阅读 · 0 评论 -
C++ extern关键字
C++ 全局变量原创 2022-07-23 10:17:34 · 486 阅读 · 0 评论 -
调用lib时,无法解析的外部符号
通过vs生成一个a.lib,a.lib中调用了b.lib在其他工程中引用a.lib,结果爆出b中的函数是无法解析的外部符号。原因在于这里,不能选用静态库,而一定要使用生成dll时附带生成的那个lib才可以,绝了,网上没有一个人说,啥情况?...原创 2021-08-21 18:52:26 · 1737 阅读 · 2 评论 -
测量程序运行时间
opencv 中提供的测量程序运行时间的类cv::TickMeter是我用过的最好用的测量程序运行时间的方法,就算是不写图像处理程序我也想用它。TickMeter tm;tm.start();// do something ...tm.stop();std::cout << tm.getTimeSec();...原创 2020-05-13 17:52:28 · 237 阅读 · 0 评论 -
C++ Visual Stdio生成库文件
对项目属性进行设置函数声明添加前缀对于windows系统,需要在头文件函数声明前加__declspec(dllexport) 也可以将该前缀进行宏定义#if(defined_WIN32|| definedWINCE || defined__CYGWIN__)#defineMY_EXPORTS__declspec(dllexport)#elifdefined__GNUC__ && __GNUC__ >= 4#defineMY_EXPOR...原创 2020-05-12 20:30:23 · 334 阅读 · 0 评论 -
二分法查找详解
二分法查找从概念上很好理解,困难的地方在于有几个细节需要注意:1.循环执行条件。2.递进方式。3返回值的问题,返回左右边界值还是返回一个存储结果的中间变量。 以一个最常见的游戏为例,甲从0~9中随便选择一个整数,乙来猜,甲回答大于,小于,或等于,若甲选择的数字为9,则乙在大概率下,最快几次可以猜到。(0+9)/2 = 4 (0 + 4)/2=2 (0+2)/2=1 (0原创 2018-05-24 20:26:53 · 12882 阅读 · 1 评论 -
C++ 注释风格
注释风格注释风格可以根据自己的个人习惯来定,但关键是要统一,为了制定出统一的注释风格所以采用Doxygen注释风格。 使用Doxygen软件可以很方便的生成函数描述文档。DoxyGen常用命令 命令 生成字段名 说明 @file 文件名 @autho...原创 2020-03-31 17:18:33 · 1036 阅读 · 0 评论 -
代码优化细节
代码优化细节变量 1.成员变量及临时变量必须严格按照命名规范。3.在构造函数中只完成变量,指针初始化操作。4.尽可能不使用浮点型数据。5.如非必要,避免对变量进行归一化操作。6.不会改变的变量声明为常亮const。函数 1.不定义不使用的返回值。2.将本地函数(在同一文件中定义的函数,且只在同一文件中进行调用)声明为静态(static)。3.使原创 2016-11-23 15:40:30 · 444 阅读 · 0 评论 -
宏定义函数和普通函数
尽管函数式宏定义和普通函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率,毕竟省去了分配和释放栈帧、传参、传返回值等一系列工作,因此那些简短并且被频繁调用的函数经常用函数式宏定义来代替实现在C及C++语言中允许用一个标识符来表示一个字符串,称为宏,该字符串可以是常数、表达式、格式串等。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏转载 2016-11-22 08:39:09 · 343 阅读 · 0 评论 -
C++成员函数的重载、覆盖与隐藏
成员函数的重载、覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚概念,否则错误将防不胜防。成员函数被重载的特征: (1)相同的范围(在同一个类中); (2)函数名字相同; (3)参数不同; (4)virtual 关键字可有可无。覆盖:派生类函数覆盖基类函数,特征是: (1)不同的范围(分别位于派生类与基类); (2)函数名字相同; (3)参数相同; (4)基类函数必转载 2016-12-13 21:53:18 · 259 阅读 · 0 评论 -
C++编译和链接原理
C++编译原理 1、编译:编译器对源文件进行编译,就是把源文件中的文本形式存在的源代码翻译成机器语言形式的目标文件的过程,在这个过程中,编译器会进行一系列的语法检查。如果编译通过,就会把对应的CPP转换成OBJ文件。 2、编译单元:根据C++标准,每一个CPP文件就是一个编译单元。每个编译单元之间是相互独立并且互相不可知。 3、目标文件:由编译所生成的文件,以机器码的形转载 2016-11-25 15:20:11 · 498 阅读 · 0 评论 -
C语言实现面向对象思想
1. 使用结构体实现对象 与 C++不同的是, C 语言定义的成员函数增加了一个额外参数: lpThis,这是最关键的一点。实际上, C++语言在调用成员函数的时候,也隐含了一个指向自身的参数( this指针),因为 C 语言不支持这种隐含机制,因此需要明确的指定指向自身的参数。 调用: CommonObject.GetObjectType(&CommonObject);2.原创 2017-02-23 19:56:41 · 3589 阅读 · 0 评论 -
二叉树深度优先遍历详解
二叉树的遍历(每一种遍历次序有递归实现(简捷)和迭代实现两种方式)深度优先遍历1.递归实现中根遍历的递归实现 vector<int> result; vector<int> inorderTraversal(TreeNode* root) { inorder(root); return result;...原创 2018-05-24 20:27:19 · 28837 阅读 · 2 评论 -
数组
数组删除元素双指针操作:对同一个空间定义两个指针,一前一后,一快一慢,核心的问题是慢指针跳过的条件。删除指定元素跳过的条件:快指针当前指向的值等于要删除的元素。int removeElement(vector& nums, int val) { const int n = nums.size(); int index = 0;原创 2018-05-24 20:27:28 · 194 阅读 · 0 评论 -
C++:链表
链表简介链表是一种动态数据结构,无需知道链表的长度,创建链表时不分配内存,每当插入一个节点,需要为新节点分配一次内存,然后调整指针的指向,使得新节点被链接到链表中。 节点定义:Struct ListNode{ Int m_nValue; ListNode* m_pNext;};链表操作注意!!! 1.注意保存头结点。另新建一个节点来进行数据操作。原创 2018-05-24 20:27:45 · 6285 阅读 · 0 评论 -
C/C++代码优化方案
目录1、选择合适的算法和数据结构 3 2、使用尽量小的数据类型 3 3、减少运算的强度 3 (1)查表 3 (2)求余运算 4 (3)平方运算 4 (4)用移位实现乘除法运算 4 (5)避免不必要的整数除法 5 (6)使用增量和减量操作符 5 (7)使用复合赋值表达式 6 (8)提取公共的子表达式 6 4、结构体成员的布局 7 (1)转载 2016-11-29 21:34:56 · 4814 阅读 · 0 评论 -
C++前向声明
前向声明:可以声明一个类而不定义它。这个声明,有时候被称为前向声明(forward declaration)。在声明之后,定义之前,类Screen是一个不完全类型(incompete type),即已知Screen是一个类型,但不知道包含哪些成员。不完全类型只能以有限方式使用,不能定义该类型的对象,不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类原创 2016-11-11 11:55:58 · 309 阅读 · 0 评论 -
windows Socket编程
windows下socket编程有两种方式,tcp和udp 通常我们在说到网络编程时默认是指TCP编程,即用前面提到的socket函数创建一个socket用于TCP通讯,函数参数我们通常填为SOCK_STREAM。即socket(PF_INET, SOCK_STREAM, 0),这表示建立一个socket用于流式网络通讯。 SOCK_STREAM这种的特点是面向连接的,即每次收发数据之前必须通过c原创 2016-04-08 22:10:04 · 646 阅读 · 0 评论 -
extern “C“的用法解析
1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言, C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言 ,为了支持函数的重载,C++对全局函数的处理方式与C有明转载 2016-05-05 10:04:13 · 270 阅读 · 0 评论 -
断言(ASSERT)的用法
我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非“报错”。在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种“契约式编程”,在我的理解中,其表达的意思就是,程序在我的假设条件下,能够正常良好的运作,其实就相当于一个if语句:if(假设成立){ 程序正常运行;}else{ 报错&&终止程序!(避免由程序运行引转载 2016-05-05 17:14:49 · 400 阅读 · 0 评论 -
C++ 模板
按照WHAT, WHY, HOW的思路学习。 1. 什么是C++模板? 答:模板就是实现代码重用机制的一种工具。它实现了将类型参数化,就是将类型定义为参数,实现了真正的代码可重用性。模板分为两大类:函数模板和类模板。由于类模板包含类型参数,所以类模板又称作参数化的类。如果说类是对象的抽象,抽象是类的实例;那么可以说类模板是类的抽象,而类是类模板的实例。利用类模板可以建立各种数据类型的类。 2.转载 2016-05-06 10:37:34 · 324 阅读 · 0 评论 -
C++ 操作符重载
重载不能改变操作符的优先级 如果一个内建操作符是一元的,那么所有对它的重载仍是一元的。如果是二元的重载后也是二元的 下面看一个有代表性的例子::头文件Complex.h:#include <iostream>using namespace std;class Complex {public: Complex(); Complex(double); Complex(doubl转载 2016-05-07 13:02:29 · 478 阅读 · 0 评论 -
C++内存管理
[导语]内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放转载 2016-05-18 14:53:50 · 672 阅读 · 0 评论 -
普通函数,虚函数,纯虚函数
虚函数和非虚函数class base{public: int bar(char x){ return (int)x;} int bar(int x){return 2*x;}}class c1:public base{public: int bar(char x){ return (int)(-x);} int bar(int x){ return x/2;}}void main转载 2016-04-23 17:58:30 · 512 阅读 · 0 评论 -
C语言中关于sizeof和strlen的区别
本文通过示例简单分析了4种情况下C语言中sizeof 和 strlen的区别,算是个人经验的一个小小的总结,如有遗漏还请大家告知。 1、编译时计算运算符sizeof,可用类型或变量做参数,计算占用内存的大小。sizeof后若是类型必须加括弧,若是变量名可不加括弧。sizeof(x)可用来定义数组维数如:printf("%d\n", sizeof(short));输出的结果为短整型的长度2。用结构类转载 2016-06-13 09:38:26 · 505 阅读 · 0 评论 -
C语言 --- 结构体
什么是结构体例如定义的整型变量a,b,c,它们是单独存在的变量,在内存中的地址也是互不相干,而结构体(structre)是有不同类型数据组成的组合型的数据结构。声明一个结构体类型的一般形式为对各成员进行类型声明的一般形式为例:为了能在程序中使用结构体类型的数据,所以要定义结构体类型的变量,并在其中存放具体的变量。有以下三种方法:1:先声明结构体的原创 2015-02-03 17:06:32 · 871 阅读 · 0 评论 -
C++中的数学函数汇总
math.h 数学函数库,一些数学计算的公式的具体实现是放在math.h里,具体有: 1 三角函数 double sin (double); double cos (double); double tan (double); 2 反三角函数 double asin (double); 结果介于[-PI/2, PI/2] double acos (double); 结果介于[0, PI]转载 2016-07-07 15:37:15 · 1308 阅读 · 0 评论 -
C++指针详解
前言 初学者对于指针往往云里雾里,对照课本看了半天,知道课本在说什么,以为是懂了,可到了真要用的时候,还是不懂。遇见具体的程序,分析不出个所以然。 根据我的学习经验,造成这种现象的原因在于指针涉及到的概念很多,不同的概念之间极易混淆,还有指针的输出不够直观,按常理讲,我们在打印的时候,打印出的是什么,我们便以为这个东西是什么,然而对于指针来说,这种规律却不适用,眼睛看到的东西不是真的,自然不能得原创 2016-06-21 17:14:49 · 440 阅读 · 0 评论 -
new内存失败后的正确处理
应该有很多的程序员对比尔盖茨的这句话有所耳闻:对于任何一个人而言,640KB应当是足够的了。(640K ought to be enough for everybody.)不幸的是,伟大的比尔盖茨也失言了。随着硬件水平的发展,内存变得越来越大,但是似乎仍不能满足人们对内存日益增长的需求。所以呢,我们C/C++程序员在写程序时也必须考虑一下内存申请失败时的处理方式。通常,我们在使用new进行内存分配的转载 2016-05-21 14:41:35 · 991 阅读 · 0 评论 -
虚拟函数是否应该被声明仅为private/protected?
问题导入 我想对于大家来说,虚拟函数并不能算是个陌生的概念吧。至于怎么样使用它,大部分人都会告诉我:通过在子类中重写(override)基类中的虚拟函数,就可以达到OO中的一个重要特性——多态(polymorphism)。不错,虚拟函数的作用也正是如此。但如果我要你说一说虚拟函数被声明为public和被声明为private/protected之间的区别的话,你又是否还能象先前一样肯定地告诉我答案呢转载 2016-08-25 09:06:25 · 1444 阅读 · 0 评论 -
C/C++ static关键字
在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。(1)先来介绍它的第一条也是最重要的一条:隐藏。 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。 下面是a.c的内容char a = 'A'; // global variablevoid m......原创 2016-01-08 21:19:46 · 19000 阅读 · 0 评论 -
C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法
有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同。这些特殊的类型的成员变量包括:a.引用 b.常量 c.静态 d.静态常量(整型) e.静态常量(非整型)常量和引用,必须通过参数列表进行初始化。 静态成员变量的初始化也颇有点特别,是在类外初始化且不能再带有static关键字,其本质见文末。参考下面的代码以及其中注释:#include <iostream转载 2016-09-07 16:56:16 · 285 阅读 · 0 评论 -
C语言数据类型及相关运算
C 语言包含的数据类型如下图所示:short、int、long、char、float、double 这六个关键字代表C 语言里的六种基本数据类型,分配的字节数分别为2,2或4,1 ,4 ,4 ,8。不行类型数据间的混合运算:C语言中进行浮点数的算术运算时,都将float型数据转换为double型,然后进行运算,法float型数据与int型或double型数据运算时,结果为d原创 2015-02-03 16:53:08 · 1177 阅读 · 0 评论