
C++编程
SprintfWater
My English name is SpringWater
展开
-
多维数组指针值
代码: int p[10][10]; int **q = p; printf("%0x\n%0x\n", &q, q); printf("----------------------------------------\n"); printf("%0x\n%0x\n%0x\n%0x\n%0x\n", &p, p, &p[0], p[0], &p[0][0]); printf("---原创 2015-01-15 21:32:14 · 776 阅读 · 0 评论 -
C++当多次调用同一实参的模板,到底编译器实列化几次份代码的问题
提问:template void fun(T num){};如果调用fun(double(1.23));fun(int(1));编译器会实列化fun(double num)和fun(int num)但是我想问得是如果调用两次fun(int)fun(int(1));fun(int(2));编译器会实列两个fun(int),还是一个啊????疑惑至极。求好原创 2013-04-16 14:55:17 · 1369 阅读 · 0 评论 -
T t(2), T t = 2, T t = T(2)三者完全等价
T t(2), T t = 2, T t = T(2)三者完全等价#include #include #include using namespace std;class T{ public: T(){}; T(int t) { cout << "复制" << endl;原创 2013-04-15 16:21:34 · 942 阅读 · 0 评论 -
c++ 如何实现多态
#include #include #include #include using std::cerr;using std::cout;using std::string;//实覆盖class A1...{public: A1(string const& name) : m_Name(name) ...{cout << getName()转载 2013-04-15 22:05:56 · 884 阅读 · 0 评论 -
C++多态的实现原理
1. 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。2. 存在虚函数的类都有一个一维的虚函数表叫做虚表。类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。3. 多态性是一个接口多种实现,是面向对象的核心。分为类的多态性和函数的多态性。4. 多态用虚函数来实现,结合动态绑定。5. 纯虚函数是虚函数再加上= 0。6. 抽象类是指包转载 2013-04-15 20:32:18 · 682 阅读 · 0 评论 -
当派生类和基类的虚构函数默认实参不同时的传递问题
当派生类和基类的虚构函数默认实参不同时;派生类的实参将接收基类传递过来的默认参数示列如下:#include #include #include using namespace std;class B{ public: virtual void fun(int num = 0) { cout << "B原创 2013-04-15 16:47:47 · 1121 阅读 · 0 评论 -
C++ 强制转换出现歧义问题
#include #include #include using namespace std;class T{ public: T(){}; T(int a){num = a;}; operator int const ()//将t + 3中的t转换为int型的10,变为10 + 3,也不会调用重载的<< { cout << "to be int:";原创 2013-04-15 11:37:08 · 1417 阅读 · 0 评论 -
C++运算符+,+=,<<,=重载范列
单操作符用返回引用,不能是友元函数,否则编译不通过双操作符,必须定义为友元,否则编译不通过测试编译器:g++ 4.6.3#include #include #include using namespace std;class T{ public: T(){}; T(int t) { a = t; }; T(const T &t)//当原创 2013-04-15 10:41:45 · 931 阅读 · 0 评论 -
模板与泛型的区别
Visual C++ Language ReferenceGenerics and TemplatesGenerics and templates are both language features that provide support for parameterized types. However, they are different and have different翻译 2013-04-12 11:25:28 · 4156 阅读 · 1 评论 -
C++ const函数返回值必须为const引用
编译正确代码:#include#include #includeusing namespace std;class T{ public: T(string p) { ptext = p; } const char & operator [](int pos) const { return ptext[pos]; } string ptext;原创 2013-04-30 15:15:31 · 6209 阅读 · 3 评论 -
C++类static静态成员变量和const常量成员变量(和引用相同)初始化方法
a为const常量成员c为static静态成员 常量和引用,必须通过参数列表进行初始化。 静态成员变量的初始化也颇有点特别,是在类外初始化且不能再带有static关键#include#includeusing namespace std;class T{ public: T(int b):a(b) { ; } const i原创 2013-04-30 10:02:28 · 1248 阅读 · 0 评论 -
C++在类之间调用static_cast转换时,需要复制构造函数
下面代码因为T2没有实现T2(T1)复制构造函数,所以编译错误g++报错:test.cpp|23 col 25| 错误: 对‘T2::T2(T1&)’的调用没有匹配的函数#include #include#include #include#include using namespace std;class T1{ public: int a; double b;};原创 2013-05-01 10:26:10 · 1958 阅读 · 0 评论 -
内存结构体对齐总结
结构体对齐目的:1:访问速度:为了不让同一个变量(同时包括整个结构变量和结构体内部成员变量)分布在多个cache line上,然后两次访问内存。2:平台限制:有些平台不能随意读取某个偏移的地址变量如结构体:struct AT{ char a; char b; int c; char d;};因为cpu是以cachel原创 2015-01-27 15:52:44 · 2192 阅读 · 0 评论 -
结构体对齐
#include #include #include #include #include #include using namespace std;struct T1{ long long c; short a; int b; char f; char d; char e;};struct T2{ int a; char b; char d; char e;原创 2013-04-08 19:25:55 · 1118 阅读 · 0 评论 -
C 二维数组(指针)动态分配和释放
先明确下概念:所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据。如果我们将总长128位的指令分别按照16位、32位、64位为单位进行编辑的话:旧的16位处理器,比如Intel 80286 CPU需要8个指令,32位的处理器需要4个指令,而64位处理器则只要两个指令,显然,在工作频率相同的情况下,64位处理器的处理速度会比16位、3转载 2013-10-05 20:57:25 · 1528 阅读 · 0 评论 -
C++类静态成员变量和const常量的初始化方法
C++类静态成员变量和const常量在定义类的时候就必须初始化,否则都会编译出错。而具初始化方法为:C++类静态成员变量初始化方法#include #include #include #include using namespace std;class A{public: static void fun() {原创 2013-07-02 10:46:59 · 6909 阅读 · 0 评论 -
至老师书
尊敬的向老师,陈老师您们好! 原本不想打扰老师的,可是我最近确实遇到很纠结的思绪,理不清!感觉自己很不在状态!希望得到老师的建议!先阐述一下我内心的困惑吧: 1.按理说省赛没获得一等奖,是遗憾的,该再接再厉,争取弥补遗憾; 2.按理说在和LOKY组队过程中,没能做主键手,在代码方面没有得到很大的提升,该再接再厉,再用一年来把代码能力提高;原创 2013-01-03 18:32:53 · 1152 阅读 · 0 评论 -
c/c++重定向
这个对经常在OJ上做题的童鞋们很有用。OJ基本都是用标准输入输出(USACO除外)。但如果你在调试的时候也都是从控制台输入,那就太浪费宝贵的时间了。我们可以重定向标准输入,调试的时候从文件读,提交时从标准输入读。在C语言中,方法比较简单。使用函数freopen():freopen("data.in","r",stdin);freopen("data.out","w",stdout);转载 2013-06-26 11:27:43 · 1303 阅读 · 0 评论 -
一个进程能用的最大内存(堆区)空间大小为1G
网上看到的分析:32位意味着4G的寻址空间,linux把它分为两部分:最高的1G(虚拟地址从0xC0000000到0xffffffff)用做内核本身,成为“系统空间”,而较低的3G字节(从0x00000000到0xbffffff)用作各进程的“用户空间”。这样,理论上每个进程可以使用的用户空间都是3G。当然,实际的空间大小收到物理存储器大小的限制。虽然各个进程拥有其自己的3G用户空间,系统空间原创 2013-05-02 23:23:54 · 15698 阅读 · 1 评论 -
C++ static成员直到整个程序结束才释放空间,函数返回也不会释放
#include #include using namespace std;class T{ public: T() { cout << "constuct" << endl; } ~T() { cout << "destroy" << endl; }};T fun(){ static T t; return t;}int main(){原创 2013-05-01 23:25:51 · 2766 阅读 · 0 评论 -
ostream_iterator用法,以及unique_copy函数功能测试
#include #include #include #include using namespace std;int main(){ int s[8] = {6, 6, 1, 5, 2, 5, 3, 3}; vector vec(s,s+ 8); ostream_iterator out(cout, " "); unique_co原创 2013-04-12 10:14:51 · 1223 阅读 · 0 评论 -
复制构造函数跟赋值构造函数的区别
1. 何时调用复制构造函数 复制构造函数用于将一个对象复制到新创建的对象中。也就是说,它用于初始化过程中,而不是常规的赋值过程中。类的复制构造函数原型通常如下: class_name(const class_name&); 它接受一个指向类对象的常量引用作为参数。例如,String类的复制构造函数的原型如下: String(const String&); 新建一个对象转载 2013-04-12 14:14:06 · 742 阅读 · 0 评论 -
stl 顺序容器vector(priority_queue),顺序容器List,顺序容器deque(queue, stack)详解
三种容器均支持resieze()操作,重新划定容器大小,且此函数有重载。默认情况下:queue,stack是基于deque实现的,priority_queue是基于vector实现的。list是双向链表。map是红黑树实现的vector基本操作:vector v;//定义一个空容器vector v1(v);//将v通过构造函数拷贝给v1v.emp原创 2013-04-09 14:36:46 · 1790 阅读 · 0 评论 -
C++中的explicit作用功能(防止隐式转换)
C++中的explicitC++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色。 1 是个构造器 2 是个默认且隐含的类型转换操作符。所以, 有时候在我们写下如 AAA = XXX转载 2013-04-03 18:44:14 · 3296 阅读 · 0 评论 -
《Effective C++》读书摘要
最近刚读完侯捷的《Effective C++》,相对来说,这本书的内容比较贴近基础,对于刚掌握C++基础的人会有不少的提高。不过书中还是涉及了不少C++的高级特性,阅读起来需要查阅相关的资料。书中给出了大量的示例和代码来说明具体规则的原理,我按照书中给出的标题将每个条目的关键内容整理如下。一方面是保留一份读书笔记,另一方面也是为了方便日后查阅方便。当然,如果不能从简单摘要的内容回忆起具体信息,到时转载 2013-04-02 14:41:08 · 998 阅读 · 0 评论 -
QTextEdit捕捉回车信号
最近由于课程设计的需要,我选择用Qt开发一款简单的聊天程序。其中,输入框我选择QTextEdit,我的想法是,输入完毕之后敲回车键就能够将信息发送出去,但是遗憾的是,QTextEdit并不像QLineEdit那样,有一个enterPressed信号,取而代之的是,当你敲回车键的输入,只是起到输入换行的效果。于是我尝试着像QQ那样,以Ctrl + Enter组合键发送消息。经过我查阅多方资料之后转载 2013-03-04 21:00:05 · 9641 阅读 · 2 评论 -
基于UML的面向对象分析与设计方法
面向对象分析面向对象分析的目的是知识客观世界并进行建模.其实在面向对象的分析过程中也是对需求的分析和理解.基于UML面向对象分析的过程一般如下:获取问题陈述-->确定类-->准备数据字典-->确定关联-->使用继承来细化类型-->完善对象模型-->建立对象动态模型-->建系统功能模型(1) 获取问题陈述就是与用户一起理解系统,搞清楚系统的业务逻辑,发现用户的需求,在这个时候转载 2013-01-19 17:54:15 · 1648 阅读 · 0 评论 -
C++中explicit关键字的作用
explicit用来防止由构造函数定义的隐式转换。要明白它的作用,首先要了解隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。例如:class things{ public: things(const std::string &name = ""): m_name(name),height转载 2013-01-17 21:54:14 · 480 阅读 · 0 评论 -
rpos为逆向迭代器reverse_iterator ,pos为正向迭代器
对于逆向迭代器,很重要的一点是需要弄清楚逻辑位置和实际位置二者的区别。下图显示了逆向迭代器的位置和所指的数值:可以发现,逆向迭代器所指位置(实际位置)和所代表的的数值(逻辑位置或数值)是不同的。C++这么做是有其原因的。导致这个行为的原因是区间的半开性。为了能够制定容器内的所有元素,我们必须运用最后一个元素的下一个位置。但是对于reverse迭代器而言,这个位置位于第一个元转载 2013-01-16 16:42:39 · 1114 阅读 · 0 评论 -
禁止使用类的copy构造函数和赋值操作符
如果想让你的类不能使用copy构造函数和赋值操作符,只要将该类的copy构造函数和赋值操作符函数定义为private即可,并且只是声明,不用实现.class TestClass{public: TestClass() :X(0) { } TestClass(int x) :X(x) {转载 2013-01-03 16:57:25 · 811 阅读 · 0 评论 -
C++学习路线
2012-03-03 21:17 56人阅读 评论(0)收藏 举报 学习C++从入门到精通的的十本最经典书籍 (一)语言入门: 1.《C++ Primer》 适合有丰富C经验,缺乏C++经验的。不过我个人一直认为此书带着过于强烈的C语言的痕迹,对于C++的学习未必是好事。 2.《The C++ Programm转载 2013-01-03 17:53:51 · 2974 阅读 · 0 评论 -
C++可怜的内存管理机制漫谈及奇怪补救auto_ptr介绍
一直以来C++遵循着一种哲学式的美学设计。很重要的一条就是不为你不需要的付出代价。就我目前所知,整个C++仅仅只在虚函数和多重继承中违背了这条原则。很多非常有用的东西都因为这条原理而否定了。因此C++才能保持着一条定律,那就是只要程序员足够厉害,C++可以足够的快,因为程序员几乎掌握着一切可以用来优化的东西。其中,资源回收系统就是因为这样被否决了。以前一直不觉得怎么样,因为C++社群的舆论导向,甚转载 2013-04-04 01:40:09 · 1034 阅读 · 0 评论 -
C++异常处理 智能指针与MiniDump详解(2)
一、 综述《异常处理与MiniDump详解(1) C++异常》稍微回顾了下C++异常的语法及其类似于函数参数传递的抛出异常对象的copy,引用语义,但是有个问题没有详细讲,那就是C++异常的绝佳搭档,智能指针。在没有智能指针的时候会感觉C++的异常少了一个用于释放资源的finally语法,但是C++没有这样的语法是有理由的,因为C++的智能指针。假如不用智能指针仅仅使用异常,那就像是吃一道转载 2013-04-04 01:44:36 · 965 阅读 · 0 评论 -
C++异常处理与MiniDump详解(1)
一、 综述我很少敢为自己写的东西弄个详解的标题,之所以这次敢于这样,自然还算是有点底气的。并且也以此为动力,督促自己好好的将这两个东西研究透。当年刚开始工作的时候,第一个工作就是学习breakpad的源代码,然后了解其原理,为公司写一个ExceptionHandle的库,以处理服务器及客户端的未处理异常(unhandle exception),并打下dump,以便事后分析,当年这个功能转载 2013-04-04 01:41:44 · 1863 阅读 · 0 评论 -
new/delete和malloc/free区别,能否交叉使用
对于用户自定义的对象而言,用maloc/free无法满足动态管理对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete转载 2013-04-07 16:10:09 · 1053 阅读 · 0 评论 -
C/C++错误语法:void main( )
很多人甚至市面上的一些书籍,都使用了void main( ) ,其实这是错误的。C/C++ 中从来没有定义过void main( ) 。C++ 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地写着 The definition void main( ) { /* ... */ } is not and never has been C++, nor has it even转载 2013-04-07 11:31:54 · 15711 阅读 · 0 评论 -
C++ string类不能像C字符串能靠在i位赋值为‘\0’来截断
C++ string类不能像C字符串能靠在i位赋值为‘\0’来截断,因为'\0'在C字符串中才具有字符结束符的意义#include #include #include using namespace std;int main(){ string s("abcdefg"); s[3] = '\0';cout cout原创 2013-04-06 22:12:23 · 3204 阅读 · 1 评论 -
C++四种强制类型转换符功能以及用法总结(dynamic_cast,const_cast,static_cast,reinterpret_cast)
const_cast:用法:const_cast (expression)该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。一、指向常量的指针被转化成指向非常量的指针,并且仍然指向原来的对象;二、指向常量的引用被转换成指向非常量的引用,并且仍然指向原来的对象;Voiatile原创 2013-04-06 15:26:58 · 1162 阅读 · 0 评论 -
C/C++手动开大栈区
#pragma comment(linker, "/STACK:102400000,102400000")//手动开大栈区原创 2013-03-22 23:57:29 · 7083 阅读 · 0 评论 -
typeid为type_info友元函数
typeid函数该函数的主要作用就是让用户知道当前的变量是什么类型的,比如使用typeid(a).name()就能知道变量a是什么类型的。因为typeid()函数是一个返回类型为const typeid_info&类型的函数,所以下面先对type_info类作下介绍type_info类该类的具体实现方式依编译器而定,但一般都有如下的成员定义class type_info{pri原创 2013-04-06 15:38:07 · 1269 阅读 · 0 评论