C-C++
文章平均质量分 72
SigalHu
热爱编程。。。。。
展开
-
C++之强制转换运算符[转]
原文:强制转换运算符强制转换运算符有几种特定于 C++ 语言的转换运算符。 这些运算符用于删除旧式 C 语言转换中的一些多义性和危险继承。 这些运算符是:dynamic_cast:用于多态类型的转换static_cast:用于非多态类型的转换const_cast:用于删除const、volatile和__unaligned特性reinterpret_cast:用于位的简单重新解释在万不得已转载 2017-06-17 16:47:42 · 1431 阅读 · 0 评论 -
memcpy与memmove区别和实现
memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。但当源内存和目标内存存在重叠时,memcpy不保证拷贝结果的正确,而memmove能正确地实施拷贝,但这也增加了一点点开销。memcpy的实现: 1. 当源内存的首地址等于目标内存的首地址时,不进行任何拷贝 2. 当源内存的首地址不等于目标内存的首地址时,实行正向拷贝memmove的实现: 1. 当源内存的原创 2017-07-31 21:46:10 · 642 阅读 · 0 评论 -
C++之RAII机制[转]
原文:C++中的RAII机制什么是RAII?RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源。为什么要使用RAII?转载 2017-08-07 19:08:16 · 434 阅读 · 0 评论 -
C++之friend关键字
友元提供了不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。通过友元,一个不同函数或另一个类中的成员函数可以访问类中的私有成员和保护成员。友元的声明以关键字friend开始,只能出现在类定义的内部。因为友元函数是类外的函数,所以它的声明可以放在类的私有段或公有段且没有区别。友元的正确使用能提高程序的运行效率,但同时也破坏了类的封装性和数据的隐藏性,导致程序可维护性变差。普通函数友元原创 2017-08-16 10:11:21 · 945 阅读 · 0 评论 -
C++之operator关键字[转]
原文:C++ operator关键字(重载操作符)operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。为什么使用操作符重载?对于系统的所有操作符,一般情况下,只支持基本数据类型和标准库中提供的class,对于用户自己定义class,如果想支持基本操作,比如比较大小,判断是否相等,等等,则需要用户自己来定义关于这个操作符的具体实现转载 2017-08-16 11:48:19 · 435 阅读 · 0 评论 -
move和forward源码分析[转]
原文:C++11尝鲜:std::move和std::forward源码分析std::move和std::forward是C++0x中新增的标准库函数,分别用于实现移动语义和完美转发。下面让我们分析一下这两个函数在gcc4.6中的具体实现。预备知识引用折叠规则X& + & => X&X&& + & => X&X& + && => X&X&& + && => X&&函数模板参数推导规则(右转载 2017-08-04 13:01:49 · 1396 阅读 · 0 评论 -
shared_ptr线程安全性分析[转]
原文:shared_ptr线程安全性分析本文基于shared_ptr的源代码,提取了shared_ptr的类图和对象图,然后分析了shared_ptr如何保证文档所宣称的线程安全性。本文的分析基于boost 1.52版本,编译器是VC 2010。shared_ptr的线程安全性boost官方文档对shared_ptr线程安全性的正式表述是:shared_ptr对象提供与内置类型相同级别的线程安全性。转载 2017-08-13 02:05:07 · 958 阅读 · 0 评论 -
智能指针之make_unique与make_shared
make_unique的实现std::make_shared是C++11的一部分,但是std::make_unique很可惜不是。它是在C++14里加入标准库的,但我们可以自己实现make_unique方法。// 支持普通指针template<class T,class... Args> inlinetypename enable_if<!is_array<T>::value,unique_pt原创 2017-08-05 12:34:13 · 45618 阅读 · 0 评论 -
C++之失控指针、迷途指针、野指针、悬浮指针及空指针[转]
原文:C++基础—失控指针、迷途指针、野指针、悬浮指针及空指针指针就是用来保存内存地址的变量,因此定义了一个指针后就要给它赋一个地址,或初始化为空指针。使用delete释放掉指针指向的内存后,不再使用该指针,将其置为空指针。1. 失控指针失控指针:也称迷途指针、野指针、悬浮指针,指的是不指向任何合法的对象的指针,可以指向任何地址,并且对该地址的数值进行修改或删除,可能会造成意想不到的后果。2.转载 2017-08-06 23:45:29 · 2472 阅读 · 0 评论 -
printf格式化输出符号详细说明[转]
原文:printf 格式化输出符号详细说明 * %a:浮点数、十六进制数字和p-记数法(C99) * %A:浮点数、十六进制数字和p-记法(C99) * %c:一个字符char * %C:一个ISO宽字符 * %d:有符号十进制整数int * %ld,%Ld:长整型数据long * %hd:短整型数据 * %e:浮点数、e-记数法 * %E:浮点数、E-记数法 * %f:单精度浮转载 2017-08-11 00:18:00 · 13473 阅读 · 1 评论 -
为什么多线程读写shared_ptr要加锁?[转]
原文:为什么多线程读写 shared_ptr 要加锁?shared_ptr的引用计数本身是安全且无锁的,但对象的读写则不是,因为shared_ptr有两个数据成员,读写操作不能原子化。shared_ptr的线程安全级别和内建类型、标准库容器、std::string一样,即:一个shared_ptr对象实体可被多个线程同时读取两个shared_ptr对象实体可以被两个线程同时写入如果要从多个线程转载 2017-08-15 02:17:41 · 1224 阅读 · 0 评论 -
使用智能指针的注意事项
1. 使用unique_ptr以替代auto_ptrauto_ptr是C++98标准库提供的一个智能指针,但已被C++11明确声明不再支持。auto_ptr具有以下缺陷: * auto_ptr有拷贝语义,拷贝后源对象变得无效,这可能引发很严重的问题;而unique_ptr则无拷贝语义,但提供了移动语义,这样的错误不再可能发生,因为很明显必须使用std::move()进行转移。#include <i原创 2017-08-06 18:11:38 · 2939 阅读 · 0 评论 -
C++之引用类型
我们知道,引用相当于给对象取一个别名,通过该别名,我们可以对该对象进行相关操作,由于引用依托于其他对象而存在,所以引用必须初始化,且一旦确定引用对象就不可修改。引用可分为左值引用与右值引用,下面先来介绍一下什么是左值与右值。左值与右值C++中所有的表达式和变量要么是左值,要么是右值。通俗的左值的定义就是非临时对象,那些可以在多条语句中使用的对象。所有的变量都满足这个定义,在多条代码中都可以使用,都是原创 2017-06-12 21:31:51 · 1510 阅读 · 0 评论 -
C++之lambda表达式
lambda表达式的语法归纳如下:capture子句(在 C++ 规范中也称为 lambda 引导)参数列表(可选)可变规范(可选)异常规范(可选)尾随返回类型(可选)lambda函数体capture子句capture子句指定要捕获的变量以及是通过值还是引用进行捕获。有与号&前缀的变量通过引用访问,没有该前缀的变量通过值访问。空capture子句[]指示 lambda 表达式的主体不访原创 2017-07-25 18:47:02 · 391 阅读 · 0 评论 -
text段、data段、bss段、堆和栈
text段代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。文字常量区文字常量区:常量字符串、全局常量与静态常量存放在文字常量区(局部非静态常量存放在栈),此处存放的原创 2017-06-19 22:25:12 · 2805 阅读 · 0 评论 -
C++之static关键字[转]
原文:C++中的static关键字的总结C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。面向过程设计中的static静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下:#include <iostream转载 2017-06-10 16:44:03 · 1106 阅读 · 0 评论 -
C++中的struct与class
struct与class使用{}初始化struct与class若是定义了构造函数,则都不能用大括号进行初始化struct若没有定义构造函数,可以用大括号初始化class若没有定义构造函数,且所有成员变量都为public,可以用大括号初始化struct在C与C++中的区别在C中,struct是用户自定义数据类型(UDT);在C++中,struct是抽象数据类型(ADT),支持成员函数的定义原创 2017-06-07 20:00:47 · 1587 阅读 · 0 评论 -
C++类的内存分配
内存对齐内存对齐的原因平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。对齐规则每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员原创 2017-06-02 21:50:21 · 1862 阅读 · 0 评论 -
《C陷阱与缺陷》读书笔记
如果一个整型常数的第一个字符是数字0,那么该常量将被视作八进制数。如0195相当于十进制数141C语言中,else始终与同一对括号内最近的未匹配的if结合。Switch语句中的case语句若在结尾处无break,程序将会继续执行下一条case语句非数组的指针#include <stdlib.h>char *r,*s = "hhh",*t = "sigalhu";r = (char*)malloc原创 2017-06-03 20:35:43 · 1100 阅读 · 0 评论 -
相同程序不同进程下实现数据共享
格式:#pragma comment(linker,"/section:MyData,rws")#pragma data_seg("MyData") int g_iProNum = -1;#pragma data_seg()说明:以全局变量来定义,即函体之外;必需初始化,否则编译器会把未初始化的变量放到.BSS段中;/SECTION:自己的数据段名,RWS,R为允许读,W为允许写,S原创 2017-06-03 21:43:23 · 2318 阅读 · 0 评论 -
不同进程通过共享内存实现数据共享
第1步: 新建控制台工程,主进程代码如下#include "stdafx.h"#include "windows.h"int _tmain(int argc, _TCHAR* argv[]){ wchar_t MemShareName[] = L"MemShareForTest"; LPVOID pMemShare; int data = 10; //HANDLE原创 2017-06-03 21:45:24 · 3916 阅读 · 0 评论 -
C++之const关键字
const关键字的使用const是一个C++语言的限定符,它限定一个变量不允许被改变。修饰常量用const修饰的变量是不可变的,以下两种定义形式在本质上是一样的:const int a = 10;int const a = 10;修饰指针如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身原创 2017-06-09 15:51:36 · 1373 阅读 · 0 评论 -
C++之函数返回指针
当函数的返回值为指针时,我们必须确保所返回的指针指向的内存空间是有效的。#include <iostream>#include <cstring>using namespace std;char* fun(int mod){ switch(mod){ case 0:{ char a[] = "0123456"; char *p原创 2017-06-09 20:49:37 · 7793 阅读 · 1 评论 -
C++之extern关键字
修饰变量使用extern关键字声明变量可以告诉编译器,该变量如果在当前文件的当前编译语句的之前未被定义,那么就会在当前文件的后面或者其它文件中定义。这是由于在编译阶段,我们所定义的全局变量的可见性仅局限于所在文件的定义位置之后,而其可见性扩展到整个程序则是在链接完成之后。在下面的代码中,使用static关键字与const关键字修饰的全局变量a与c被分配到不同空间,其作用域都只局限于各自所在文件,但是原创 2017-06-10 13:32:16 · 916 阅读 · 0 评论 -
C++之POD数据类型
关于什么是POD数据类型,网上相关的博文很多,我们知道,POD数据类型主要用来解决C++与C之间数据类型的兼容性,以实现C++程序与C函数的交互。当我们想要在不同进程间传递数据时,也会考虑所使用的数据类型是不是POD的。但是不是在以上情况时,只能使用POD数据类型?肯定不是的,这些才是我想讨论的主要内容。POD数据类型C++11中把POD分为了两个基本概念的集合,即:平凡的(trival)和标准布局原创 2017-06-07 16:08:33 · 11837 阅读 · 0 评论 -
类中成员函数的重载、覆盖与隐藏[转]
原文:C++类成员函数的 重载、覆盖和隐藏区别重载成员函数被重载的特征:相同的范围(在同一个类中)函数名字相同参数不同virtual 关键字可有可无#include <iostream>using namespace std;class A {public: void show(int val) { cout << val << endl; }转载 2017-06-10 20:13:13 · 949 阅读 · 0 评论 -
C++之this指针
this指针是类的普通成员函数的隐含形参,只能在成员函数中使用,指向调用该成员函数的实例地址,当形参与成员变量重名时,我们可以通过this指针加以区分。#include <iostream>using namespace std;class A {public: int a; A* set(int a){ this->a = a; return t原创 2017-06-10 22:00:43 · 968 阅读 · 0 评论 -
C++之virtual关键字
虚函数与虚函数表在类中加了virtual关键字的成员函数就是虚函数。其中,友元函数、构造函数、静态成员函数不能用virtual关键字修饰。#include <iostream>using namespace std;class A1{public: int a; virtual void funA(){ cout << "A1::funA()" << endl;原创 2017-06-16 09:40:30 · 1177 阅读 · 0 评论 -
虚函数的实调用与虚调用
虚调用是相对于实调用而言,它的本质是动态联编。在发生函数调用的时候,如果函数的入口地址是在编译阶段静态确定的,就是是实调用。反之,如果函数的入口地址要在运行时通过查询虚函数表的方式获得,就是虚调用。虚函数的实调用不通过指针或者引用调用虚函数虚调用不能简单的理解成“对虚函数的调用”,因为对虚函数的调用很有可能是实调用。#include <iostream>using namespace std;cl原创 2017-07-29 18:15:56 · 5627 阅读 · 0 评论 -
《C++面向对象程序设计-基于Visual C++ 2010》读书笔记
数据类型与基本运算字符串常量按字符书写顺序依次存储在内存中,并在最后存放空字符’\0’表示字符串常量的结束。ASCII字符在内存中占1个字节,而中文字符占2个字节有名常量是指用关键字const修饰的变量。由于该变量只能读取,而不能被修改,所以 也称为常变量。有名常量必须在定义时进行初始化,之后不再允许赋值。例如:const double PI=3.1415926;const ...原创 2018-06-17 17:22:23 · 1967 阅读 · 0 评论