c++基础
文章平均质量分 77
SHForWork
这个作者很懒,什么都没留下…
展开
-
C++ 虚函数表解析虚函数表
虚函数表 对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重转载 2015-03-03 20:49:06 · 582 阅读 · 0 评论 -
cin、cin.get()、getline()(讲解的很详细)
转自http://blog.csdn.net/xuexiacm/article/details/8101859cin.get,cin.getline等函数深入分析很多初学者都认为cin函数是一个很简单的函数,其实不然!cin函数有很多需要了解的知识(比如:cin的返回值是什么,cin提供了哪些成员函数且分别是什么作用,如cin.clear(),cin.ignore(),转载 2015-04-05 16:03:03 · 720 阅读 · 0 评论 -
VS使用命令行选项查看对象的内存布局
微软的Visual Studio 2008(VS2008)提供了一个新的选项,给用户显示C++对象在内存中的布局。这个选项就是/d1reportSingleClassLayout。具体使用方法如下,在写好相应的cpp文件之后,需要启动VS2008的命令行工具“Visual Studio 2008 Command Prompt”,(在工具下面:visual stdio命令提示)切转载 2015-03-09 20:44:19 · 1642 阅读 · 0 评论 -
printf("%d",5.01)和printf("%f",5)的输出结果
转 http://blog.csdn.net/yahohi/article/details/7701434[cpp] view plaincopyprint?printf("%f\n",5); printf("%d\n",5.01); printf("%f\n", (float)5); printf("%f\n", 5.f转载 2015-03-10 20:46:26 · 725 阅读 · 0 评论 -
typeid详解
在揭开typeid神秘面纱之前,我们先来了解一下RTTI(Run-Time Type Identification,运行时类型识别),它使程序能够获取由基指针或引用所指向的对象的实际派生类型,即允许“用指向基类的指针或引用来操作对象”的程序能够获取到“这些指针或引用所指对象”的实际派生类型。在C++中,为了支持RTTI提供了两个操作符:dynamic_cast和typeid。 dyn转载 2015-03-10 16:59:26 · 689 阅读 · 0 评论 -
派生类不能在成员初始化列表中直接初始化基类的成员
初始化基类成员构造函数是不可继承的。因此,派生类的构造函数必须通过调用基类的构造函数初始化基类成员,不能够在派生类初始化列表直接初始化基类的成员,“越级初始化”。派生类的构造函数的一般格式为:派生类名(形参表):基类名1(形参表1),基类名2(形参表2)···{···}注意事项:(1)在创建派生类对象时,先调用基类的构造函数,然后调用派生类的构造函数;撤销对转载 2015-03-10 11:01:33 · 2024 阅读 · 0 评论 -
const 修饰函数参数,返回值,函数体
看到const 关键字,C++程序员首先想到的可能是const 常量。这可不是良好的条件反射。如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮。const 更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。const 是constant 的缩写,“恒定不变”的意思。被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多C++程序设转载 2015-03-08 10:11:19 · 509 阅读 · 0 评论 -
C++中delete和delete[]的区别
转:http://www.cnblogs.com/charley_yang/archive/2010/12/08/1899982.html 一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论。做个备份,以免丢失。 C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象转载 2015-03-08 09:37:15 · 380 阅读 · 0 评论 -
C++析构函数为什么要为虚函数
1.为什么基类的析构函数是虚函数? 在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。 下面转自网络:源地址 http://blog.sina.com.cn/s/blog_7c773cc50100y9hz.html a.第一段代码 #includeusing namespace std;class ClxB转载 2014-12-28 11:08:45 · 581 阅读 · 1 评论 -
static成员必须在类外初始化
转:http://www.cnblogs.com/graphics/archive/2010/07/16/1778743.html为什么static成员必须在类外初始化为什么静态成员不能在类内初始化在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样class A{ private: static int转载 2015-03-07 16:43:30 · 456 阅读 · 0 评论 -
模板声明与定义要放在同一文件中
“通常情况下,你会在.h文件中声明函数和类,而将它们的定义放置在一个单独的.cpp文件中。但是在使用模板时,这种习惯性做法将变得不再有用,因为当实例化一个模板时,编译器必须看到模板确切的定义,而不仅仅是它的声明。因此,最好的办法就是将模板的声明和定义都放置在同一个.h文件中。这就是为什么所有的STL头文件都包含模板定义的原因。”[1]"标准要求编译器在实例化模板时必须在上下文中可以查看到其转载 2015-03-08 14:32:12 · 560 阅读 · 0 评论 -
赋值操作符和拷贝构造函数
今天在看一个消息结构的定义类时,有一个这样的接口WF_MSG & operator=(const WF_MSG & _msg);开始不是很明白,后来才知道这是赋值操作符,也通过这个深刻了解了赋值操作符,因为还定义了一个unsigned char * m_pMsgBuffer; /// 消息缓存指针 的指针,一般默认的赋值操作符是浅拷贝,而因为有消息缓存指针的变量,当这个消息类有两个转载 2015-03-08 09:55:12 · 484 阅读 · 0 评论 -
C++中定义比较函数的三种方法
转自http://www.cnblogs.com/lengbingshy/p/3491192.htmlC++编程优与Pascal的原因之一是C++中存在STL(标准模板库)。STL存在很多有用的方法。C++模板库中的许多方法都需要相关参数有序,例如Sort()。显然,如果你想对一个集合进行排序,你必须要知道集合中的对象,那个在前那个在后。因此,学会如何定义比较方法是非常重要的。转载 2015-04-14 13:38:01 · 1295 阅读 · 0 评论 -
C++重载箭头操作符的理解
转自http://blog.csdn.net/custa/article/details/5674434箭头操作符(->)的通常用法是,使用一个类对象的指针来调用该指针所指对象的成员。左操作数为对象指针,右操作数为该对象的成员。定义重载箭头操作符之后看起来就有点特别,可以用类对象的指针来调用,也可以用类对象直接调用。 重载箭头操作符,首先重载箭头操作符必须定义为类成员函数。转载 2015-05-21 16:09:18 · 696 阅读 · 0 评论 -
C++成员函数指针详细使用指南
在C++程序中,很多函数是成员函数,即这些函数是某个类中的一部分。你不可以像一个普通的函数指针那样指向一个成员函数,正确的做法应该是,你必须使用一个成员函数指针。一个成员函数的指针指向类中的一个成员函数,并和以前有相同的参数,声明如下:float (SomeClass::*my_memfunc_ptr)(int, char *); 对于使用const关键字修饰的成员函数,声明如转载 2015-05-31 19:58:54 · 756 阅读 · 0 评论 -
C/C++之回调函数
作者:助你软件工作室 出处:http://www.cnblogs.com/chenyuming507950417/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。转自 http://www.cnblogs.com/chenyuming507950417/archive/2012/01/02/23101转载 2015-08-24 18:59:57 · 404 阅读 · 0 评论 -
多重继承和虚继承的内存布局
转自http://blog.csdn.net/littlehedgehog/article/details/5442430多重继承和虚继承的内存布局刺猬@http://blog.csdn.net/littlehedgehog 这篇文章主要讲解虚继承的C++对象内存分布问题,从中也引出了dynamic_cast和static_cast本质区别、虚函数表的格式转载 2015-07-13 19:48:24 · 447 阅读 · 0 评论 -
CloseHandle以及内核对象的释放
转自http://blog.csdn.net/a102111/article/details/8501620函数说明BOOL CloseHandle(HANDLE hObject);参数hObject :代表一个已打开对象handle。返回值TRUE:执行成功;FALSE:执行失败,可以调用GetLastError()获知失败原因。函数用于关闭一转载 2015-06-15 11:36:01 · 1085 阅读 · 0 评论 -
C++中this指针的用法详解
转自http://blog.chinaunix.net/uid-21411227-id-1826942.html1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this转载 2015-06-07 10:09:36 · 521 阅读 · 0 评论 -
c++hash_map
为什么需要hash_map 用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能。例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改: 岳不群-华山派掌门人,人称君子剑 张三丰-武当掌门人,太极拳创始人 东方不败-第一高手,葵花宝典 ... 这些信息如果保存下来并不复杂,但是找起来比较麻烦。例如我要找"张三丰"的信息,最傻的转载 2015-06-05 16:04:16 · 532 阅读 · 0 评论 -
memcopy和memmove的区别
转自http://www.cnblogs.com/BeyondAnyTime/archive/2012/05/10/2495013.htmlmemcopy和memmove函数在linux下看了一下两个函数的源码。两个函数都在头文件string.h中定义,函数原型为:void * __cdecl memcpy ( void * dst,const void * src,s转载 2015-06-26 16:09:18 · 659 阅读 · 0 评论 -
STL hash_map 底层初探
转自http://blog.csdn.net/caigen1988/article/details/7876397 hash_map 底层是采用hashtable实现的,在讲解hash_map之前,先看一下hash_table的原理。(1)hashtable数据结构hash table表格内的元素称为桶(bucket),而由桶所链接的元素称为节点(node),其中存入转载 2015-06-05 19:24:33 · 481 阅读 · 0 评论 -
C++四种强制类型转换运算符
转自http://blog.csdn.net/jsc0218/article/details/21567687C++有四种强制类型转换符,分别是dynamic_cast,const_cast,static_cast,reinterpret_cast。其中dynamic_cast与运行时类型转换密切相关,在这里我们先介绍dynamic_cast,其他三种在后面介绍。转载 2015-06-04 16:07:26 · 790 阅读 · 0 评论 -
C++ 智能指针类
转自http://blog.csdn.net/heyabo/article/details/8791410这篇文章主要来源于:codeguru网站的一篇文章:A TR1 tutorial:smart pointer (详细介绍了C++的智能指针,尤其是shared_ptr)。众所周知,在 TR1 之前,C++标准库中的智能指针只有auto_ptr,但由于它的【排他所有权模转载 2015-06-04 19:40:51 · 614 阅读 · 0 评论 -
const重载解析
转自http://blog.csdn.net/net_assassin/article/details/9997257所谓重载,是指允许存在多个同名函数,而这些函数的参数表不同,即函数名相同但函数的签名不同。重载并不是面向对象编程的特有属性,这是因为重载是在编译阶段实现的,编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(这一点稍后有例子)。了转载 2015-05-22 15:28:47 · 530 阅读 · 0 评论 -
变长参数函数
变长参数的函数即参数个数可变、参数类型不定 的函数。设计一个参数个数可变、参数类型不定的函数是可能的,最常见的例子是printf函数、scanf函数和高级语言的Format函数。在C/C++中,为了通知编译器函数的参数个数和类型可变(即是不定的、未知的),就必须以三个点结束该函数的声明。view plaincopy to clipboard转载 2015-06-01 16:17:13 · 533 阅读 · 0 评论 -
C++ new A和new A()的区别详解
转自http://blog.csdn.net/xiajun07061225/article/details/8796257我们在C++程序中经常看到两种new的使用方式:new A以及new A()。那么这两种究竟有什么区别呢?调用new分配的内存有时候会被初始化,而有时候不会,这依赖于A的类型是否是POD(Plain old data)类型,或者它是否是包含POD成员、使用编转载 2015-06-22 11:29:24 · 769 阅读 · 0 评论 -
new和malloc的区别
1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void *malloc(unsigned int num_bytes); 说明:分配长度为num_bytes字节的内存块。如果分配成功则返回指向被分配内存的指针,分配失败返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。1.转载 2015-03-05 10:30:07 · 444 阅读 · 0 评论 -
C++中什么时候调用副本构造函数初始化一个类对象
http://blog.sina.com.cn/s/blog_6ab0b9a801019b3h.html 上一篇文章中提到了一种使用副本构造函数初始化类对象的情况,这里也会陈述几种情况。参考网站:http://www.91tech.net/Article/SoftTech/vctech/200410/118.html网站上没有陈述上篇文章提到的调用副本构造函数初始类对象转载 2015-03-15 13:39:23 · 1573 阅读 · 0 评论 -
函数指针
一、普通的函数指针一旦函数被编译并载入计算机中执行,它就会占用一块内存,这块内存有一个地址,因此函数也有地址。 1. 定义一个函数指针示例代码如下:void (*funcPtr)();这个例子将funcPtr定义为一个指向函数的指针,这个函数没有参数,返回值为空。注:*funcPtr 两侧的括号是必须的,如果去掉括号, void转载 2015-03-03 20:56:16 · 526 阅读 · 0 评论 -
C++类中的静态成员变量和静态成员函数的作用
数据成员可以分为静态变量、非静态变量两种。静态成员:静态类中的成员加入static修饰符,即是静态成员,可以使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以 静态成员不能访问非静态成员,因为静态成员存在于内存,所以非静态成员可以直接访问类中的静态成员。非静态成员:所以没有加static的成转载 2014-12-28 11:10:00 · 617 阅读 · 0 评论 -
VC #define EC(x) L##x 作用说明
#define EC(x) L##x 作用说明表示L与x连接。#define Conn(x,y) x##y#define ToChar(x) #@x#define ToString(x) #xx##y表示什么?表示x连接y,举例说:int n = Conn(123,456); 结果就是n=123456;char* str = Conn("asdf", "adf")结果转载 2014-12-28 11:07:26 · 475 阅读 · 0 评论 -
一个由c/C++编译的程序占用的内存分几个部分
一、预备知识—程序的内存分配 堆(heap)和栈(stack)是C/C++编程不可避免会碰到的两个基本概念。首先,这两个概念都可以在讲数据结构的书中找到,他们都是基本的数据结构,虽然栈更为简单一些。 在具体的C/C++编程框架中,这两个概念并不是并行的。对底层机器代码的研究可以揭示,栈是机器系统提供的数据结构,而堆则是C/C++函数库提供的。转载 2014-12-28 11:00:10 · 921 阅读 · 1 评论 -
标准C++中的string类的用法总结
标准C++中的string类的用法总结相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用。但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯定的。也许有人会说,即使不用MFC框架,也可以想办法使用MFC中的API,具体的操作方法在本文最后给出操作方法。其实,可能很多人很可能会忽略掉标准C+转载 2014-12-28 10:50:23 · 517 阅读 · 0 评论 -
C语言查遗补缺——关于自增运算符的有趣的例子
只是找了一些例子并运行,没有总结出个规律来,想不清楚内部机制,大家一起给总结一下吧~首先是跟宏定义结合,这是笔试题中可能遇到的题目,然后展开讨论,关于后自增在逻辑运算符和加法运算符中的区别,但是没有总结出规律,也不明白本质上怎么破。。欢迎大家留言给予指导~[cpp]#define BAND1(x) (((x) >= 5)&&((x) #define BAND2(x转载 2014-12-28 11:13:14 · 543 阅读 · 0 评论 -
void及void指针含义的深刻解析
void的含义void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。void指针使用规范①void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值。例如:int * pint;void *pvoid;pvoid = pint; /* 不过不能 pint= pvoid; */如果要将pvoid赋给其他类型指针,转载 2014-12-28 11:05:41 · 415 阅读 · 0 评论 -
找出一个字符串中不含重复字符的最长子字符串
找出一个字符串中不含重复字符的最长子字符串采用动态规划,若已知以第i-1位字符为结尾的最长子字符串长度l[i-1],并知道第i-1位字符上一次出现的位置k,就可以求出以第i个字符为结束的最长子字符串(min(l[i-1]+1,i-k)。遍历字符串就可以求出最长子串,时间复杂度为O(n),代码如下#include "stdafx.h"#includeusing转载 2014-12-28 11:11:15 · 896 阅读 · 0 评论 -
printf函数对参数的计算顺序,是从右往左的
[cpp] view plaincopy#include void main() { int i=2; printf("%d,%d,%d,%d,\n",i++,++i,i,i++); printf("%d\n",i); } 首先,应该说明的是在不同的编译环境中结果是不一样的。转载 2014-12-28 11:07:57 · 641 阅读 · 0 评论 -
C++类模板的三种特化
说起C++的模板及模板特化, 相信很多人都很熟悉 ,但是说到模板特化的几种类型,相信了解的人就不是很多。我这里归纳了针对一个模板参数的类模板特化的几种类型, 一是特化为绝对类型; 二是特化为引用,指针类型;三是特化为另外一个类模板。 这里用一个简单的例子来说明这三种情况:// general versiontemplateclass T>class Compare{pu转载 2014-12-28 11:06:43 · 427 阅读 · 0 评论 -
typedef和#define 详解
1 typedef语句是在编译过程中被解析的,而#define是在编译之前的预处理过程中被解析的。#define所进行的只是对自定义别名的简单替换, 而typedef则要灵活得多。总的来说,typedef可以做到#define所能做的所有事情,而且可以做得更好。 3 #define比较特别的一点是它可以用一个自定义的符号名去代替一个value并且可以定义一个类似于函数的宏,而typedef不转载 2014-12-28 11:02:20 · 475 阅读 · 0 评论