C++语言理解
文章平均质量分 54
smilesundream
这个作者很懒,什么都没留下…
展开
-
C++ 函数
exec(const char* pathname, char* const argc[]) 运行pathname对应的可执行程序,并且把argc当作参数来运行它 char* fgets(char* buf, int bufsize, FILE* stream) 从stream读取bufsize-1个字节到buf struct hostent* gethostbyname(const ch...原创 2018-12-03 17:31:41 · 144 阅读 · 0 评论 -
二维数组指针
int main(){ char a[3][3]={'1','2','3','4','5','6','7','8','9'}; char (*p)[3]; p=a; PF("%c %c\n",**p,**p+1); PF("%c %c\n",**a,**a+1); PF("%p %p %p %p\n",*p,*p+1,p,p+1); PF("%p %p原创 2017-07-24 10:44:00 · 381 阅读 · 0 评论 -
大小端模式
大小端模式都是指的内存低地址:内存低地址存放的是数据中高位:大端模式内存低地址存放的是数据中低位:小端模式原创 2017-08-01 15:34:31 · 260 阅读 · 0 评论 -
const与指针及初始化
const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性指向常量的指针:const int *pa;int const *pa;两者等价。因为指向常量的指针有时候会指向常量,所以它具有这个性质:“不能靠解引用改变它指向的对象的值”,以此保护它所指向的常量的常量性:*pa =d; // 不可行(d是已经声明过的整型原创 2017-05-31 16:31:32 · 3160 阅读 · 0 评论 -
C++线程安全的单例模式
废话不多说,常用的代码积淀下来。一、懒汉模式:即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例。需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而non thread safety.使用double-check来保证thread safety.但是如果处理大量数据时,该锁才成为严重的性能瓶颈。1、静态成员实转载 2017-07-12 14:35:58 · 290 阅读 · 0 评论 -
new/delete与malloc/free的异同
不同点:(1)操作对象有所不同。malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加ma原创 2017-07-12 09:37:54 · 293 阅读 · 0 评论 -
构造函数与析构函数的调用顺序
当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止。简而言之,对象是由“底层向上”开始构造的。因为,构造函数一开始构造时,总是要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时,如果无专门说明,就调用直接基类的默认构造函数。在对象析构时,其顺序正好相反。下面的这个程原创 2017-07-12 09:12:41 · 674 阅读 · 0 评论 -
含有虚函数的空类的内存大小
01 #include 02 using namespace std; 03 04 class Base1{ 05 virtual void fun1(){} 06 virtual void fun11(){} 07 public: 08 virtual ~Base1(); 09 }; 10 11原创 2017-07-11 23:00:01 · 575 阅读 · 0 评论 -
预处理阶段
(1) 文件包含 可以把源程序中的#include 扩展为文件正文,即把包含的.h文件找到并展开到#include 所在处。 (2) 条件编译 预处理器根据#if和#ifdef等编译命令及其后的条件,将源程序中的某部分包含进来或排除在外,通常把排除在外的语句转换成空行。 (3) 宏展开 预处理器将源程序文件中出现的对宏的引用展开成相应的宏 定义,即本文所说的#原创 2017-07-11 17:07:19 · 1295 阅读 · 0 评论 -
C++中struct与class的区别
C++中struct和class的区别有很多人在学习C++的 时候只是了解了C++的语法,或者更高层次的人是理解了oo(面向对象),但在这样的学习过程中,往往一些最基本的问题反而被忽略了。当然,这些问题或许 在你做工程中,不会有太大的影响,只要按照平时一贯的良好编码习惯,依旧可以写出好的代码;但某些时候,或许就是这些最基本的小问题,会让你的程序BUG 难以发现,而注意到某些问题后,同时转载 2017-05-29 22:15:01 · 534 阅读 · 0 评论 -
不能重载的运算符(2019.10.23)
C++允许重载的运算符C++中绝大部分运算符都是可以被重载的。不能重载的运算符只有5个:. (成员访问运算符).* (成员指针访问运算符):: (域运算符)sizeof (长度运算符)?: (条件运算符)...原创 2017-05-29 20:47:41 · 450 阅读 · 0 评论 -
enum 枚举类型
枚举类型enum枚举类型的定义枚举类型(enumeration)是C++中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。定义格式:枚举类型的定义格式为: enum {};其中:关键字enum——指明其后的标识符是一个枚举类型的名字。枚举常量表——由枚举常量构成。“枚举常量”或称“枚举成员”,是以标识符形式表示的整型量,表示枚举类型的转载 2017-05-29 20:20:58 · 361 阅读 · 0 评论 -
-128的补码
以char为例。char的表示范围是-128-127。-128=10000000,只有补码表示,没有原码、反码。a=1,b=0,之后a=127=011111111,b=-126再之后a=10000000=-128,b=-127=11111111//标志1a+b=(10000000+10000001)(计算机内的补码运算)=00000001(正数原码、补码都一样)=1>0;然原创 2017-08-09 16:28:22 · 3249 阅读 · 0 评论 -
静态链接、动态链接、静态重定位、动态重定位(2019.10.22)
重定位概念:程序在装入内存时将逻辑地址转换为物理地址。重定位分类—静态重定位:在程序装入内存时就将逻辑地址转换为物理地址 优势:操作简单,不需要额外的机构或操作。 劣势:程序一旦装入后地址就不可再改变,程序也不可以再移动,不利于内存空间的有效使用。各个程序很难共享同一副本。动态重定位:在程序运行期间,需要某一内...原创 2017-07-11 20:29:39 · 9629 阅读 · 0 评论 -
虚函数实现原理
虚函数是很多编程语言中一个特性,比如c#,java,当然在c++语言中也有。这三种语言都是面向对象的语言。我们都知道面向对象语言有三个最基本的特征就是:继承,多态,封装。在c++语言中,这种多态的特征就是通过虚函数(virtual)来实现的。这种实现方法在其它语言中(比如c#)中也是如此。 我要说的就是虚函数到底是怎么实现的。还是以例子来说明。我引用了上一篇随笔中的代码。转载 2017-04-27 17:05:47 · 2838 阅读 · 1 评论 -
sizeof与strlen区别(2019.10.23)
1.本质上sizeof()是运算符,strlen是函数。2.参数上,strlen只接收char*形参,sizeof()可以接受指针、数组名、结构体、类等多种形参。3.sizeof在编译时确定,而strlen需要再运行才能计算确定。4.sizeof()计算的是在编译时就确定的对象占据内存的大小,而strlen计算的是在运行时对象实际占据的大小,一直计数直到碰到'\0';5.因为字符串...原创 2017-08-06 18:23:10 · 440 阅读 · 0 评论 -
const变量-常量折叠-符号表
转载自:一、结论声明:不同于C语言的const变量修改问题(可以通过指针间接修改const变量的值),这里只讨论C++ 里的const。C++ const 修饰符,表示常量,即如果以后保证不会修改则声明为const,否则若要修改,那一开始为什么还要声明为const呢?根据C++标准,对于修改const变量,属于:未定义行为(指行为不可预测的计算机代码),这样一来此行为取转载 2017-09-08 16:31:11 · 1898 阅读 · 0 评论 -
模板全特化与偏特化(2019.10.22)
转载自:http://www.cnblogs.com/staring-hxs/p/3659479.html模版的完全特化与偏特化模版特化:任何针对模版参数进一步进行条件限制设计的特化版本。 <<泛型思维>>完全特化:针对所有的模版参数进行特化。 <<c++ primer>>举例如下:template<class T,...原创 2017-09-23 20:27:31 · 441 阅读 · 0 评论 -
char 与 int之间的转换
1.首先char与int都分为signed与unsigned类型,默认情况下都是signed类型。2.从长字节数据类型转换为短字节数据类型,会产生截断:如从4字节的int类型转换成1个字节的char类型,则取int数据的最低的一个字节,将这个字节的数据赋给char型数据,且是有符号的,即首位为符号位;而如果是从int转换成unsigned char类型,则整个一个字节都是数据,没有原创 2017-09-07 15:16:41 · 63350 阅读 · 1 评论 -
什么时候析构函数需要定义为虚函数
1.每个析构函数(不加 virtual) 只负责清除自己的成员。2.可能有基类指针,指向的确是派生类成员的情况。(这是很正常的), 那么当析构一个指向派生类成员的基类指针时,程序就不知道怎么办了。 所以要保证运行适当的析构函数,基类中的析构函数必须为虚析构。 基类指针可以指向派生类的对象(多态性),如果删除该指针delete []p;就会调用该指针指向的原创 2017-07-12 09:22:36 · 2349 阅读 · 1 评论 -
C++数据存储区
在C/C++中,内存中数据存储分成4个区,分别是堆、栈、全局/静态存储区和常量存储区。 栈(stack),就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆(heap),一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。 全局/静态存储区,全局变量和静态变量被分配到同一块内存中,转载 2017-05-30 11:54:59 · 1233 阅读 · 0 评论 -
补码
(X-Y)%mod=(X+Z)%mod。那么-Y与Z互为补码。对于正数,因为计算机可以直接加,那么补码就是其本身。对于负数,计算机不可以直接加,就需要将其转换为其的补码来让计算机执行加法。因为(X-Y)%mod=(X+mod-Y)%mod,所以 (-Y)的补码=mod-Y;=>-Y=mod-(-Y)的补码,也就是说“对于负数,补码就是模减去这个数的绝对值”。原创 2017-08-13 15:30:07 · 1738 阅读 · 0 评论 -
auto与decltype
auto:1.auto一般会忽略顶层const;2.auto的引用会保留顶层const;decltype:1.decltype不会忽略顶层const;2.如果decltype内是解引用操作,得到的将是引用类型。原创 2017-08-13 22:01:24 · 169 阅读 · 0 评论 -
位域
转载:http://www.cnblogs.com/bigrabbit/archive/2012/09/20/2695543.html有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进转载 2017-08-01 11:52:43 · 213 阅读 · 0 评论 -
强制类型转换
>作者: 阙荣文(querw@sina.com)C/C++是强类型语言,不同类型之间的相互转换是比较麻烦的.但是在编程实践中,不可避免的要用到类型转换.有2中类型转换:隐式类型转换和强制类型转换.1.隐式类型转换1.1 提升精度,此种是编译器自动完成的,安全的.所以编译的时候不会有任何错误或者警告信息提示.示例: > P147int ival = 3原创 2017-07-20 17:43:01 · 604 阅读 · 0 评论 -
有符号数、无符号数之间的转换
1、unsigned char 无论是转int 还是unsigned int 高位直接补02、负数char 无论是转int 还是unsigned int 高位全补13、正数char 无论是转int 还是unsigned int 高位全补0原创 2017-08-12 14:45:27 · 2784 阅读 · 0 评论 -
指针函数与函数指针
1.指针函数先看下面的函数声明,注意,此函数有返回值,返回值为int *,即返回值是指针类型的。[cpp] view plain copyint *f(int a, int b); 上面的函数声明又可以写成如下形式:int* f(int a, int b);让指针标志 * 与int紧贴在一起,而与函数名f原创 2017-05-29 17:41:01 · 146 阅读 · 0 评论 -
虚函数 析构函数
1.第一段代码#includeusing namespace std;class ClxBase{public: ClxBase() {}; ~ClxBase() {cout void DoSomething() { cout };class ClxDerived : public ClxBase{public: C转载 2017-04-27 17:29:56 · 336 阅读 · 0 评论 -
模板类与类模板、函数模板与模板函数等的区别
在C++中有好几个这样的术语,但是我们很多时候用的并不正确,几乎是互相替换混淆使用。下面我想彻底辨清几个术语,这样就可以避免很多概念上的混淆和使用上的错误。 这几个词是: 函数指针——指针函数 数组指针——指针数组 类模板——模板类 函数模板——模板函数 最终在使用中,我们就可以让它们实至名归,名正言顺。 1.函数指针——指针原创 2017-04-15 15:22:26 · 231 阅读 · 0 评论 -
结构体内存对齐
一个结构体变量定义完之后,其在内存中的存储并不等于其所包含元素的宽度之和。例一: #include using namespace std;转载 2017-04-29 15:34:34 · 257 阅读 · 0 评论 -
类的派生与继承
private,public,protected方法的访问范围.(public继承下)private: 只能由该类中的函数、其友元函数访问,不能被任何其他访问,该类的对象也不能访问. protected: 可以被该类中的函数、子类的函数、以及其友元函数访问,但不能被该类的对象访问 public: 可以被该类中的函数、子类的函数、其友元函数访问,也可以由该类的对象访问注:友元函数包括原创 2017-04-29 14:23:59 · 322 阅读 · 0 评论 -
结构体指针
指向结构体类型变量的使用首先让我们定义结构体:struct stu{char name[20];long number;float score[4];} ;再定义指向结构体类型变量的指针变量:struct stu *p1, *p2 ;定义指针变量p 1、p 2,分别指向结构体类型变量。引用形式为:指针变量→成员;[例7-2] 对指向结构体类型变量的正确使原创 2017-04-13 21:18:27 · 556 阅读 · 0 评论 -
typedef 定义数组
使用typedef语句定义数组类型 1. 一维数组类型的定义格式 typedef []; 例如: (1) typedef int vector[10]; (2) typedef char strings[80]; (3) typedef short int array[N]; 第一条语句定义了一个元素类型为int,含有1原创 2017-04-13 19:55:04 · 7171 阅读 · 0 评论 -
new delete
c++中new和delete的使用方法http://www.jb51.net/article/49537.htm对于计算机程序设计而言,变量和对象在内存中的分配都是编译器在编译程序时安排好的,这带来了极大的不便,如数组必须大开小用,指针必须指向一个已经存在的变量或对象。对于不能确定需要占用多少内存的情况,动态内存分配解决了这个问题。 new和delete运算符是用原创 2017-04-17 22:15:26 · 235 阅读 · 0 评论 -
sizeof +数组名
链接:https://www.nowcoder.com/questionTerminal/daa5422cb468473c9e6e75cc98b771de来源:牛客网sizeof一个数组名称的时候是计算的变量所具有的实际的字节数!!当你在函数A中定义一个数组(比如,char str[15];),然后在该函数A中直接使用sizeof(str),那么输出结果肯定是15;但是当你把这个数原创 2017-04-11 00:25:38 · 436 阅读 · 0 评论 -
浅拷贝与深拷贝
对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。 1234567891011转载 2017-03-30 11:29:35 · 259 阅读 · 0 评论 -
父指针 子指针
1. 父类指针可能指向父类对象,也可能指向子类对象;子类指针只能指向子类对象;2. 虚函数时调用方法由被指向的对象类型决定;非虚函数时调用方法由指针类型决定;原创 2017-03-30 10:31:09 · 511 阅读 · 0 评论 -
指针的运算
对数组名取地址Docker精华学习资料集锦,老司机快上车>>> 0收藏(2)int a[5]={1,2,3,4,5};int b[100];一个数组名代表的是数组中第一个元素的位置,通过数组名我们可以访问数组,先看下面两个问题问题一:看到一篇文章这么写的。。int array[10]; int (*ptr)[10]; ptr=&array;//这转载 2017-03-29 23:57:01 · 264 阅读 · 0 评论 -
函数模板与类模板
面向对象编程(OOP)和泛型编程都能处理在编写程序时不知道类型的情况。不同之处在于:OOP能处理类型在程序运行之前都未知的情况;而在泛型编程中,在编译时就能获知类型了。前面介绍的容器、迭代器和算法都是泛型编程的例子。当我们编写一个泛型程序时,是独立与任何特定类型来编写代码的。当使用一个泛型程序时,我们提供类型或值,程序实例可在其上运行。模板是泛型编程的基础。一个模板就是一个创建类或函数的蓝原创 2017-04-15 15:56:52 · 306 阅读 · 0 评论 -
C++11 STL函数 UnorderedSet
一些简单操作UnorderedSetTest.cpp#include #include #include "../../Core/print.hpp"#include "UnorderedSetTest.h"using namespace std;void UnorderedSetTest::simpleOperation(){ // create an原创 2017-04-15 22:36:34 · 1675 阅读 · 0 评论