
C++
一条傻傻的二哈
一只正在努力奋斗的二哈
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++命名空间和缺省参数的概念
命名空间在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace 关键字的出现就是针对这种问题的。1 、命名空间定义定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成...原创 2018-10-11 23:51:52 · 228 阅读 · 0 评论 -
C++复习(五)(const、static、inline、引用与指针、new/delete)
const的用途1、const修饰变量、参数、返回值:在C++中const修饰变量,变量会变成常量,所以声明的同时必须初始化。C++会对常量优化,将其放到寄存器中,如果想去内存中取值的话,使用volatile关键字修饰,保证内存可见性。而在C中const会将变量修饰为常变量,存储在静态文本段,只有读权限,不能被修改。2、const修饰指针:常量指针:const在 * 的右边、不能...原创 2019-03-01 09:20:31 · 339 阅读 · 0 评论 -
C++复习(六)
什么是浅拷贝、深拷贝、写时拷贝、引用计数,哪里都用到了浅拷贝:当类里面有指针成员时,进行赋值或拷贝构造的时候,对数据成员逐一赋值,没有为指针成员分配新的内存,使得两个对象的指针成员指向同一块内存,这就是浅拷贝。由于两个对象指针指向了同一块内存,所以当析构的时候会出错。深拷贝:当类里面有指针成员时,进行赋值或拷贝构造的时候,会给另一个对象的指针成员分配一块新的内存,两个对象的指针成员指...原创 2019-03-01 17:05:08 · 279 阅读 · 0 评论 -
C++复习(七)
C和C++的区别是什么,C++优势在哪里,缺陷呢?C语言是面向过程编程,C++是面向对象编程,所以C和C++的区别也就是面向过程编程和面向对象编程的区别。面向过程编程就是分析出解决问题的步骤,然后把这些步骤一步一步的实现,使用的时候一个一个的依次调用就可以了。面向对象编程就是把问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。编程的...原创 2019-03-01 18:08:06 · 173 阅读 · 0 评论 -
C++智能指针之auto_ptr、unique_ptr、shared_ptr、weak_ptr的详细介绍
我们先来看看为什么需要有智能指针。看看下面的代码void demo(std::string& str){ std::string *ps = new std::string(str); ... str = ps; return;}上面的代码很明显的每次调用都在分配堆上的空间,但是却从不收回,从而导致内存泄露。当然我们知道在 return;前加上delete ps;。...原创 2019-03-27 13:57:53 · 1470 阅读 · 0 评论 -
c++异常
程序有可能遇到运行阶段错误,导致程序无法正常地运行下去。例如:程序可能试图打开一个不可用的文件、或者请求过多的内存,或者遭遇不能容忍的值。C++为处理这种情况提供了一种强大而灵活的工具。我们首先来看看C语言是如何处理错误的:终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是...原创 2019-03-27 15:40:46 · 171 阅读 · 0 评论 -
STL之空间配置器
什么是空间配置器空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收)的,在默默地工作。虽然在常规使用STL时,可能用不到它,但站在学习研究的角度,学习它的实现原理对我们有很大的帮助。为什么需要空间配置器我模拟实现vector、list、map、unordered_map等容器时,所有需要空间的地方都是通过new申请的,虽然代码可以正常运行,但是有以下不足之处:空...原创 2019-04-10 19:41:51 · 919 阅读 · 0 评论 -
for(;;)和while(true)的区别
我在VS2017的环境下。一目了然,for (;;)指令少,不占用寄存器,而且没有判断跳转,比while (1)好。也就是说两者在在宏观上完全一样的逻辑,但是底层完全不一样,for相对于来说更加简洁明了。注:但是在jave中这两种表达方式在编译器优化的情况下,都是一样的效果。某些没有优化的情况可能会不一样。...原创 2019-04-09 10:39:59 · 160 阅读 · 0 评论 -
c++输入、输出和文件
首先介绍第一个概念,缓冲区。使用缓冲区可以高效的处理输入与输出。缓冲区是用作中介的内存块,它是将信息从设备传输到程序或者从程序传输给设备的临时存储工具。关于 put 和writecout.put('W'); cout.put(65);cout.put(65.5); //会将65.5转换成65cout.write();basic_ostream<charT,traits&g...原创 2019-06-06 15:40:11 · 348 阅读 · 0 评论 -
c++类型转换
类型转换有 c 风格的,当然还有 c++风格的。c 风格的转换的格式很简单(TYPE) EXPRESSION,但是 c 风格的类型转换有不少的缺点,有的时候用 c 风格的转换是不合 适的,因为它可以在任意类型之间转换,比如你可以把一个指向 const 对象的指针转换 成指向非 const 对象的指针,把一个指向基类对象的指针转换成指向一个派生类对象的 指针,这两种转换之间的差别...原创 2019-05-29 19:45:08 · 24860 阅读 · 3 评论 -
C++11新标准
新类型新增long long 和unsigned long long ,用来支持64(或更宽)的整形;新增 char16_t 和char_32_t ,用来支持16位和32位的字符表示;统一的初始化C++11扩大了大括号括起的列表的使用范围,使其可以用于所有内置类型和用户定义的类型(即类对象)。使用初始化列表时,可以不添加等号(=)。初始化列表语法可以防止缩窄,即禁止将数值赋给无...原创 2019-06-09 17:52:36 · 5040 阅读 · 0 评论 -
神奇的int i = -2147483648,为什么在VS中编译错误?
我们先从二进制机器标识码说起引用别人的一段话“这得从二进制的原码说起:如果以最高位为符号位,二进制原码最大为0111111111111111=215-1=32767 最小为1111111111111111=-(215-1)=-32767此时0有两种表示方法,即正0和负0:0000000000000000=1000000000000000=0所以,二进制原码表示时,范围是-32767~...原创 2019-06-10 00:29:48 · 3310 阅读 · 1 评论 -
#pragma 预处理指令详解
#pragma 预处理指令详解#pragma 指令对每个编译器给出了一个方法,在保持C和C++语言完全兼容的情况下,给出了主机或操作系统专有的特征。其格式一般是 #pragma para ,其中para 是参数。message 参数它能够在编译窗口中输出相应的信息,这对于源代码的控制是非常重要的。使用方法 #pragma message("消息文本")当编译器遇到这条指令时,就在...原创 2019-06-22 11:39:25 · 465 阅读 · 0 评论 -
c++复习(一)
c++1、c++如何确定常量的类型假设在程序中使用常量来表示一个数字: cout<<"Year"<<1492<<endl; 那么程序会把1492存成什么类型呢?答案是,除非有理由存储为其他类型(如使用了特殊的后缀来表示特定的类型,或者值太大,不能存储为int),否则c++将整形常量存储为int类型。2、c++11中auto的声明在初始化过声明中,...原创 2019-01-22 20:53:18 · 214 阅读 · 0 评论 -
C++复习(四)
1、继承继承方式/类成员 public成员 protected成员 private成员 public 派生类中public成员 派生类中protected成员 派生类中不可见 protected 派生类中protected成员 派生类中protected成员 派生类中不可见 private 派生类中private成员 ...原创 2019-01-25 12:44:38 · 179 阅读 · 0 评论 -
C++复习(三)
1、const在c++中在默认情况下,全局变量的链接性是外部的,但是const的全局变量的链接性是内部的。如果希望这个加了coonst的全局变量的链接性是外部的,那么就再给他添加一个extern修饰,但是请记住,鉴于单个const在多个文件之间共享,因此只有文件可对其初始化。在代码块中声明const时,其作用域为代码块,即仅当程序在执行该代码块中的代码时,该常量才是可用的。这意味着函数...原创 2019-01-24 17:45:10 · 354 阅读 · 0 评论 -
c++函数重载
c++的简单函数重载** 函数重载概念**函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、类型、顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。注意:这里我说一点,形参列表中三个描述参数的必须至少有一个不同。函数返回值不用不作为函数重载的判断依据。...原创 2018-10-13 22:55:00 · 716 阅读 · 1 评论 -
c++引用
c++引用引用的概念:对一个数据可以建立一个“引用”,它的作用是为了一个变量起一个别名。 int a; //定义a是整形变量 int &b = a; // 声明b是a的“引用”请注意:在上面声明中,&是引用声明符,并不代表地址。在数据类型后面出现的&是运用声明符,在其他场合出现的是地址符。例如:char &d = c; //此处的&...原创 2018-10-19 16:19:55 · 158 阅读 · 0 评论 -
c++内联函数
c++内联函数概念:以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。查看方式:在release模式下,查看编译器生成的汇编代码中是否存在call Add在debug模式下,需要对编译器进行设置,否则...原创 2018-10-19 17:49:26 · 364 阅读 · 0 评论 -
c++类与对象
c++类和对象(一)在c++中对象的类型称为类,类代表了某一批对象的共性和特征。类是对象的抽象,而对象时类的具体实例。C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。如以下代码struct Student{ void SetStudentInfo(const char* name, const char* gender, int age) {...原创 2018-10-27 14:56:27 · 834 阅读 · 0 评论 -
c++类与对象之默认成员函数
c++类与对象(二)1.类的6个默认成员函数一:构造函数构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值,并且在对象的生命周期内只调用一次。构造函数是特殊的成员函数,其特征如下:函数名与类名相同。无返回值。对象构造(对象实例化)时编译器自动调用对应的构造函数。构造函数可以重载。class Date{...原创 2018-10-27 17:15:28 · 266 阅读 · 0 评论 -
c++之友元函数和友元类
c++友元函数一些见解1、为什么要引入友元函数:在实现类之间数据共享时,减少系统开销,提高效率具体来说:为了使其他类的成员函数直接访问该类的私有变量 即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数 优点:能够提高效率,表达简单、清晰 缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数。2、什么时候使用友元函数:...原创 2018-11-02 23:43:20 · 1301 阅读 · 0 评论 -
c++之static的一些用法
关于 c++ 中 static 的见解C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。1.面向过程设计中的static1.1静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下:#inclu...原创 2018-11-03 00:38:52 · 222 阅读 · 0 评论 -
c/c++静态变量和静态函数
c语言中c语言中需要内存来存放数据。而内存主要分为两类:静态存储区和动态存储区;静态存储区分为:只读数据(READONLY DATA)区、以读写数据(RW DATA)区、未初始化区(BSS)。它们都是在程序编译连接阶段确定的,在程序执行的阶段不会改变。动态存储区分为堆和栈。都是程序执行的过程中动态分配的,大小也随之动态变化。从内存管理的实现的角度看来,堆使用的链表实现的,而栈使用的...原创 2018-11-11 15:32:26 · 13189 阅读 · 2 评论 -
c++的函数模板
c++的函数模板首先为什么要引进函数模板?我们来看一个案例:我们在这儿想要实现一个通用的交换数据的函数void Swap(int left, int right){ int temp = left; left = right; right = temp;}void Swap(char left, char right){ char temp = left; left = r...原创 2018-11-11 20:51:15 · 218 阅读 · 0 评论 -
c++中new和delete
new运算符首先,在c语言中我们用库函数malloc()来分配内存,在c++中任然可以这样做。但是c++提供了更好的方法------new运算符。举个例子:下面的代码是让new找到一个长度正确的内存块,并返回该内存的地址给指针 pn。 int * pn = new int;为一个数据对象(结构或者基本类型)获得并指定分配内存的通用格式如下: typeName * pointer...原创 2018-12-17 23:40:51 · 264 阅读 · 0 评论 -
molloc/free和new/delete的区别
malloc/free和new/delete的区别malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地方是:malloc和free是函数,new和delete是操作符malloc申请的空间不会初始化,new可以初始化malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可malloc的返回...原创 2018-12-17 23:46:02 · 1159 阅读 · 0 评论 -
C++复习(二)
1、二维数组的数组名代表的是指向指针的指针。2、内联函数不能递归3、对于模板函数,如果有多个原型,则编译器在选择原型时,非模板版本优先于显式具体化和模板版本,而显式具体化优先于使用模板生成的版本。4、函数模板实例化和具体化的区别: 模板实例化 模板具体化 声明 template void Swap<int>(int, int); ...原创 2019-01-23 21:21:17 · 236 阅读 · 0 评论 -
C++ STL常用算法总结
算法:问题的求解步骤,以有限的步骤,解决数学或逻辑中的问题。STL中的算法主要分为两大类:与数据结构相关算法(容器中的成员函数)和通用算法(与数据结构不相干)。STL中通用算法总共有70多个,主要包含:排序,查找,排列组合,数据移动,拷贝,删除,比较组合,运算等。今天我介绍我经常会用到的算法。accumulate 元素统计template <class InputItera...原创 2019-08-08 14:32:17 · 532 阅读 · 0 评论