
C++
文章平均质量分 74
鹅厂程序小哥
与你一起写程序 | 知乎:鹅厂程序小哥 | 微信公众号:鹅厂程序小哥
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++用new和不使用new创建对象的区别
一、new创建类对象与不new区别new创建类对象需要指针接收 new创建类对象使用完需delete销毁 new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间 new对象指针用途广泛,比如作为函数返回值、函数参数等 频繁调用场合并不适合new,就像new申请和释放内存一样二、new创建对象实例1. 使用new创建对象CTest* pTest = new CTest();delete pTest;pTest是用来接收类的对象指针。new申请的对象,则只..原创 2021-04-06 14:50:58 · 2081 阅读 · 1 评论 -
内联函数代替带参数的宏
使用宏的一个经典例子是求一个数的平方,如下所示:#include <iostream>using namespace std;#define SQ(y) y*yint main() { int n = 9; int sq = 0; sq = SQ(n); cout << sq << endl; getchar(); return...转载 2019-03-30 19:57:55 · 360 阅读 · 1 评论 -
C++突破private访问权限的黑科技
如何突破class的private属性限制——试图破坏class的封装性,有点“逆天而行”的感觉。方法1. 添加友元函数#include<iostream>using namespace std;class X{private: int m_Age;public: X() : m_Age(1){} template<typename T> ...原创 2019-04-04 17:19:57 · 799 阅读 · 0 评论 -
C++模板特化
模板特化1.模板特化的定义模板特化不同于模板的实例化,模板参数在某种特定类型下的具体实现称为模板的特化。模板特化有时也称之为模板的具体化,分别有函数模板特化和类模板特化。template<> 返回值类型 函数名(形参列表){ //在函数体中可以使用类型参数}2.函数模板特化函数模板特化是在一个统一的函数模板不能在所有类型实例下正常工作时,需要定义类型参...原创 2019-04-05 17:04:57 · 365 阅读 · 0 评论 -
C++模板实例化
模板的实例化指函数模板(类模板)生成模板函数(模板类)的过程。对于函数模板而言,模板实例化之后,会生成一个真正的函数。而类模板经过实例化之后,只是完成了类的定义,模板类的成员函数需要到调用时才会被初始化。模板的实例化分为隐式实例化和显示实例化。对函数模板的使用而言,分为两种调用方式,一种是显示模板实参调用(显示调用),一种是隐式模板实参调用(隐式调用)。对于类模板的使用而言,没有隐式模板实...原创 2019-04-05 18:00:34 · 861 阅读 · 0 评论 -
【C语言】整数,浮点数在内存中是如何存储的
整数在内存中的存储整型数就是通常使用的整数,分为无符号整数和带符号整数两大类。整型数在内存中是以二进制形式存放的,实际上,数值是以补码的形式表示的。在机器中用最高位表示数的符号,正数符号用“0”表示,负数符号用“1”表示。这里根据设备平台不同,大小端介绍,一般PC都是小端字节序:大端:数据的低字节存在高地址处。小端:数据的低字节存在低地址处。原码、反码、补码原码、反...原创 2019-04-05 21:56:42 · 1433 阅读 · 0 评论 -
五大常用算法--回溯算法
回溯算法的基本思想 回溯法采用深度优先方法搜索遍历问题的解空间树,可以看作是蛮力法穷举搜索的改进。先判断该节点对应的部分是否是满足约束条件,也就是判断该节点是否包含问题的最优解。如果肯定不包含,则跳过对该节点为根的子树的搜索,即所谓的剪枝;否则,进入该节点为根的子树,继续按照深度优先策略搜索。回溯法常常可以避免搜索所有可能的解,所以,适用于求解组合数组较大的问题。 ...转载 2019-04-21 17:09:37 · 900 阅读 · 0 评论 -
Lua和C++交互:全局数组交互
Lua数组①数组是key值从1开始并连续递增的table。②索引号是从1开始,不是从0开始。lua还提供了一些只针对数组进行操作的API,如下:①LUALIB_API lua_Integer (luaL_len) (lua_State *L, int idx);luaL_len 使用于数组,可得到数组元素个数;以数字形式返回给定索引处值的“长度”; 它等价于在 Lua...原创 2019-03-21 14:16:19 · 1358 阅读 · 0 评论 -
五大常用算法--分支限界算法
分支限界法的基本思想 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。 此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一...转载 2019-04-21 22:37:24 · 1178 阅读 · 0 评论 -
【最详细易懂】C++和Lua交互总结
一、Lua与C++的交互机制——Lua堆栈Lua和C++ 的交互机制的基础在于Lua提供了一个虚拟栈,C++ 和Lua之间的所有类型的数据交换都通过这个栈完成。无论何时C++想从Lua中调用一个值,被请求的值将会被压入栈,无论何时C++想要传递一个值给Lua,首先将整个值压栈,然后就可以在Lua中调用。Lua中,对虚拟栈提供正向索引和反向索引两种索引方式,区别是:正数索引1永远表示栈底,...原创 2019-03-17 22:06:34 · 12547 阅读 · 6 评论 -
C++智能指针 auto_ptr、shared_ptr、weak_ptr和unique_ptr
一、auto_ptr auto_ptr这是C++98标准下的智能指针,现在常常已经被C++标准的其他智能指针取代。它的缺点是在转移所有权后会使运行期不安全。C++11新标准,用unique_ptr来代替auto_ptr原有功能。auto_ptr <double> pd;double *p_reg = new double;pd = p_reg; // 不允许pd = ...原创 2019-04-24 22:38:56 · 299 阅读 · 0 评论 -
C++11右值引用和移动构造函数详解
对象的拷贝控制C++11之前,对象的拷贝控制由三个函数决定:拷贝构造函数(Copy Constructor)、拷贝赋值运算符(CopyAssignment operator)和析构函数(Destructor)。C++11之后,新增加了两个函数:移动构造函数(Move Constructor)和移动赋值运算符(Move Assignment operator)。构造函数与赋值运算...原创 2019-04-25 00:02:48 · 3178 阅读 · 3 评论 -
C++引用与指针的区别
从概念上讲指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。在C++中,指针和引用经常用于函数的参数传递然而,指针传递参数和引...原创 2019-05-06 14:15:33 · 214 阅读 · 0 评论 -
C++四种类型转换
面试题:C++有多少种cast,它们的名称和功能各是什么。一种四种。static_cast 如整型和浮点型、字符型之间的互相转换,void 指针和具体类型指针之间的转换,例如void *转int *、char *转void *等;const_cast 运算符仅用于进行去除 const属性或 volatile 修饰 属性的转换reinterpret_cast 用于进行各种不同类型的指...原创 2019-05-06 15:32:03 · 269 阅读 · 0 评论 -
C++volatile关键字
volatile有什么含义?有什么用法?官方定义是:一个变量也许会被后台程序改变。关键字volatile与const绝对独立。它指示一个变量也许会被某种方式修改,这种方式按照正常程序流程分析是无法预知的(例如,一个变量也许会被一个中断服务程序所修改)。这个关键字使用以下语法定义:volatile data;注:变量如果加了voletile修饰,则会从内存中重新装载内容,而不是...原创 2019-05-17 17:34:33 · 281 阅读 · 0 评论 -
剑指offer:不用加减乘除做加法
题目:写一个函数,求两个数的和,不能使用加减乘除四则运算符。#include <iostream>using namespace std;int Add(int num1, int num2){ int sum, carry; do { sum = num1 ^ num2; carry = (num1 & num2) << 1; n...原创 2019-06-03 21:40:58 · 274 阅读 · 0 评论 -
C++类的内存分布
这里说下C++内存分布结构,我们来看看编译器是怎么处理类成员内存分布的,特别是在继承、虚函数存在的情况下。工欲善其事,必先利其器,我们先用好Visual Studio工具,像下面这样一步一步来:先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存布局,如果写上/d1 reportSin...转载 2019-03-30 19:23:30 · 834 阅读 · 0 评论 -
C++中的继承
C++中的继承方式有:public、private、protected三种:(1)public(公有继承):继承时保持基类中各成员属性不变,并且基类中private成员被隐藏。派生类的成员只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象只能访问基类中的public成员。(2)private(私有继承):继承时基类的public成员和pro...原创 2019-03-30 17:57:30 · 185 阅读 · 0 评论 -
为什么C++的构造函数不可以是虚函数,而析构函数可以是虚函数
1、为什么构造函数不可以是虚函数①从存储空间角度虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。②从使用角度 虚函数的作用在于通过父类的指针或者引用来调用它的时候能...原创 2019-03-30 17:06:07 · 806 阅读 · 0 评论 -
C++ const用法
C++const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。1.const 修饰变量#include<iostream>using namespace std;int main(){ int a1=3; ///non-const...原创 2019-03-19 22:52:34 · 310 阅读 · 0 评论 -
理解 __declspec(dllexport)和__declspec(dllimport)
1、解决的问题: 考虑下面的需求,使用一个方法,一个是提供者,一个是使用者,二者之间的接口是头文件。头文件中声明了方法,在提供者那里方法应该被声明为__declspec(dllexport),在使用者那里,方法应该被声明为__declspec(dllimport)。二者使用同一个头文件,作为接口,怎么办呢?2、解决办法: 使用条件编译:定义一个变量,针对提供者和使用者,设置不同的值...转载 2019-03-20 10:19:46 · 613 阅读 · 1 评论 -
Lua中的userdata
userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 、指针和类)存储到 Lua 变量中调用。userdata分为两类,”full userdata”和”light userdata”。 full userdata light userdata 定义 ...原创 2019-03-20 11:03:08 · 6792 阅读 · 0 评论 -
32位系统和64位系统,常用数据类型对应字节数
一)64位系统和32位有什么区别?1、64bit CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存2、64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能会提升1倍。但这是建立在64bit操作系统,64bit软件的基础上的。什么是64位处理器?之所以叫做“64位处理器”,是因为电脑内部都是实行2进制运算,处理器(CPU)一次处理数据的能力...转载 2019-03-12 15:17:48 · 1789 阅读 · 0 评论 -
sizeof(struct)和sizeof(union)的结果分析及其原因
一个错误有的时候,在脑海中停顿了很久的“显而易见”的东西,其实根本上就是错误的。就拿下面的问题来看:struct T{ char ch; int i;};使用sizeof(T),将得到什么样的答案呢?要是以前,想都不用想,在32位机中,int是4个字节,char是1个字节,所以T一共是5个字节。实践出真知,在VS中测试了下,答案是8个字节。再来一个例子:un...原创 2019-03-12 15:47:11 · 1574 阅读 · 0 评论 -
C++多态性
虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。虚函数 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到基类中定义的函数。我们想要的是在程序运行时可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态多态,或动态链接,或后期绑定。 ...原创 2019-03-12 16:41:09 · 189 阅读 · 0 评论 -
Lua和C++交互:在Lua中以面向对象的方式使用C++注册的类
这篇文章,属于Lua和C++交互的子篇章。总篇章地址:https://blog.youkuaiyun.com/qq826364410/article/details/88624824在Lua中以面向对象的方式使用C++注册的类Lua中面向对象的方式①新建创建对象函数,调用lua_newuserdata,创建一个对象指针,指向new出来的新的对象。得到注册成员方法时,创建的元表StudentClas...原创 2019-03-18 23:02:26 · 2875 阅读 · 1 评论 -
Lua和C++交互:Lua调用C++类注册生成的Lua模块
这篇文章,属于Lua和C++交互的子篇章。总篇章地址:https://blog.youkuaiyun.com/qq826364410/article/details/88624824Lua调用C++类注册生成的Lua模块①新建创建对象函数,调用lua_newuserdata,创建一个对象指针,指向new出来的新的对象。②新建成员方法,调用lua_touserdata,得到从lua中传入的对象...原创 2019-03-19 16:39:36 · 4548 阅读 · 0 评论 -
C++ 函数指针
1.函数指针1.1 声明int* f(int a, int b);1.2 示例#include<iostream>int max(int a, int b) { return a > b ? a : b; } int min(int a, int b) { return a < b ? a : b; } int (*f)(...原创 2019-03-29 17:24:58 · 160 阅读 · 0 评论 -
C++函数调用约定(calling convention)
函数调用约定告诉编译器用于建栈,参数压栈以及获得返回值的规则。下面的函数调用约定,那个支持参数长度可变(比如printf)?A. __cdeclB. __stdcallC. __pascalD. __fastcall答案:A所有非C++成员函数和那些没有用__stdcall或__fastcall声明的函数都默认是__cdecl方式,它使用C函数调用方式,函数参...原创 2019-03-29 21:32:59 · 858 阅读 · 0 评论 -
C++函数编译原理和成员函数的实现
对象的内存中只保留了成员变量,除此之外没有任何其他信息,程序运行时不知道 stu 的类型为 Student,也不知道它还有四个成员函数 setname()、setage()、setscore()、show(),C++ 究竟是如何通过对象调用成员函数的呢?C++函数的编译C++和C语言的编译方式不同。C语言中的函数在编译时名字不变,或者只是简单的加一个下划线_(不同的编译器有不同的实现),...原创 2019-03-29 21:41:12 · 3203 阅读 · 3 评论 -
内存分页机制
为什么要分页在保护模式中,内存访问使用分段机制——即"段基址:段内偏移地址"的方式,为加强段内存的安全性和可管理性还引入了段描述符的概念对段内存加强管理。但仅仅这样还是不够的,如果应用程序过多,或者内存碎片过多,又或者曾经被换出到硬盘的内存段需要再重新装载到内存,可内存中找不到合适大小的区域,要如何解决?内存置换当下大部分操作系统的方案是,将一些进程不常用的内存段换出到硬盘中,腾出...转载 2019-03-29 22:23:14 · 188 阅读 · 0 评论 -
C/C++语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针
C/C++语言堆内存管理上出现的问题(1)开辟的内存没有释放,造成内存泄露(2)野指针被使用或释放(3)非法释放指针(1)开辟的内存没有释放。造成内存泄露,以下的样例就可能造成20个字节的泄露,内存泄露不是一个马上会引发故障的错误,可是它将消耗系统内存。void function1(){ char *pa; pa = (char*)malloc(s...转载 2019-03-29 22:40:58 · 326 阅读 · 0 评论 -
栈区,堆区,全局静态区,常量区,代码区
内存区域一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。3、全局区(静态区)(static):全局变量和静态变...原创 2019-03-29 23:36:07 · 791 阅读 · 0 评论 -
函数调用堆栈的过程
程序在执行一个函数之前需要做一些准备工作,要将形参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能执行函数体中的代码;函数体中的代码执行完毕后还要清理现场,将之前压入栈中的数据都出栈,才能接着执行函数调用位置以后的代码。通过下面一个简单的例子来进入话题:#include<stdio.h>int sum(int a,int b){ int tmp=0; tm...原创 2019-03-30 00:54:35 · 617 阅读 · 0 评论 -
C++ replace() 函数用法
replace算法: replace函数包含于头文件#include<string>中。 泛型算法replace把队列中与给定值相等的所有值替换为另一个值,整个队列都被扫描,即此算法的各个版本都在 线性时间内执行———其复杂度为O(n)。 即replace的执行要遍历由区间[fri...转载 2019-02-21 16:15:24 · 1852 阅读 · 0 评论