c++
鱼裸忧伤
这个作者很懒,什么都没留下…
展开
-
值初始化
定义顺序容器时只指定容器大小,没有显示提供初始化原创 2014-10-09 21:42:33 · 391 阅读 · 0 评论 -
C++/C宏定义中## 连接符与# 符的含义
C++/C宏定义中## 连接符与# 符的含义转自:1.http://blog.csdn.net/believefym/article/details/18361622.http://www.yunsec.net/a/school/ymbc/C/2009/1027/1243.html## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起转载 2015-06-25 21:35:22 · 434 阅读 · 0 评论 -
C++的常量
在介绍C++的常量前,先看下下面的代码。[cpp] view plaincopyprint?for (int i = 0; i …; } for (int i = 0; i < 512; ++i) { …;}512是什么,它具有什么含义?在代码中若直接使用类似512这些“魔数”(magic number),这些数字的具体含义就不能体现转载 2015-06-25 21:17:27 · 379 阅读 · 0 评论 -
C/C++中extern关键字详解
C/C++中extern关键字详解1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。 也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译转载 2015-06-24 16:08:27 · 303 阅读 · 0 评论 -
解析C中的sizeof和字节对齐
一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法 1、用于数据类型 sizeof转载 2015-09-11 19:46:08 · 730 阅读 · 0 评论 -
为什么在C++使用pthread_create()的时候,类成员函数做线程的处理函数必须要定义成static类型的?
今天在进行多线程编程的时候遇到了一个编译问题:error: argument of type ‘void (PIAMW::Communicator::)()’ does not match ‘void* (*)(void*)’后来发现将线程处理函数声明为static类型,问题得解。 其实这个原因很简单,当把线程函数封装在类中,this指针会作为默认的参数被传进函数中,从而和转载 2015-09-11 20:08:17 · 2487 阅读 · 0 评论 -
c++11 lambda函数及其用法
为什么需要lambda函数匿名函数是有函数体,没有函数名。匿名函数最常用的是作为回调函数的值。正因为有这样的需求,c++引入了lambda 函数,你可以在你的源码中内联一个lambda函数,这就使得创建快速的,一次性的函数变得简单了。代码位置:android8.1: frameworks/av/services/camera/libcameraservice/common/CameraP原创 2018-01-02 20:09:57 · 800 阅读 · 0 评论 -
【C++深入探索】Copy-and-swap idiom详解和实现安全自我赋值
任何管理某资源的类比如智能指针需要遵循一个规则(The Rule of Three):如果你需要显式地声明一下三者中的一个:析构函数、拷贝构造函数或者是拷贝赋值操作符,那么你需要显式的声明所有这三者。拷贝构造函数和析构函数实现起来比较容易,但是拷贝赋值操作符要复杂许多。它是怎么实现的?我们需要避免那些误区?那么Copy-and-swap就是完美的解决方案。而且可以很好地帮助拷贝赋值转载 2018-01-03 10:07:38 · 289 阅读 · 0 评论 -
C++左值与右值、左值引用与右值引用
C++ 11中引入的一个非常重要的概念就是右值引用。理解右值引用是学习“移动语义”(move semantics)的基础。而要理解右值引用,就必须先区分左值与右值。 对左值和右值的一个最常见的误解是:等号左边的就是左值,等号右边的就是右值。左值和右值都是针对表达式而言的,左值是指表达式结束后依然存在的持久对象,右值是指表达式结束时就不再存在的临时对象。一个区分左值与右值的便转载 2014-11-09 21:50:08 · 546 阅读 · 0 评论 -
new生成的动态对象初始化
①T *p =new T;②T *p =new T();这两类用法不同点的总结。 1.若T为类类型,且用户定义了构造函数,则两种形式的效果完全相同,都会调用这个定义了的构造函数来初始化内部成员变量,但是如果此构造函数中并未对成员变量初始化,则这个时候内部的成员变量进行默认初始化——值是未定义的。2.若T为类类型,但是用户并没有定义任何构造函数,则我们可以知道编译器会为该原创 2014-10-09 20:53:11 · 557 阅读 · 0 评论 -
c++11move语意理解
I find it easiest to understand move semantics with example code. Let's start with a very simple string class which only holds a pointer to a heap-allocated block of memory:#include #include clas转载 2018-01-03 15:33:04 · 232 阅读 · 0 评论 -
c++循环引用
虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我们使用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。// // main.cpp // test // // Created by 杜国超 on 17/9/9. // Copyright © 2017年 杜国超. All rights reserved. //转载 2018-01-03 19:45:27 · 1824 阅读 · 0 评论 -
C++11中智能指针的原理、使用、实现
目录理解智能指针的原理智能指针的使用智能指针的设计和实现1.智能指针的作用 C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的概念,方便管理堆内存。使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄转载 2018-01-03 19:54:28 · 392 阅读 · 0 评论 -
字节对齐
字节对齐的细节和编译器实现相关,一般而言,需要满足三个准则:1、结构体变量的首地址能够被其最宽基本类型成员的大小所整除。2、结构体每个成员相对于结构体首地址的偏移量都是其成员大小的整数倍,如有需要,编译器会在成员之间加上填充字节。3、结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员之后加上填充字节。原创 2015-06-25 22:51:02 · 332 阅读 · 0 评论 -
exit与atexit
1. exit()函数:void exit(int state);用于在程序运行的过程中随时结束程序,exit的参数state是返回给操作系统,返回0表示程序正常结束,非0表示程序非正常结束。 一个函数中都可以调用exit(),main函数结束时也会隐式地调用exit函数。exit()函数工作过程: 首先会执行由atexit()函数登记的转载 2015-06-25 20:23:04 · 338 阅读 · 0 评论 -
动态类型识别RTTI与Dynamic_cast运算符
C++中的运行中动态类型识别RTTIRTTI综述 C++中的2个运算符支持RTTI,即Run Time Type Identification:typeid和dynamic_cast。 RTTI实现的基石是每个类型对应的一个const type_info类型对象,它存储了这个对象的确切类型信息。注意,一个类型对应一个type_info对象,而不是一个对象。无原创 2015-06-01 21:45:25 · 555 阅读 · 0 评论 -
合成的默认构造函数
由编译器创建的默认构造函数通常称为合成的默认构造函数,它将依据如同变量初始化的规则初始化类中所有成员。对于具有类类型的成员,如 isbn,则会调用该成员所属类自身的默认构造函数实现初始化。内置类型成员的初值依赖于对象如何定义。如果对象在全局作用域中定义(即不在任何函数中)或定义为静态局部对象,则这些成员将被初始化为 0。如果对象在局部作用域中定义,则这些成员没有初始化。除了原创 2014-10-09 22:00:24 · 756 阅读 · 0 评论 -
成员初始化列表
从概念上讲,可以认为构造函数分两个阶段执行:(1)初始化阶段;(2)普通的计算阶段。计算阶段由构造函数函数体中的所有语句组成。不管成员是否在构造函数初始化列表中显式初始化,类类型的数据成员总是在初始化阶段初始化。初始化发生在计算阶段开始之前。原创 2014-10-10 16:32:59 · 439 阅读 · 0 评论 -
静态数组与动态数组的区别
静态数组长度固定不变,在编译时必须知道其长度,数组只在定义它的块语句内存在原创 2014-10-09 21:04:09 · 12169 阅读 · 0 评论 -
私有构造函数与私有析构函数
私有析构函数:把析构函数声明为私有的,原创 2014-11-02 15:21:21 · 556 阅读 · 0 评论 -
C语言中文件操作
文件的基本概念 所谓“文件”是指一组相关数据的有序集合。 这个数据集有一个名称,叫做文件名。 实际上在前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、库文件 (头文件)等。文件通常是驻留在外部介质(如磁盘等)上的, 在使用时才调入内存中来。从不同的角度可对文件作不同的分类。从用户的角度看,文件可分为普通文件和设备文件两种。 普通文件是指驻留在转载 2014-12-04 19:13:48 · 646 阅读 · 0 评论 -
C++ function、bind以及lamda表达式
本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制。之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对这部分内容的理解。在开始之间,首先要讲一个概念,closure(闭包),这个概念是理解lambda的基础。下面我们来看看wikipedia上对于计算机领域的closure的定义:转载 2015-03-20 11:09:00 · 303 阅读 · 0 评论 -
C++中placement new
placement new是重载operator new的一个标准、全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本)。它的原型如下:void *operator new( size_t, void *p ) throw() { return p; } 首先我们区分下几个容易混淆的关键词:转载 2015-05-29 15:37:11 · 348 阅读 · 0 评论 -
C++中 explicit的用法
explicit 是避免构造函数的参数自动转换为类对象的标识符[cpp] view plaincopyprint?#include using namespace std; class A { public: explicit A(int a) { cout"创建类成功了!"转载 2015-05-29 16:33:06 · 314 阅读 · 0 评论 -
c++对数组的引用
所谓数组引用,即指向数组的引用;如 int a[10] ; int (&b)[10] = a ;如果写成 int a[10] ; int* &b = a ;将会报错: cannot convert from 'int [10]' to 'int *&'。 或许你会说在数组名不就是指向这个数组的一个指针转载 2015-05-29 21:39:15 · 372 阅读 · 0 评论 -
C++函数模板
C++函数模板基础知识:一. 问题:强类型语言要求我们为所有希望比较的类型都实现一个实例int min( int a, int b ) {return a }double min( double a, double b ) {return a }有一种方法可替代为每个min()实例都显式定义一个函数的方法这种方法很有吸引力但是也很危险.那就是用预转载 2015-05-29 21:24:52 · 359 阅读 · 0 评论 -
c++的auto_ptr
先给出一个使用c++的auto_ptr的完整的例子,后面的参考资料中给出原理性质的内容。一、举例/*功能:简单介绍c++中auto_ptr智能指针的使用。*使用auto_ptr(智能指针)可以自动管理内存,防止手工管理时候内存泄露的问题。它实际就是一个类型。*auto_ptr是一个模板类,这个类型的对象内部的析构函数完成对堆内存的释放,所以不要对这个对象转载 2015-06-01 20:49:35 · 323 阅读 · 0 评论