C++
爱吃甜食_
一点点进步,让编程更有趣
展开
-
结构体中不能给指针申请空间(存疑,待解决)
做了个实验如下:struct errorTest{ const char *p = "hello"; char *ptr = new char[3]; ptr[0] = 'a';//编译器在ptr处提示:此声明没有存储类或类型说明符 ptr[1] = 'b'; ptr[2] = '\0';}原因:类内函数外只能定义全局变量和对象,而不能执行语句或调用,struct内定义规则类原创 2017-11-22 22:13:04 · 710 阅读 · 0 评论 -
const变量赋值原则
const int **p1; int *p2; p1 = &p2; // error 非const地址无法赋值给const 指针 const int temp_1 = 4; int temp_2 = 9; const int *pt_1; int *pt_2; pt_1 = &temp_1; pt_2 = &temp_1;//error const数据地址无法赋值给非co原创 2017-11-20 20:19:57 · 3507 阅读 · 0 评论 -
关于C++ const 的全面总结
C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助。Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。 一、Const作用 如下表所示:No.作用说明参考代码转载 2017-11-20 19:53:56 · 160 阅读 · 0 评论 -
C++表达式和左值
一表达式在C++中,任何值或者任何有效值和运算符号的组合都是表达式 。对任何表达式加上分号都可以成为语句。如:当判断表达式的值这种操作改变了内存中数据的值时,我们说表达式有副作用。因此,判定表达式会带来这样的副作用,即修改被复制者的值10//值为10的表达式10+10//值为20的表达式x=20//表达式的值为20x二左值可以通过以下两点来判定C++中的左值1 有名原创 2017-11-18 09:18:12 · 770 阅读 · 0 评论 -
获取C++虚表地址和虚函数地址
获取C++虚表地址和虚函数地址 By qianghaohao 学过C++的应该都对虚表有所耳闻,在此就不过多介绍概念了,通过实 例来演示一下如何获取虚表地址和虚函数地址。 简单说一下虚表的概念:在一个类中如果有虚函数,那么此类的实例中就有一个虚表指针指向虚表,这个虚表是转载 2017-11-17 11:35:12 · 635 阅读 · 0 评论 -
【C++】谈谈类定义里的this指针
在类的定义过程中,经常会使用到this关键字,那么我们来理解一下this指针在类定义中的作用。this只能在成员函数中使用全局函数、静态函数都不能使用this。实际上,成员函数默认第一个参数为T* const this。如:1class A2{3转载 2017-08-12 11:38:12 · 454 阅读 · 0 评论 -
遍历嵌套Map
原文地址:http://blog.csdn.net/computer055maxi/article/details/6055427最近开发中要用到STL,然后自己查看了一些资料,并写了一些代码。在使用中,想起了如果是map嵌套,该如何应用呢?下面是我的coding内容: 对于传统的map,我们只需要: #include #i转载 2017-05-03 18:26:24 · 959 阅读 · 0 评论 -
C++虚函数的原理
理解虚函数( virtual function )的几个关键点:1. 理解早绑定(early binding)、晚绑定(late binding)。所谓early binding:On compile time,就能明确一个函数调用是对哪个对象的哪个成员函数进行的,即编译时就晓得了确定的函数地址;所谓late binding:On compile time,对函数(虚函转载 2017-04-19 18:51:16 · 230 阅读 · 0 评论 -
虚函数和纯虚函数区别
虚函数和纯虚函数区别转载 2017-02-21 14:23:24 · 297 阅读 · 0 评论 -
浅拷贝与深拷贝
文章来源:http://ticktick.blog.51cto.com/823160/194307如果没有自定义复制构造函数,则系统会创建默认的复制构造函数,但系统创建的默认复制构造函数只会执行“浅拷贝”,即将被拷贝对象的数据成员的值一一赋值给新创建的对象,若该类的数据成员中有指针成员,则会使得新的对象的指针所指向的地址与被拷贝对象的指针所指向的地址相同,delete该指针时则会导致两次重复d转载 2017-04-12 17:41:52 · 199 阅读 · 0 评论 -
char c = 1 char c = "1" char c = '1'
char c = 1 表示ASCII码=1的字符char c = "1" 语法错误char c = '1' 表示1这个字符#includeint main(){ char a=1,b='1'; printf("%c %c\n",a,b);// 输出ASCII为1的字符和字符'1' return 0;}ASCII第一次以规范标准的型态发表是在1967原创 2017-11-16 14:45:40 · 15922 阅读 · 0 评论 -
数组存储字符串初始化
我们都知道字符串的结尾要有'\0',才会被解释成字符串结束。C++用数组存储字符串,初始化是个很有意思的东西。我们知道给一个int类型数组初始化部分赋值,其余部分会被自动补0,那char数组呢?做个实验: char haha[2] = { 'a','b' }; for (size_t i = 0; haha[i] != '\0'; i++) { printf("p:%p,原创 2017-11-22 20:37:09 · 708 阅读 · 0 评论 -
const变量通过指针修改 详解
本来以为const变量是无法修改的,今天发现“错了”(其实没错,通过const变量本事是无法修改其值的,但是在“某些情况下”可以通过指向它的指针来间接修改)一、const变量可以通过指针修改的情况例子:#include void main(void){ int const a = 10; int b = 20; int *p = (int*)&转载 2017-12-18 18:51:06 · 3339 阅读 · 2 评论 -
C++类所占内存大小计算
C++类所占内存大小计算转载时请注明出处和作者联系方式文章出处:http://blog.csdn.net/chenchong08作者联系方式:vision_chen@yeah.net说明:笔者的操作系统是32位的。class A {}; sizeof( A ) = ?sizeof( A ) = 1明明是空类,为什么编译器说它是1呢?空类同样可以实例化转载 2017-11-28 12:07:34 · 1950 阅读 · 0 评论 -
普通成员函数和内联函数调用区别(内含函数调用过程)
收先要注意的是,即使在代码中声明为内联函数,编译器也不一定接受,实现的时候不一定为内联函数。普通函数调用:执行到调用语句时,跳到函数代码存储区,然后执行局部变量压栈、参数压栈存、保护现场(存储函数调用后继续执行的地址)等操作。执行完后,跳回调用语句处。如:FUN_A调用FUN_BFUN_A ebp(栈堆基址指针)入栈,esp(堆栈栈顶指针)赋值给ebp作为FUN_B基址,申请内存,压栈原创 2017-11-23 16:36:40 · 1935 阅读 · 1 评论 -
const形参,何时创建临时变量
觉得书上写的不错,直接上图了。。。原创 2017-12-05 21:17:30 · 343 阅读 · 0 评论 -
动态数据结构
所谓动态数据结构,是指在运行时刻才能确定所需内存空间大小的数据结构,动态数据结构所使用的的内存称为动态内存。动态内存的使用有一定的危险,必须遵守一定的规则。动态申请的内存在不需要时必须及时释放,如果不断地申请动态内存而不加以释放,将导致内存资源的枯竭。 c++处理动态内存提供了一对操作符new和delete。new操作符用于动态申请内存,而delete操作符则用来释放动态申请的内转载 2017-11-26 00:16:36 · 494 阅读 · 0 评论 -
为什么结构体/类中,成员变量可以初始化不可以赋值?
类内部成员的初始化在C++98标准里,只有static const声明的整型成员能在类内部初始化,并且初始化值必须是常量表达式。这些限制确保了初始化操作可以在编译时期进行。例如: int var = 7; class X { static const int m1 = 7; // 正确 const int m2 = 7; // 错原创 2017-11-23 11:39:41 · 3938 阅读 · 0 评论 -
结构体定义 typedef struct 用法详解和用法小结
typedef是类型定义的意思。typedef struct 是为了使用这个结构体方便。具体区别在于:若struct node {}这样来定义结构体的话。在申请node 的变量时,需要这样写,struct node n;若用typedef,可以这样写,typedef struct node{}NODE; 。在申请变量时就可以这样写,NODE n;区别就在于使用时,是否可以省去str转载 2017-11-23 11:02:59 · 290 阅读 · 0 评论 -
二维数组地址
二维数组定义:int arr[2][3];typedef p arr[3];p *q;二维数组在内存中地址存储顺序:for (size_t i = 0; i < 2; i++) { for (size_t j = 0; j < 3; j++) { //数组地址线性增长,可能是arr[0][0],arr[0][1]。。。。也可能是arr[0][0],arr[1][0]原创 2017-11-21 20:27:44 · 1607 阅读 · 0 评论 -
c++类的成员函数在定义对象前分配了存储空间吗?
对于一般的类(非静态)来说,在定义类但还未创建对象的时候,类的所有成员(包括变量和函数)都占用着内存空间(准确地说占用着指令代码区),但不占用堆栈空间而创建对象的时候,会根据对象的类型占用堆栈的空间(用传统模式创建对象会占用栈空间,用引用+new模式创建对象会占用堆空间,同时引用会保存在栈里)对于静态(static)类来说,静态类是不能实例化创建对象的,所有的成员都是静态成员,也需转载 2017-11-22 21:50:04 · 3966 阅读 · 4 评论 -
什么时候调用复制构造函数(拷贝构造函数)
原文:Slyar Home (www.slyar.com)这个问题不是疑问了,查了一下国外网站,总结一下。假设Person是一个类,复制构造函数的调用会在以下几种情况下发生:1、对象在创建时使用其他的对象初始化Person p(q); //此时复制构造函数被用来创建实例pPerson p = q; //此时复制构造函数被用来在定义实例p时初始化p2、对象作为转载 2017-04-12 17:37:45 · 1812 阅读 · 0 评论 -
内存对齐
内存对齐可以使CPU读取数据效率加快,并且更好的适应各个平台。假设CPU每次读取4字节(32位系统),在以下情况:structstruct MyStruct{public: char c; int num;};若内存对齐,取int值,只需偏移 四字节后读取四字节即可。 此时CPU先访问一次内存,读取0—3字节的数据进寄存器,并再次读取4—5字节的数据进寄...原创 2017-03-29 00:49:10 · 217 阅读 · 0 评论 -
关于指针做参
一、用二级指针作为函数参数,有两种典型情况:1.需要传递一级指针的数组时:例如标准C的main函数:int main(int argc, char*[] argv),数组最高维可以退化,char*[] argv等价于char** argv。这里argv代表命令行参数数组。2.需要对传入的一级指针进行修改时:例如:void alloc_new_ch转载 2016-11-22 14:44:47 · 343 阅读 · 0 评论 -
字符串首字母排序
根据字符串的首字母进行排序。例如:“我的名字”,提取为“WDMZ”后进行排序。“11我的ab名字”,提取为"11WDabMZ"后进行排序。void FirstLetter(int nCode, CString& strLetter){ if (nCode >= 1601 && nCode < 1637) strLetter = _T("A"); if (nCode >= 1637原创 2016-11-10 17:18:35 · 3729 阅读 · 0 评论 -
wstring与string互转
wstring与string互转原创 2016-11-10 14:26:26 · 547 阅读 · 0 评论 -
汉字编码原则及0XA1与0X80代表的含义。(汉字编码原则为转发)
字符串转GB2312编码后,若码值小于0XA1,则表示这不是一个汉字。字符串转GB2321编码后,若码值小于0X80,则表示此字符串是有两个部分拼接而成。网上得到字符串对应的编码都是直接转unsigned char,若是使用UNICODE,则需先将字符串转char,然后强转得到高地位,相加后可得对应的GB2312编码。int iLength;char cName[1024];原创 2016-11-07 16:45:07 · 33894 阅读 · 0 评论 -
INI文件
_TCHAR iniPath[MAX_PATH];CString displayMsg;SHGetSpecialFolderPath(NULL, iniPath, CSIDL_APPDATA, FALSE);_tcscat_s(iniPath, _T("\\JiMiDun"));if (_taccess_s(iniPath, 0) != 0)_tmkdir(iniP原创 2016-08-24 11:14:51 · 291 阅读 · 0 评论 -
GetMemory函数详解
#include #include #include using namespace std;char *GetMemory(char *&p, int num){p = (char *)malloc(sizeof(char)*num);//p = new char[num];return p;}int main(void){char *转载 2015-10-22 10:05:13 · 453 阅读 · 0 评论 -
C++基础细节(一)
1.C++将非零的值解释为TRUE,将零解释为FALSE.任何数字或指针都可隐式转换为bool值。任何非零值被转换为TRUE,零值被转换为FALSE。2.对于超越变量范围的赋值,其值将为范围另一端的取值。变量在内存中的存储可以看成一个环。以short为例。无符号short,0位重置点,从0至65535依此增大,65535+1为0,0-1为65535。有符号short,从0至3276原创 2015-08-25 09:16:57 · 362 阅读 · 0 评论 -
typedef和#define的区别
#typedef是为类型起别名,在编译中与 类型名起相同作用。用法:#tyepedef 类型名 别名; 如:#typedef int INT#define是预处理器指令,在编译时会进行简单的替换,不检查正确性。用法:#define 替换值 被替换值 如:#define NUM 50 (后面无分号)一、使用范围#typedef只能用于给变量起别名,#define可以用原创 2015-09-16 10:18:28 · 506 阅读 · 0 评论 -
strcat_s详解
strcat_s是为了解决字符串拼接溢出在VS2005之后引进的更具安全性的函数。strcat_s本身保留了两个变量strcat的特性,即可以使用两个参数的函数原型。如stract_s(str1,str2);将str2拼接到str1后。strcat_s新增三个参数的函数原型,如strcat_s(str1,sizeof(str1),str2)。超出范围会有断言。一下为特殊情况:1.当原创 2015-08-27 19:51:39 · 18791 阅读 · 3 评论 -
C++类所占空间总结
1.空类可以实例化,且所占空间为一。原因:编译器想为每个实例化对象分配一个独一无二的内存地址。2.类中有虚函数,则无论类中有几个虚函数,类所占空间加4。原因:类中存放一个4字节的虚指针指向虚函数列表(所有虚函数都在虚函数列表中,虚函数列表的每一项存储一个虚函数的地址);3.类中的静态变量不占类的存储空间,非静态变量按对齐后的大小计算总值(默认对齐为4)。原因:静态变量存原创 2015-08-21 19:22:48 · 476 阅读 · 0 评论 -
常用正则表达式
常用正则表达式转载 2017-02-16 14:41:58 · 238 阅读 · 0 评论 -
模板函数
1.函数模板1)函数模板是通过建立一个通用函数,参数类型不指定,执行形同行为的函数都可以使用这个模板。2)函数模板与重载最大的区别是,重载函数可以执行不同的行为,而函数模板只能执行相同的行为。3)函数模板可以实例化各种类型,但当两个类型不一样时,会强转成第一个类型。如:templatevoid CC(T a,T b){ cout << "AA" << a << endl;原创 2017-02-28 00:51:35 · 618 阅读 · 0 评论 -
define宏定义中的#,##,@#及/符号
1、# (stringizing)字符串化操作符。其作用是:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。如:#define example(instr) printf("the input string is:/t%s/n",#instr)#define example1(instr) #ins转载 2017-04-11 17:58:11 · 364 阅读 · 0 评论 -
do {...} while (0) 在宏定义中的作用
如果你是一名C程序员,你肯定很熟悉宏,它们非常强大,如果正确使用可以让你的工作事半功倍。然而,如果你在定义宏时很随意没有认真检查,那么它们可能使你发狂,浪费N多时间。在很多的C程序中,你可能会看到许多看起来不是那么直接的较特殊的宏定义。下面就是一个例子:12#define __set_task_state(tsk, state_v转载 2017-04-12 10:28:08 · 201 阅读 · 0 评论 -
关于typedef的用法总结
原文知识点概括:用途一:与#define的区别用途二:减少错误用途三: 直观简洁用途四:平台无关性用途五:掩饰复合类型用途六:代码简化用途七:typedef 和存储类关键字(storage class specifier)原文链接:http://blog.csdn.net/wangqiulin123456/article/details/828493转载 2017-04-11 17:18:08 · 175 阅读 · 0 评论 -
如何理解复杂的声明
理解复杂声明可用的“右左法则”:从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。举例:int (*func)(int *p); 首先找到变量名func,外面有一对圆括号,而且左边是一个*号,这说明func是一个指针;然后跳出这个圆括号,先看右边,又遇到圆括号,这说明(*func)是一个函数,所以fu原创 2017-04-11 17:28:36 · 239 阅读 · 0 评论 -
二分查找
学习算法的过程中,我们除了要了解某个算法的基本原理、实现方式,更重要的一个环节是利用big-O理论来分析算法的复杂度。在时间复杂度和空间复杂度之间,我们又会更注重时间复杂度。时间复杂度按优劣排差不多集中在:O(1), O(log n), O(n), O(n log n), O(n2), O(nk), O(2n)到目前位置,似乎我学到的算法中,时间复杂度是O(log n),好像就原创 2017-03-19 23:00:13 · 205 阅读 · 0 评论