C/C++基础知识
文章平均质量分 74
C/C++基础知识
~青萍之末~
弱者总有弱者的理由
展开
-
std::move原理实现与用法总结
文章目录一、左值与右值二、左值引用和右值引用1、std::move简介2、std::move详解3、std::move的优点 右值引用(及其支持的Move语意和完美转发)是C++0x加入的最重大语言特性之一。从实践角度讲,它能够完美解决C++中长久以来为人所诟病的临时对象效率问题。从语言本身讲,它健全了C++中的引用类型在左值右值方面的缺陷。从库设计者的角度讲,它给库设计者又带来了一把利器。从...转载 2019-03-09 21:42:59 · 15571 阅读 · 2 评论 -
内存对齐的相关问题
文章目录一、sizeof与strlen区别二、内存对齐(1)内存对齐的规则(2)为什么要使用内存对齐三、判断两个结构体是否相等一、sizeof与strlen区别sizeof 是运算符,结果在编译时计算,不能返回动态分配的内存空间大小;strlen 是库函数,结果在运行时运算。sizeof功能是获取对象字节大小;strlen功能是计算字符串的长度,从字符串开头扫描直到遇到第一个’\0’...原创 2019-03-07 16:22:05 · 835 阅读 · 0 评论 -
C语言中的一些宏定义和常用的函数
文章目录一、typeof 关键字二、snprintf()函数的作用三、__builtin_expect的作用四、C语言中常用的预定义五、反斜杠的作用一、typeof 关键字 如果你是 C++ 程序员,应该接触过 C++11 里的 decltype 操作符,它的作用是自动推导表达式的数据类型,以解决泛型编程中有些类型由模板参数决定而难以(甚至不可能)表示的问题。其实这个特性在 C 语言中也早有...原创 2018-12-25 17:16:54 · 906 阅读 · 0 评论 -
函数返回值作为形参存在的问题以及形参和实参的区别
一、问题描述若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是( D )(A)函数调用可以作为独立的语句存在。(B)函数调用可以作为一个函数的实参。(C)函数调用可以出现在表达式中。(D)函数调用可以作为一个函数的形参。解析:函数返回值存在寄存器中(寄存器在CPU里面,不在内存里面), 没有地址, 因此不能作为形参,但可以作为实参。二、形参与实参区别 形参出现在函数定义...转载 2018-12-22 13:07:45 · 3311 阅读 · 0 评论 -
回调函数详解
一、什么是回调函数 回调函数是指 使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数。函数是你实现的,但由别人(或系统)的函数在运行时通过参数传递的方式调用,这就是所谓的回调函数。简单来说,当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。二、回调函数详解1、C语言中的回调函数...原创 2018-12-04 19:26:53 · 28274 阅读 · 1 评论 -
c++ 时间类型详解(time_t和tm)
linux下存储时间常见的有两种存储方式,一个是从1970年到现在经过了多少秒,一个是用一个结构来分别存储年月日时分秒的。 time_t 这种类型就是用来存储从1970年到现在经过了多少秒,要想更精确一点,可以用结构struct timeval,它精确到微妙。而直接存储年月日的是一个结构:struct tm{ int tm_sec; /*秒,正常范围0-59, 但允许至61...转载 2018-10-07 15:06:53 · 23988 阅读 · 3 评论 -
C++ memset()函数和bzero()函数
1、memset函数说明 memset()的函数, 它可以一字节一字节地把整个数组设置为一个指定的值。它把数组的起始地址作为其第一个参数,第二个参数是设置数组每个字节的值,第三个参数是数组的长度(字节数,不是元素个数)。memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度。#include <string.h>// 将s中的前n个字节用ch替换并...原创 2018-09-29 20:14:35 · 12277 阅读 · 0 评论 -
C++中string、char *、char[]的转换
一、string转char* 有两种种方法可以将str转换为char*类型,分别是:data()、c_str()。string str = "hello";const char* p = str.data();const char *p = str.c_str();二、char * 转stringstring s;char *p = "hello";s = p;三、str...原创 2018-09-29 19:37:37 · 185 阅读 · 0 评论 -
C++性能优化实践
一、优化准则 1. 二八法则:在任何一组东西中,最重要的只占其中一小部分,约20%,其余80%的尽管是多数,却是次要的;在优化实践中,我们将精力集中在优化那20%最耗时的代码上,整体性能将有显著的提升;这个很好理解。函数A虽然代码量大,但在一次正常执行流程中,只调用了一次。而另一个函数B代码量比A小很多,但被调用了1000次。显然,我们更应关注B的优化; 2. 编完代码,再优化;编码的时候...转载 2018-08-03 10:49:52 · 357 阅读 · 0 评论 -
C++矩阵库 Eigen 简介
一、Eigen 矩阵定义#include <Eigen/Dense>Matrix<double, 3, 3> A; // Fixed rows and cols. Same as Matrix3d.Matrix<double, 3, Dynamic> B; // Fixed rows, dynamic c...转载 2018-08-03 10:39:11 · 5384 阅读 · 0 评论 -
提高C++程序运行效率的10个简单方法
这篇文章主要介绍了提高C++程序运行效率的10个简单方法,包括了循环、变量、继承等等应用的技巧,非常具有实用价值,需要的朋友可以参考下本文以C/C++程序为例讲述了程序运行效率的10个简单方法,分享给大家供大家参考之用。具体分析如下:对于每一个程序员来说,程序的运行效率都是一个值得...转载 2018-07-26 11:21:40 · 623 阅读 · 0 评论 -
函数指针作为某个函数的参数及定义函数指针(回调函数)
转载于:http://blog.csdn.net/vlily/article/details/7244682转载于:http://blog.csdn.net/shengnan_wu/article/details/8116935转载于:http://blog.csdn.net/callmebac...转载 2018-07-08 10:35:12 · 1193 阅读 · 1 评论 -
调用拷贝构造函数的几种情况(附面试题)
1. 深拷贝和浅拷贝(拷贝构造函数的使用) 有时候需要自己定义拷贝构造函数,以避免浅拷贝问题。在什么情况下需要用户自己定义拷贝构造函数:一般情况下,当类中成员有指针变量、类中有动态内存分配时常常需要用户自己定义拷贝构造函数。 在什么情况下系统会调用拷贝构造函...转载 2018-07-08 10:33:59 · 2270 阅读 · 1 评论 -
内存泄漏及其检测方法
1、内存泄漏的定义 内存泄漏指的是在程序里动态申请的内存在使用完后,没有进行释放,导致这部分内存没有被系统回收,久而久之,可能导致程序内存不断增大,系统内存不足……引发一系列灾难性后果。2、内存泄漏的检测方法#define CRTDBG_MAP_ALLOC //放在程序最前#include &lt;iostream&gt;#include &lt;stdlib.h&gt; ...原创 2018-07-01 15:10:35 · 24648 阅读 · 1 评论 -
C/C++常见错误集锦
1、error LNK2005:“已经在*.obj中定义” (1) 变量或者函数的定义放到cpp文件中,不要放到.h中。(2) #ifndef MY_H_FILE //如果没有定义这个宏 #define MY_H_FILE //定义这个宏 ……. //头文件主体内容 ……. #endif (3...原创 2018-06-28 16:22:51 · 3433 阅读 · 0 评论 -
常用正则表达式
一、校验数字的表达式1 数字:^[0-9]*$2 n位的数字:^\d{n}$3 至少n位的数字:^\d{n,}$4 m-n位的数字:^\d{m,n}$5 零和非零开头的数字:^(0|[1-9][0-9]*)$6 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$7 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2...转载 2018-06-23 10:55:30 · 243 阅读 · 0 评论 -
C语言小结-输入型参数和输出型参数
1、函数为什么需要传参和返回值(1) 函数的作用就是处理数据,传入的参数就是被加工的数据,返回值就是输出的结果。 (2)函数名就是这个函数的入口,在内存中表示就是一个函数代码段的首地址,实质是一个指针常量,所以在程序中使用函数名都是当地址来用的,用来调用这个函数。再理解指针函数的实质就比较简单了。 (3) 如果...转载 2018-06-22 21:30:10 · 2992 阅读 · 0 评论 -
C++设计一个无法被继承且能正常使用的类
首先,不能被继承的类,也就是它的子类继承它后不能正常的实例化。其实,如果能考虑到这里,就很简单了:子类需要实例化父类,将父类的构造函数设为private,子类就无法实例化了。再进一步,子类的析构函数需要调用父类的析构函数,所以将父类的析构函数设为private也能解决我们的问题。 但是如果将父类的构造函数设为private,它自己就无法正常,它自己的对象没法正常的声明、实例化。将构造函数设为了pr转载 2018-03-07 20:55:44 · 413 阅读 · 0 评论 -
C++四种强制转换
C++的四种强制类型转换,所以C++不是类型安全的。分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast。 为什么使用C风格的强制转换可以把想要的任何东西转换成合乎心意的类型。那为什么还需要一个新的C++类型的强制转换呢?新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。 C++中风格是转载 2018-03-07 20:36:47 · 1451 阅读 · 0 评论 -
C++在循环内和循环外定义变量的差异
在C++里面,我们通常会这样写for循环:for(int i = 0;i<10;i++){ cout << i; } 还有另外一种写法:int i = 0;for(; i<10 ;i++){ cout << i; } 首先是在内层循环中定义变量到底会不会存在重复分配的问题,这涉及到编译器的优化,不过主流编译器(如vs和gcc)这一块优化都比较好,转载 2018-03-07 20:08:15 · 8903 阅读 · 2 评论 -
C++记录程序运行时间
#include <iostream>#include <vector>#include <algorithm>#include <ctime>using namespace std;int main(int argc, char const *argv[]){ clock_t start_time = clock(); for (int i=0; i<100000000原创 2018-02-09 20:11:00 · 372 阅读 · 0 评论 -
浅谈Session与Cookie的区别与联系
一、Session的概念 Session 是存放在服务器端的,类似于Session结构来存放用户数据,当浏览器 第一次发送请求时,服务器自动生成了一个Session和一个Session ID用来唯一标识这个Session,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和转载 2018-01-20 16:37:51 · 267 阅读 · 0 评论 -
VS2015调试程序
在vs中调试程序的,有时候需要设置断点看某个变量的内容,如果变量是一个指针、数组或结构体,则可以通过查看该变量所指向的内存来看变量的内容。 (1)设置断点后,在vs2015中打开调试窗口 在vs2015调试界面中,点击菜单【调试】->【窗口】->【内存】->【内存1】/【内存2】/【内存3】/【内存4】即可打开内存窗口。2、找到要查看的变量的内存地址 在VS调试界面中,右键点击要查看内转载 2017-12-01 19:17:36 · 2247 阅读 · 0 评论 -
cpu cache对程序性能的影响
一、补充内容: 由于计算机的内存是一维的,多维数组的元素应排成线性序列后存入存储器。数组一般不做插入和删除操作,即结构中元素个数和元素间的关系不变。所以采用顺序存储方法表示数组。1、 行优先存储 将数组元素按行向量排列,第i+1个行向量紧接在第i个行向量后面。 【例】二维数组A[m][n]按行优先存储的线性序列为: A[0][0]、A[0][1]…A[0][n]、A[1][1]转载 2017-11-21 09:54:05 · 3594 阅读 · 0 评论 -
pragma指令简介
在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作.下面介绍了一下该指令的一些常用参数,希望对大家有所帮助!一、message 参数 message 它能够在编译信息输出窗 口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为: #pragma message(“消息文本”) 当编译器转载 2017-11-04 21:22:21 · 278 阅读 · 0 评论 -
预处理/预编译
一、预处理的由来 在C++的历史发展中,有很多的语言特征(特别是语言的晦涩之处)来自于C语言,预处理就是其中的一个。C++从C语言那里把C语言预处理器(被Bjarne博士简称为Cpp,不知道是不是C Program Preprocessor的简称)继承过来。二、常见的预处理功能 预处理器的主要作用就是把通过预处理的内建功能对一个资源进行等价替换,最常见的预处理有:文转载 2017-11-04 21:07:54 · 2445 阅读 · 1 评论 -
详解core dump
一、什么是core dump 我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条件呢?下面会分析)会产生一个叫做core的文件。 通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们转载 2017-11-04 17:36:14 · 1525 阅读 · 0 评论 -
编程修养
编程修养 什么是好的程序员?是不是懂得很多技术细节?还是懂底层编程?还是编程速度比 较快?我觉得都不是。对于一些技术细节来说和底层的技术,只要看帮助,查资料 就能找到,对于速度快,只要编得多也就熟能生巧了。 我认为好的程序员应该有以下几方面的素质:1、有专研精神,勤学善问、举一反三。2、积极向上的态度,有创造性思维。3、与人积极交流沟通的能力,有团队精神。4、谦虚转载 2017-11-03 21:57:40 · 569 阅读 · 0 评论 -
C++中for循环的5种语法
#include #include int nArray[] = {0, 1, 2, 3, 4, 5}; std::vector vecNum(nArray, nArray + 6); CString strText; 第一种用法:最原始的语法(用下标):for (size_t i = 0; i < vecNum.size(); ++i) { strT转载 2017-10-03 11:18:29 · 1571 阅读 · 0 评论 -
sizeof用法总结
sizeof用法总结以下运行环境都是一般的,在32位编译环境中1、基本数据类型的sizeofcout<<sizeof(char)<<endl; 结果是1cout<<sizeof(int)<<endl; 结果是4cout<<sizeof(unsigned int)<<endl; 结转载 2017-10-02 20:36:13 · 562 阅读 · 0 评论 -
const、typedef和#define的用法与区别
目录一、typedef的用法二、#define的用法三、const的用法四、typedef与#define的区别五、typedef的四个用途和两个陷阱一、typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像:typedef int IN...转载 2017-09-28 21:26:33 · 2900 阅读 · 3 评论 -
C++注释规范
1、源文件头部注释Ø 列出:版权、作者、编写日期和描述。Ø 示例: /************************************************* Copyright:bupt Author: Date:2010-08-25 Description:描述主要实现的功能 ****************转载 2017-09-28 10:46:44 · 1309 阅读 · 0 评论 -
关于typedef的用法小结
转自:http://blog.csdn.net/erzr_zhang/article/details/52665791不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中。typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些C/C++的学习者的博客,其中有一篇关于typedef的总结还是很不错,由转载 2017-03-21 16:55:00 · 458 阅读 · 0 评论 -
抽象类的构造函数
转自:http://blog.csdn.net/newmoon2004/article/details/59514371、抽象类是可以有构造函数的。但很多人认为,构造函数用于实例化一个对象(或建立一个对象的实例),而抽象类不能被实例化,所以抽象类不应该有公共的构造函数(FxCop.设计规则)。但不应该有“公共”的构造函数,和不应该有构造函数,这是两个不同的概念,所以,FxCop.设计规则中转载 2017-03-18 17:46:45 · 2612 阅读 · 0 评论 -
成员初始化列表
1、对于const数据成员,必须在执行到构造函数体之前,即创建对象时进行初始经。2、成员初始经列表由逗号分隔的初始化列表组成(前面带冒号)。它位于参数列表的右括号之后、函数体左括号之前。3、初值可以是常量或构造函数的参数列表中的参数。这种方法并不限于初始化常量。例如下代码:Queue::Queue(int qs) : qsize(qs), front(NULL), rear(N转载 2017-03-18 17:44:29 · 2467 阅读 · 0 评论 -
派生类的构造函数
派生类的数据成员由所有基类的数据成员与派生类新增的数据成员共同组成,如果派生类新增成员中包括其他类的对象(子对象),派生类的数据成员中实际上还间接 包括了这些对象的数据成员。因此,构造派生类的对象时,必须对基类数据成员、新增数据成员和成员对象的数据成员进行初始化。派生类的构造函数必须要以合适 的初值作为参数,隐含调用基类和新增对象成员的构造函数,来初始化它们各自的数据成员,然后再加入新的语句对新增转载 2017-03-18 17:41:58 · 827 阅读 · 0 评论 -
static在c/c++中的作用
转自:http://blog.csdn.net/skyereeee/article/details/8000512static主要有三个作用:(1)局部静态变量(2)外部静态变量/函数(3)静态数据成员/成员函数前两种C和C++都有,第三种仅在C++中有,下面分别作以下介绍:一、局部静态变量在C/C++中, 局部变量按照存储形式可分为三种auto转载 2017-03-18 17:25:24 · 2212 阅读 · 0 评论 -
c++操作符重载
operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)。 一、为什么使用操作符重载?对于系统的所有操作符,一般情况下,只支持基本数转载 2017-03-18 17:19:17 · 449 阅读 · 0 评论 -
this指针
转自:http://blog.csdn.net/feiyond/article/details/1652505先要理解class的意思。class应该理解为一种类型,象int,char一样,是用户自定义的类型。(虽然比int char这样build-in类型复杂的多,但首先要理解它们一样是类型)。用这个类型可以来声明一个变量,比如int x, myclass my等等。这样就像变量x具有i转载 2017-03-18 17:13:46 · 542 阅读 · 0 评论 -
c++面向对象编程的特点
转自:http://www.cnblogs.com/njczy2010/p/5769520.htmlFirst: 抽象 面向对象方法中的抽象,是指对具体问题(对象)进行概括,抽出一类对象公共性质并加以描述的过程。 抽象的过程,也是对问题进行分析和认识的过程。 对问题的抽象应该包括两个方面:数据抽象 和 行为抽象(也就是功能抽象 和 代码抽象)。 用3转载 2017-03-18 17:11:14 · 1525 阅读 · 0 评论