C++相关
文章平均质量分 96
C++ 相关的知识总结
ShaderJoy
醉心于研究一些特效(用代码来画画),曾涉猎过图形图像视频处理 、计算机视觉 、增强现实/虚拟现实等技术领域,就职于美图。
展开
-
【转载】想看懂WebRtc,你须知道的C++11新特性「lambda,std::function以及std:bind」
转载自https://cloud.tencent.com/developer/article/1608796C++11 中增加了许多的新特性。在本文中,我们来聊一下 lambda 表达式,闭包,std::function以及std::bind。lambda 表达式C++11 中新增了 lambda 表达式这一语言特性。lambda 表达式可以让我们快速和便捷的创建一个 “函数”。下面是lambda表达式的语法:[ capture-list ] { body } [ capture.转载 2020-12-04 11:26:03 · 1157 阅读 · 0 评论 -
基础备忘:typedef和define具体的详细区别
1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。例如:#define PI 3.1415926程序中的:area=PI*r*r 会替换为3.1415926*r*r如果你把#define语句中的数字9 写成字母g 预处理也照样带入。2)typedef是在编译时处理的。它在自己的作转载 2016-09-06 20:39:34 · 1225 阅读 · 0 评论 -
基础备忘:C++ 隐式类类型转换
《C++ Primer》中提到:“可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换。”这里应该注意的是, “可以用单个形参进行调用” 并不是指构造函数只能有一个形参,而是它可以有多个形参,但那些形参都是有默认实参的。那么,什么是“隐式转换”呢? 上面这句话也说了,是从 构造函数形参类型 到 该类类型 的一个编译器的自动转换。下面通过转载 2016-09-07 14:29:35 · 1291 阅读 · 0 评论 -
C++编译器合成默认构造函数的真相
阅读目录正文2.基类带有默认构造函数的派生类。3. 带有虚函数的类 4.带有虚基类的类什么是默认构造函数?默认构造函数什么时候被调用?理解“被需要”这三个字 何时默认构造函数才会被编译器需要?总结 正文 对于C++默认构造函数,我曾经有两点误解:类如果没有定义任何的构造函数,那么编译器(一定会!)将为类定义一个合成的默认转载 2016-09-07 15:04:24 · 1368 阅读 · 0 评论 -
基础备忘:多态基类与虚析构函数
假设我们有一个基类A,很不幸的,A的析构函数是一个non-virtual。同时我们有一个派生类B,它派生自A。我们定义了一个A类型指针,它指向的实际对象是B:A * ptr = new B;然后在程序的某处,我们不再需要B了,我们将指针ptr delete掉:delete ptr;注意new永远要和delete成队出现,除非你使用智能指针。这时由于A的析转载 2016-09-07 15:28:17 · 1206 阅读 · 0 评论 -
基础备忘:static关键字总结
static,即静态声明。它在 作用域、存储方式、生命周期 等各方面影响一个变量或函数。文章将从 局部变量、全局变量、普通函数、类的static成员(包括数据成员与成员函数)来总结static。全局变量 所有的全局变量,无论是否是static的,都是存储于静态存储区的。全局变量本身就是静态存储方式,将全局变量声明为static是为了将变量的作用域限制在本翻译单元中(本源文件转载 2016-09-07 15:35:00 · 1178 阅读 · 0 评论 -
基础备忘:关于传值与传引用的讨论
阅读目录效率问题对象的切割问题STL中的使用情况 正文回到顶部效率问题对于用户自定义的类型来说,传引用一般要比传值高效。传引用不需要经过对象过程,在《Effective C++》中作者举了个例子:class Base{ pubilc: Base(); ~Base(转载 2016-09-07 15:39:14 · 1322 阅读 · 0 评论 -
c++的STL模板库中3种容器类:vector,list,deque的比较
c++的STL模板库中提供了3种容器类:vector,list,deque对于这三种容器,在觉得好用的同时,经常会让我们困惑应该选择哪一种来实现我们的逻辑。在少量数据操作的程序中随便哪一种用起来感觉差别并不是很大,但是当数据达到一定数量后,会明显感觉性能上有很大差异。本文就试图从介绍,以及性能比较两个方面来讨论这个问题。 vector - 会自动增长的数组lis转载 2013-03-01 12:53:45 · 2059 阅读 · 0 评论 -
c++ 中头文件重复包含的问题
一、同一头文件中类嵌套的疑问假设我们有两个类A和B,分别定义在各自的头文件A.h和B.h中,但是在A中要用到B,B中也要用到A,像下面的写法是错误的:class B;class A{ public: B b;};class B{ public: A a;};因为在A对象中要开辟一块属于B的空间,转载 2013-11-08 11:15:08 · 2258 阅读 · 0 评论 -
C++智能指针:TR1的 shared_ptr 和 weak_ptr 使用介绍
(所有示例的运行,将#序号所在main()函数去掉序号即可,参考[url]http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15361/[/url])get() 返回对象指针use_count() 返回对象的引用计数#include #include #include #include /** shared转载 2016-09-08 16:07:04 · 1721 阅读 · 0 评论 -
基础备忘:STL中的map详解
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有转载 2013-02-28 01:03:11 · 1408 阅读 · 0 评论 -
基础备忘:C++编译期多态与运行期多态
阅读目录前言运行期多态编译期多态运行期多态与编译期多态优缺点分析运行期多态优点运行期多态缺点编译期多态缺点关于显式接口与隐式接口 正文回到顶部前言今日的C++不再是个单纯的“带类的C”语言,它已经发展成为一个多种次语言所组成的语言集合,其中泛型编程与基于它的STL是C++发展中最为出彩的那部分。在面向对象C++编程中,多态是OO三大特转载 2016-09-07 14:13:29 · 1306 阅读 · 0 评论 -
基础备忘:类的成员初始化表与构造函数内赋值操作
我们常常在初始化类数据成员的时候,对使用初始化表和在构造函数中十分困惑,这二者有什么区别呢?我们应该如何选择呢?先举个简单的例子,看下面的两段代码:代码A:[cpp] view plain copy print?inline Account::Account(const char* name,doubl opening_bal转载 2016-09-07 12:06:55 · 1238 阅读 · 0 评论 -
do{...}while(0)的意义和用法
转载自 http://www.spongeliu.com/ linux内核和其他一些开源的代码中,经常会遇到这样的代码:do{ ...}while(0)这样的代码一看就不是一个循环,do..while表面上在这里一点意义都没有,那么为什么要这么用呢?实际上,do{...}while(0)的作用远大于美化你的代码。查了些资料,总结起来这样写主要有以下几点好处:1、辅助定义复...转载 2018-12-20 14:05:02 · 1059 阅读 · 0 评论 -
C 语言高效编程与代码优化
在本篇文章中,我收集了很多经验和方法。应用这些经验和方法,可以帮助我们从执行速度和内存使用等方面来优化C语言代码。简介在最近的一个项目中,我们需要开发一个运行在移动设备上但不保证图像高质量的轻量级JPEG库。期间,我总结了一些让程序运行更快的方法。在本篇文章中,我收集了一些经验和方法。应用这些经验和方法,可以帮助我们从执行速度和内存使用等方面来优化C语言代码。尽管在C代码优化方面有很多...转载 2017-02-22 15:04:52 · 1324 阅读 · 0 评论 -
经典基础C++笔试题2(附答案)
1. C中static有什么作用?(1)隐藏。 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,故使用static在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。(2)static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和sta原创 2013-05-15 20:30:12 · 4868 阅读 · 0 评论 -
经典基础C++笔试题(附答案)
一、选择题1. 若用数组名作为函数调用时的实参,则实际上传递给形参的是( A )A. 数组首地址B. 数组的第一个元素值C. 数组中全部元素的值D. 数组元素的个数2. 有关函数重载的正确说法是( B )A. 函数名不同,但参数的个数和类型相同B. 函数名相同,但参数的个数不同或参数的类型不同C. 函数名相同,参数的个数和类型相同D. 函数名相同,函数的返回原创 2013-05-15 16:08:30 · 5749 阅读 · 0 评论 -
【c++强制类型转换】:dynamic_cast、const_cast 、static_cast、reinterpret_cast
zongsdynamic_cast: 通常在基类和派生类之间转换时使用,run-time castconst_cast: 主要针对const和volatile的转换. static_cast: 一般的转换,no run-time check.通常,如果你不知道该用哪个,就用这个。 reinterpret_cast: 用于进行没有任何关联之间的转载 2014-04-22 17:39:19 · 2526 阅读 · 0 评论 -
深入理解C++的动态绑定和静态绑定
为了支持c++的多态性,才用了动态绑定和静态绑定。理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误,需要理解四个名词:1、对象的静态类型:对象在声明时采用的类型。是在编译期确定的。2、对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态类型可以更改,但是静态类型无法更改。关于对象的静态类型和动态类型,看一个示例:class B{}cl转载 2013-11-08 11:26:21 · 1656 阅读 · 2 评论 -
基础备忘:拷贝构造函数和赋值函数
3.1 拷贝构造函数概述现在我们来学习一种特殊的构造函数——拷贝构造函数。对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int b =a; 自己定义的类的对象同样是对象,谁也不能阻止我们用以下的方式进行复制,例如:#include using namespace std; class Test { int p;转载 2016-09-06 19:26:56 · 1206 阅读 · 0 评论 -
C++11特性:auto 关键字
阅读目录C++98 autoC++11 autoauto的用法注意事项 正文前言本文的内容已经不新鲜了。关于auto,翻来覆去被人知道的都是这些东西,本文并没有提出新颖的auto用法。本人原是痛恨博客一篇篇都是copy而来缺乏新意的探索,当然,本文不是copy而来,但发布这样一篇大家皆知的文章心里甚是惶恐。本文对auto的内容加以整理,权当是自己转载 2016-09-08 11:25:28 · 1347 阅读 · 0 评论 -
一道简单的题目引发的思考
引言昨晚一时兴起,我脑子就问自己下面的代码会输出什么,也不知道我脑子为什么有这个代码模型,只是模糊的有些印象:12345678910#include #include int main(int argc,char** argv)转载 2016-09-08 00:55:40 · 1346 阅读 · 0 评论 -
图说C++对象模型:对象内存布局详解
阅读目录0.前言1.何为C++对象模型?2.文章内容简介3.理解虚函数表3.1.多态与虚表3.2.使用指针访问虚表4.对象模型概述4.1.简单对象模型4.2.表格驱动模型4.3.非继承下的C++对象模型5.继承下的C++对象模型5.1.单继承5.2.多继承6.虚继承6.1.虚基类表解析6.2.简单虚继承6.3.虚拟菱形继承7.一些问题解答转载 2016-09-08 00:28:30 · 1888 阅读 · 0 评论 -
漫谈C++:良好的编程习惯与编程要点【2】
转自:melonstreetstatic与类① 不和对象直接相关的数据,声明为static想象有一个银行账户的类,每个人都可以开银行账户。存在银行利率这个成员变量,它不应该属于对象,而应该属于银行这个类,由所有的用户来共享。static修饰成员变量时,该成员变量放在程序的全局区中,整个程序运行过程中只有该成员变量的一份副本。而普通的成员变量存在每个对象的内存中,若把银行利率放在每个对象...转载 2016-07-01 00:32:24 · 1354 阅读 · 0 评论 -
漫谈C++:良好的编程习惯与编程要点【0】
转自:melonstreet正文 以良好的方式编写C++ class假设现在我们要实现一个复数类complex,在类的实现过程中探索良好的编程习惯。 ① Header(头文件)中的防卫式声明 complex.h: # ifndef __COMPLEX__# define __COMPLEX__class complex{ }# endif...转载 2016-07-01 00:04:23 · 1322 阅读 · 0 评论 -
名字修饰约定extern "C"与extern "C++"浅析
转载自:BeanJoy的专栏所谓名字修饰约定,就是指变量名、函数名等经过编译后重新输出名称的规则。 比如源代码中函数名称为int Func(int a,int b),经过编译后名称可能为?Func@@YAHHH@Z、?Func@@YGHHH@Z、_Func@8,也有可能与源代码中名称相同为Func。 影响编译后输出的名称通常与名字修饰约定(extern "C"、ex转载 2016-06-30 01:09:53 · 1212 阅读 · 0 评论 -
关于__stdcall和__cdecl调用方式的理解
转自BeanJoy的专栏__stdcall和__cdecl都是函数调用约定关键字,先给出这两者的区别,然后举实例分析: __stdcall:参数由右向左压入堆栈;堆栈由函数本身清理。 __cdecl:参数也是由右向左压入堆栈;但堆栈由调用者清理。 另外,这两者在同一名字修饰约定下,编译过后变量和函数的名字也不一样,具体见另一博文:名字修饰约定exter转载 2016-06-30 00:58:51 · 1312 阅读 · 0 评论 -
向普通函数传递类成员函数指针的问题
成员函数func3=>成员函数func2:将一个类成员函数的函数指针传递给另一个成员函数是比较简单的,只要定义一个函数指针就可以轻松实现。示例如下:#include using namespace std;class test{public: typedef void (test::*pFUN)(); void func1() { func2(&test::func3转载 2013-09-25 15:00:12 · 2386 阅读 · 0 评论 -
基础备忘:vector 用法
注意,在使用前要包含vector对应的头文件:#includevector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。和string对象一样,标准库负责管理存储元素的相关内存。我们把vector称为容器,是因为它可以包 含其他对象。一个容器中的所有对象都必须是同一种类型的。我们将在第9章更详细地介绍容器。 使用vector之前,必须包含相应的头文件。本书给出转载 2013-02-27 21:57:55 · 1595 阅读 · 0 评论 -
引用作为返回值的注意事项
函数返回值时,要生成一个值的副本。而用引用返回值时,不生成值的副本。 例如,下面的程序是有关引用返回的4种形式:#include float temp; float fn1(float r) { temp = r*r*3.14; return temp; } float& fn2(float r) {转载 2013-09-12 20:46:58 · 1928 阅读 · 0 评论 -
面试题:类型转换与优先级问题
这个问题是在论坛发帖,网友帮助我解决的..原帖:http://topic.csdn.net/u/20081224/00/ceda111c-41ab-447d-be87-b346cd99b97f.html 原文如下:本人遇到一对面试题: #include using namespace std; int main() { unsigned char a转载 2013-04-15 15:32:04 · 1733 阅读 · 0 评论 -
基础备忘之c++内存分布:代码段、全局数据区、栈、堆
声明两点:(1)开发测试环境为VS2010+WindowsXP32位;(2)内存布局指的是虚拟内存地址,不是物理地址。1.测试代码#include using namespace std; int g_int_a; int g_int_b; void f_1() { cout<<"I'm f_1"<<endl; } vo转载 2013-02-28 15:56:31 · 1965 阅读 · 2 评论 -
漫谈C++:良好的编程习惯与编程要点【1】
转载:melonstreet带有指针数据成员的类:记得写三大件(拷贝构造函数、拷贝赋值函数、析构函数)C++的类可以分为带指针数据成员与不带指针数据成员两类,complex就属于不带指针成员的类。而这里要说的字符串类String,一般的实现会带有一个char *指针。带指针数据成员的类,需要自己实现class三大件:拷贝构造函数、拷贝赋值函数、析构函数。class String{...转载 2016-07-01 00:22:26 · 1487 阅读 · 0 评论 -
基础备忘:字符串的输入输出
字符串输入:gets() :char name[20];printf("Hi,What's your name?/n");gets(name);printf("Nice name %s",name);//它使用一个地址把字符串赋予namechar name[20];char *p;printf("/nEn,What's your name?/n");转载 2013-02-28 12:56:12 · 1524 阅读 · 0 评论 -
基础备忘:C++类静态成员与类静态成员函数详解
静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关。静态方法就是与该类转载 2016-09-06 14:51:58 · 1301 阅读 · 0 评论 -
C++ 引用计数技术及智能指针的简单实现
阅读目录1.智能指针是什么2.普通指针存在的问题3.什么是引用计数4.智能指针实现4.1.基础对象类4.2.辅助类4.3.为基础对象类实现智能指针类4.4.智能指针类的使用与测试5.智能指针类的改进一6.智能指针改进二 正文一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧)。最近花了点时间认真看了智能指针,特转载 2016-09-07 21:56:43 · 1413 阅读 · 0 评论 -
基础备忘:智能指针小分析
阅读目录我们为什么需要智能指针智能指针具体是什么智能指针的实现原理为什么要摒弃auto_ptrweak_ptr有何作用 正文回到顶部我们为什么需要智能指针所谓资源就是,一旦用了它,将来必须还给系统。C++中内存资源的动态分配经由new与delete实现。问题在于,无论是有意无意,我们有时候总会忘记释放内存中的资源。例如delete语句出现在某个循转载 2016-09-07 15:46:56 · 1254 阅读 · 0 评论 -
基础备忘:C++ 自由存储区是否等价于堆?
阅读目录“free store” VS “heap”问题的来源结论参考资料 正文回到顶部“free store” VS “heap”当我问你C++的内存布局时,你大概会回答:“在C++中,内存区分为5个区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区”。如果我接着问你自由存储区与堆有什么区别,你或许这样回答:转载 2016-09-07 14:42:30 · 1204 阅读 · 0 评论 -
基础备忘:C++内联函数
阅读目录什么是内联函数如何使函数内联为什么要使用内联函数inline函数的优缺点分析什么时候该使用内联函数 正文 在C语言中,我们使用宏定义函数这种借助编译器的优化技术来减少程序的执行时间,那么在C++中有没有相同的技术或者更好的实现方法呢?答案是有的,那就是内联函数。内联函数作为编译器优化手段的一种技术,在降低运行时间上非常有用。我们将从:什么转载 2016-09-07 14:36:26 · 1189 阅读 · 0 评论 -
基础备忘:细说new与malloc的10点区别
阅读目录前言new与malloc的10点区别1. 申请的内存所在位置2.返回类型安全性3.内存分配失败时的返回值4.是否需要指定内存大小5.是否调用构造函数/析构函数6.对数组的处理7.new与malloc是否可以相互调用8.是否可以被重载9. 能够直观地重新分配内存10. 客户处理内存分配不足总结 正文回到顶部前言几个星期前去面试C转载 2016-09-07 14:23:42 · 2062 阅读 · 0 评论