
C/C++
文章平均质量分 64
flychildc
自律决定成败
展开
-
C++移动构造函数
对于了解移动构造函数的工作原理,我们需要在编译时设置编译选项-fno-elide-constructors以关闭返回值优化效果,从样就可以看到完整的移动构造函数调用过程,避免编译器优化,有些地方看不到调用移动构造函数的过程。-fno-elide-constructors这个参数只是针对C++的,手册对该参数的描述如下: -fno-elide-constructors The...原创 2018-09-01 21:09:40 · 3125 阅读 · 2 评论 -
编码方式的一些说明
一、几种编码方式说明1、ISO8859-1 是国际标准化组织内ISO/IEC8859的第一个8位字符集。它以ASCII为基础,在空置的0xA0-0xFF的范围内,加入96个字母及符号,藉以供使用附加符号的拉丁字母语言使用。属于单字节编码,应用于英文。2、ASCII 单字节编码,只用了7位,最高位为0,能表示128个字符,主要用于英文。3、Unicode...转载 2019-06-27 14:04:41 · 520 阅读 · 0 评论 -
STL deque详解
转载自https://www.cnblogs.com/youxin/p/3286154.html英文原文:http://www.codeproject.com/Articles/5425/An-In-Depth-Study-of-the-STL-Deque-Container绪言这篇文章深入的角度认 识 STL deque 容器。这篇文章将讨论一些有关deque的情况,比如在何种情况下...转载 2019-03-21 15:44:15 · 527 阅读 · 0 评论 -
C++中的类类型转换分析
1、对下面两行代码具体过程分析。string str1 = "aaa";string str2 = string("bbb");str1的初始化过程:隐式调用string类的接受一个char *的有参构造函数构造一个临时对象,然后调用移动或拷贝构造函数将临时对象拷贝给str1,最后将临时对象析构。str2的初始化过程:显式调用string类的接受一个char *的有参构造函数构造一...原创 2019-03-14 00:37:50 · 234 阅读 · 0 评论 -
链接时库文件没有放在命令行尾部所造成的问题
1、今天在用gcc命令编译使用了动态链接库中的函数的源码时,出现了问题,如下:需要说明下所有提示未定义的函数都是在动态库libitcastsocket.so和libmessagereal.so这两个动态库之中的,这些函数是在MngClient_Agree中使用的。上面三个.o文件是根据源文件编译好的,都没有问题。然后我使用以下命令想将三个.o的文件链接成可执行目标文件。gcc -L/...原创 2019-03-02 20:58:20 · 950 阅读 · 0 评论 -
windows更新之后VS2015使用cout输出中文到控制台出现乱码
在使用vs2015的时候突然发现使用cout输出中文乱码了,检查了控制台的编码方式是GBK,源代码是GB2312,按道理来说编码方式一致,不会出现输出中文乱码的情况,而且使用printf输出中文就能正确显示。具体例子如下:#include <iostream>using namespace std;int main(int argc, char**argv){ cou...原创 2018-12-26 17:02:30 · 5906 阅读 · 7 评论 -
链接器解析多重定义的全局符号
1、链接器对全局符号的引用解析过程:当编译器遇到一个不是在当前模块(可重定位目标文件)中定义的符号(变量或函数名)时,会假设该符号是在其他某个模块中定义的,生成一个链接器符号表条目,并把它交给链接器处理。如果链接器在他的任何模块中都找不到这个被引用符号的定义,就输出一条错误信息并终止。2、对于Linux编译系统,其将函数和已初始化的全局变量作为强符号,未初始化的全局变量是弱符号。然后根据以下规...原创 2018-12-13 21:17:57 · 1136 阅读 · 0 评论 -
C/C++程序编译过程分析
1、编译过程介绍1)gcc编译器编译过程如下:上图中的所有步骤并不是gcc编译器全部完成,gcc只是完成编译,当然你也可以使用C编译器(ccl)来编译。对于预处理阶段,是gcc调用C预处理器(CPP)来完成的,得到hello.i文件。对于将汇编文件翻译成可重定位目标文件(二进制文件)是gcc调用汇编器(as)完成的,得到hello.o文件。这就是单个源文件翻译过程。生成可执行文件是gc...原创 2018-12-13 17:48:15 · 491 阅读 · 0 评论 -
C/C++中字符串常量为什么可以赋值给char*?
1、对于C来说,字符串常量是由字符构成的数组,比如“hello”类型为char[6],所以在C中可以直接字符串常量赋值给char*。既然C中字符串不是常量,是不是可以改变字符串常量的值呢?答案是否定的,虽然可以编译通过(会有警告),但是运行时会出错。因为字符串常量位于只读存储区不允许写操作。实验如下:#include <stdio.h>#include <stdlib.h...原创 2018-11-30 16:52:32 · 5483 阅读 · 0 评论 -
C++中刷新输出缓冲区
每一个输出流都管理一个缓冲区,用来保存程序读写的数据。因此要将数据真正写到输出设备中,就需要刷新缓冲区。导致缓冲区刷新的原因大体有以下5种。1、程序正常结束,作为main函数return操作的一部分,缓冲区被刷新。2、当缓冲区满了的时候,会刷新缓冲区。3、可以使用操作符endl、flush和ends来显示的刷新缓冲区。这三个都是IO库中的操作符,endl能完成换行和刷新缓冲区的工作。f...原创 2018-11-08 21:36:13 · 6841 阅读 · 1 评论 -
VC使用CRT调试功能检测内存泄漏
转载自https://www.cnblogs.com/kex1n/archive/2011/04/27/2030753.html方法一:检测内存泄漏的基本工具是调试器和CRT调试堆函数。为了使用调试堆函数,在你的程序中你必须含有下面的说明:#define _CRTDBG_MAP_ALLOC#include<stdlib.h>#include<crtdbg.h>...转载 2018-10-24 20:15:07 · 350 阅读 · 0 评论 -
C++中的值初始化和默认初始化
1、值初始化 顾名思义,就是用数值初始化变量。如果没有给定一个初始值,就会根据变量或类对象的类型提供一个初始值。对于int类型其值初始化后的值为0。2、默认初始化:如果定义变量时没有指定初值,则变量被默认初始化。其初始值和变量的类型以及变量定义的位置相关。默认初始化类对象和默认初始化内置类型变量有所不同。对于默认初始化内置类型变量来说: 1)定义在函数体之外的变...原创 2018-10-31 21:33:08 · 12735 阅读 · 2 评论 -
C++中的初始化列表
C++11扩大了列表初始化的适用范围,使其可以用于所有内置类型和用户定义的类型(即类对象)。1、当列表初始化用于内置类型的变量时,这种初始化形式有一个重要的特点:如果我们使用列表初始化且初始化值存在丢失信息的风险,则编译器将报错。也就是说在使用列表初始化时编译器将禁止将变量类型进行缩窄转换,即不能将宽的变量类型通过列表初始化的形式初始化给窄的变量。例子如下:#include <io...原创 2018-10-31 16:36:35 · 1193 阅读 · 0 评论 -
为什么INT_MIN不是直接写成-2147483648
转载自https://www.cnblogs.com/helloWaston/p/4624543.html最近在编程中遇到一个问题: #include <iostream>using namespace std;int main(){ int n = -2147483648; //cout << (1 > -2147483648) <...转载 2018-10-17 20:39:14 · 831 阅读 · 0 评论 -
C++中函数返回数组指针的几种方法总结
因为数组不能被拷贝,所以函数不能返回数组。不过,函数可以返回数组的指针或引用。返回数组指针的方法有以下几种: 1、方法一:使用类型别名。如下 typedef int arrt[10]; //arrT是一个类型别名,它表示的类型是含有10个整数的数组 using arrT = int[10]; //C++11标准新的类型别名声明语法 ar...原创 2018-09-29 16:35:28 · 7451 阅读 · 1 评论 -
C++中的类型转换总结
1、 类型转换 1、在下面这些表达式中,编译器会自动转换运算对象的类型: (1) 在大多数表达式中,比int类型小的整型值首先提升为较大的整数类型。 (2) 在条件中,非布尔值转换成布尔类型。 (3) 初始化过程中,初始值转换成变量的类型;在赋值语句中,右侧运算对象转换成左侧运算对象的类型。 (4) 如果算术运算或关系运算的运...原创 2018-10-06 20:41:06 · 471 阅读 · 0 评论 -
从4行代码看右值引用
本文转载自:https://www.cnblogs.com/qicosmos/p/4283455.html从4行代码看右值引用概述 右值引用的概念有些读者可能会感到陌生,其实他和C++98/03中的左值引用有些类似,例如,c++98/03中的左值引用是这样的:int i = 0;int& j = i; 这里的int&是对左值进行绑定(但是int&...转载 2018-08-30 17:03:52 · 176 阅读 · 0 评论 -
C++11中的右值和右值引用
左值和右值:1. 对一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。2. 左值具有持久的状态,而右值要么是字面常量(注意字符串常量是左值),要么是在表达式求值过程中创建的临时对象。3. 返回左值引用的函数、赋值、下标、解引用、前置递增/递减运算符都是返回左值的表达式。(对于前置递增/递减如++a,是将持久对象a加1,然后...原创 2018-09-01 17:29:16 · 296 阅读 · 0 评论 -
C语言中void*和C++中void*的一个区别
1、在C语言中,类型检查不是很严格,因此可以将void*赋值给 type *。//.c文件中 int a = 0; int *ptr = &a; void *ptr1 = ptr; int *ptr2 = ptr1;//允许将void*类型赋值给int*,不会报错2、在C++中类型检查比较严格,因此不允许将void*赋值给type *。//.cpp文件中 int a = ...原创 2019-08-09 20:34:05 · 880 阅读 · 0 评论