C/C++
文章平均质量分 76
Citronnelle2
这个作者很懒,什么都没留下…
展开
-
2015届华为校园招聘机试题及参考答案
第一题(60分): 按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”。#include using namespace std;void decomposition(char* str,原创 2015-09-06 10:22:07 · 902 阅读 · 0 评论 -
C++初始化列表
何谓初始化列表与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。在C++中,struct和class的唯一区别是默认的访问性不同,而这里我们不考虑访问性的问题,所以下面的代码都以struct来演示。struct foo{ string name ; int id ; foo(s转载 2015-08-25 16:56:22 · 190 阅读 · 0 评论 -
C++中类对象所占空间的大小
C++中类对象所占空间的大小http://www.cnblogs.com/easonpan/archive/2012/04/25/2470177.html 首先,平时所声明的类只是一种类型定义,它本身是没有大小可言的。 因此,如果用sizeof运算符对一个类型名操作,那得到的是具有该类型实体的大小。计算一个类对象的大小时的规律:空类、单一继承的空类转载 2015-08-25 17:01:08 · 623 阅读 · 0 评论 -
C/C++的编译与运行
原文链接:http://www.cnblogs.com/eVCrow/articles/1870961.html C/C++编译前,首先要对源代码执行预处理。预处理器(preprocessor)是一个简单的程序,它用程序员(利用预处理器指令)定义好的模式代替源代码中的模式(删除注释、包含其他文件以及执行宏),预处理后生成中间文件.i(文本)。接下来对于.i文件进行语法分析。编译器转载 2015-08-25 17:02:43 · 537 阅读 · 0 评论 -
各种特殊函数为什么不能是虚函数
> 内联函数内联函数是在编译时期展开,而虚函数的特性是运行时才动态联编,所以两者矛盾,不能定义内联函数为虚函数。2> 构造函数构造函数用来创建一个新的对象,而虚函数的运行是建立在对象的基础上,在构造函数执行时,对象尚未形成,所以不能将构造函数定义为虚函数。3> 静态成员函数静态成员函数属于一个类而非某一对象,没有this指针,它无法进行对象的判别。转载 2015-08-25 17:04:02 · 316 阅读 · 0 评论 -
为什么静态成员函数不能是const
static在c++中的第五种含义:用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问它的参数、类的静态数据成员和全局变量。 不能用const的原因: 这是C++的规则,const修饰符用于表示函数不能修改成员变量的值,该函数必须是含有this指针的类成员函数,函数调用方式为thiscall,而类中的static函数本质上是全局函数,调用规约是转载 2015-08-25 17:04:59 · 535 阅读 · 0 评论 -
构造函数不能是虚函数的原因
1,从存储空间角度 虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。2,从使用角度 虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身转载 2015-08-25 17:06:20 · 234 阅读 · 0 评论 -
关于C++中的虚拟继承的一些总结
1.为什么要引入虚拟继承虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下:class Aclass B1:public virtual A;class B2:public vi转载 2015-08-24 16:10:22 · 241 阅读 · 0 评论 -
C++ 对象的内存布局(下)
C++ 对象的内存布局(下) 陈皓http://blog.csdn.net/haoel 重复继承 下面我们再来看看,发生重复继承的情况。所谓重复继承,也就是某个基类被间接地重复继承了多次。 下图是一个继承图,我们重载了父类的f()函数。 其类继承的源代码如下所示。其中,每个类都有两个变量,一个是整形(4字节),一个是字符(1字节),而且还有自己转载 2015-08-26 00:02:17 · 214 阅读 · 0 评论 -
【深入理解C++】从初始化列表和构造函数谈C++的初始化机制
前段时间被人问及“初始化列表和构造有什么区别?”我竟一时语塞,只好回头拿起几本C++的大部头书,打开VS2012和vim开始倒腾。最后总结出如下几点,希望对大家理解C++能有些帮助。(题外话:我认为好的技术书籍和师者对人最大的帮助就是:帮助学者节省时间。)综合而言,C++中类的初始化操作有四个部分组成:1.初始化列表:所有类非静态数据成员都可以在这里初始化,转载 2015-08-25 16:59:13 · 255 阅读 · 0 评论 -
虚函数初始化顺序
虚函数初始化顺序#include using namespace std;class furniture{public: furniture( int nWeight ) { m_nWeight = nWeight; cout << "家具的构造" << endl; } int m_nWeight;}; //虚继转载 2015-08-25 16:54:49 · 419 阅读 · 0 评论 -
C++中拷贝构造函数
1.什么是拷贝构造函数: 拷贝构造函数嘛,当然就是拷贝和构造了。(其实很多名字,只要静下心来想一想,就真的是顾名思义呀)拷贝又称复制,因此拷贝构造函数又称复制构造函数。百度百科上是这样说的:拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的参数(对象的引用)是不可变的(const类型)。此函数经常用在函数调用时用户定义类型的值传递及返回。转载 2015-08-24 16:36:43 · 204 阅读 · 0 评论 -
C++初始化函数列表
在以下三种情况下需要使用初始化成员列表:一,需要初始化的数据成员是对象的情况;二,需要初始化const修饰的类成员;三,需要初始化引用成员数据; 原因:C++可以定义引用类型的成员变量,引用类型的成员变量必须在构造函数的初始化列表中进行初始化。对于类成员是const修饰,或是引用类型的情况,是不允许赋值操作的,(显然嘛,const就是防止被错误赋值的,引用类型必须定义赋值在转载 2015-08-24 16:39:00 · 288 阅读 · 0 评论 -
C++中的模板那点事
1.什么是模板假设现在我们完成这样的函数,给定两个数x和y求式子x^2 + y^2 + x * y的值 .考虑到x和y可能是 int , float 或者double类型,那么我们就要完成三个函数:int fun(int x,int y);float fun(float x,float y);double fun(double x,double y);并且每个fun函数内部所要转载 2015-08-24 16:46:01 · 191 阅读 · 0 评论 -
C++中的static关键字的总结
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。1.面向过程设计中的static1.1静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下: //Example 1#include转载 2015-08-24 16:46:56 · 198 阅读 · 0 评论 -
C++中的三种继承public,protected,private
三种访问权限public:可以被任意实体访问protected:只允许子类及本类的成员函数访问private:只允许本类的成员函数访问 三种继承方式public 继承protect 继承private 继承 组合结果基类中 继承方式 子类中public & public继承 => publicpublic & protected继承 => pro转载 2015-08-24 16:50:11 · 2397 阅读 · 0 评论 -
C++中的继承和组合区别使用
C++的“继承”特性可以提高程序的可复用性。正因为“继承”太有用、太容易用,才要防止乱用“继承”。我们要给“继承”立一些使用规则: 一、如果类A 和类B 毫不相关,不可以为了使B 的功能更多些而让B 继承A 的功能。 不要觉得“不吃白不吃”,让一个好端端的健壮青年无缘无故地吃人参补身体。 二、如果类B 有必要使用A 的功能,则要分两种情况考虑:(1)若在逻辑上B 是A 的“一转载 2015-08-24 16:50:45 · 246 阅读 · 0 评论 -
C++中的操作符重载
一、什么是操作符重载操作符重载可以分为两部分:“操作符”和“重载”。说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载。运算符重载和函数重载的不同之处在于操作符重载重载的一定是操作符。我们不妨先直观的看一下所谓的操作符重载: 1 #include 2 3 using namespace std; 4 5 int main() 6 {转载 2015-08-24 16:43:31 · 233 阅读 · 0 评论 -
C++类对象创建过程揭密
介绍 初看到这个题目,你可能会有些疑惑:C++类对象的创建还有什么好说的,不就是调用构造函数么?实际上情况并不是想象中的那么简单,大量的细节被隐藏或者被忽略了,而这些细节又是解决一些其他问题的关键,所以我们很有必要深入到这块"神秘"的区域,去探索鲜为人知的秘密。 分配空间(Allocation) 创建C++类对象的第一步就是为其分配内存空间。对于全局对象转载 2015-08-25 16:52:00 · 272 阅读 · 0 评论 -
C++ 关键字typeid 运行时类型检查
在揭开typeid神秘面纱之前,我们先来了解一下RTTI(Run-Time Type Identification,运行时类型识别),它使程序能够获取由基指针或引用所指向的对象的实际派生类型,即允许“用指向基类的指针或引用来操作对象”的程序能够获取到“这些指针或引用所指对象”的实际派生类型。在C++中,为了支持RTTI提供了两个操作符:dynamic_cast和typeid。 dynam转载 2015-08-25 17:08:49 · 465 阅读 · 0 评论 -
C++ 对象的内存布局(上)
C++ 对象的内存布局(上) 陈皓http://blog.csdn.net/haoel 前言 07年12月,我写了一篇《C++虚函数表解析》的文章,引起了大家的兴趣。有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么再写一篇续言的原因。因为,在上一篇文章中,我用了的示例都是非常简单的,主要是为了转载 2015-08-26 00:01:58 · 256 阅读 · 0 评论 -
STL内存管理(二)
1. 背景前些天在一个技术分享会上,某大牛说,STL使用了内存池,释放内存的时候,并不释放给OS,而是自己由留着用。听到这些观点后,我就有些着急了,因为我以前一直是直接使用STL的一些工具类的,比如std::string、std::map、std::vector、std::list等等,从来都没有关注过内存的问题。带着内存的问题,我花了两三天的时间去阅读STL的代码,并且写一些简单的程转载 2015-09-05 10:49:07 · 575 阅读 · 0 评论 -
STL中的内存分配器 (一)
题记:内存管理一直是C/C++程序的红灯区。关于内存管理的话题,大致有两类侧重点,一类是内存的正确使用,例如C++中new和delete应该成对出现,用RAII技巧管理内存资源,auto_ptr等方面,很多C/C++书籍中都使用技巧的介绍。另一类是内存管理的实现,如linux内核的slab分配器,STL中的allocator实现,以及一些特定于某种对象的内存管理等。最近阅读了一些内存管理实现方面的转载 2015-09-05 10:42:50 · 602 阅读 · 0 评论 -
在服务器端采用同步处理模式和异步处理模式的分析
同步服务为每个请求创建单一线程,由此线程完成整个请求的处理:接收消息,处理消息,返回数据;这种情况下服务器资源对所有入栈请求开放,服务器资源被所有入栈请求竞争使用,如果入栈请求过多就会导致服务器资源耗尽宕机,或者导致竞争加剧,资源调度频繁,服务器资源利用效率降低。异步服务则可以分别设置两个线程队列,一个专门负责接收消息,另一个专门负责处理消息并返回数据,另有一些值守线程负责任务派发和超时监控等转载 2015-08-31 14:09:40 · 1325 阅读 · 0 评论 -
异常安全的C++类
转自:http://m.blog.csdn.net/blog/crazy_programmer_p/38518283题目:类CMyString的声明如下:class CMyString{public:CMyString(char* pData = NULL);CMyString(const CMyString& str);~CMyString(void);CMy转载 2015-08-26 00:01:35 · 320 阅读 · 0 评论 -
C++ 之类型转换操作符
传统C语言的内部类型转换:C语言传统的转化很简单。比如:double d=5.0;int a=(int)d;这个感觉和java差不多。C++有四个内部类型转换操作符:const_cast,reinterpret_cast,static_cast,dynamic_cast。const_cast用法:const_cast (expression)该运算符用来修改类型转载 2015-08-26 00:00:54 · 556 阅读 · 0 评论 -
const 成员 static 成员 const static int 成员初始化
有关const成员、static成员、const static成员的初始化:1、const成员:只能在构造函数后的初始化列表中初始化2、static成员:初始化在类外,且不加static修饰3、const static成员:类只有唯一一份拷贝,且数值不能改变。因此,可以在类中声明处初始化(仅限const static int),也可以像static在类外初始化,在类之外进行初始转载 2015-08-25 17:14:31 · 626 阅读 · 0 评论 -
为什么父类指针可以指向子类反之则不行?
为什么父类指针可以指向子类反之则不行?例如:class a{public:int aa};class b:public a{public:int bb;}从内存的来看如a---------||占一个int数据大小--||----(aa数据)------||---------而b则是---------|---------|占一个int数据大小--|占一个I转载 2015-08-25 00:22:36 · 4978 阅读 · 0 评论 -
2014届华为上机题目及参考答案
一、题目描述(60分):通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。比如字符串“abacacde”过滤结果为“abcde”。要求实现函数:void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);【原创 2015-09-06 11:49:42 · 769 阅读 · 0 评论 -
traits:Traits技术学习笔记
traits:Traits技术初探概述:traits是一种特性萃取技术,它在Generic Programming中被广泛运用,常常被用于使不同的类型可以用于相同的操作,或者针对不同类型提供不同的实现.traits在实现过程中往往需要用到以下三种C++的基本特性:enumtypedeftemplate (partial) specialization其中:enum用转载 2015-09-09 20:24:03 · 723 阅读 · 0 评论 -
sscanf函数用法详解
以前一直以为sscanf只能用来简单的提取用空格隔起来的字符串,知道之前遇到了一些列字符串处理问题,详细研究起来这个函数尽然还是有很强大类似于正则表达式的功能。首先我们先来看函数定义:定义函数 int sscanf (const char *str,const char * format,........); 函数说明原创 2015-04-05 20:15:14 · 161906 阅读 · 14 评论 -
C++拷贝构造函数详解
原文链接:http://blog.csdn.net/lwbeyond/article/details/6202256一. 什么是拷贝构造函数首先对于普通类型的对象来说,它们之间的复制是很简单的,例如:[c-sharp] view plaincopyprint?int a = 100; int b = a; int a = 100;in转载 2015-08-27 15:44:23 · 306 阅读 · 0 评论 -
C++ 常见崩溃问题分析
一、前言从事自动化测试平台开发的编程实践中,遭遇了几个程序崩溃问题,解决它们颇费了不少心思,解决过程中的曲折和彻夜的辗转反侧却历历在目,一直寻思写点东西,为这段难忘的经历留点纪念,总结惨痛的教训带来的经验,以期通过自己的经历为他人和自己带来福祉:写出更高质量的程序;由于 C 和 C++ 这两种语言血缘非常近,文本亦对 C 编程语言有借鉴作用;二、C++ 崩溃分类转载 2015-08-27 14:44:22 · 828 阅读 · 0 评论 -
C++编译器无法捕捉到的8种错误
C++是一种复杂的编程语言,其中充满了各种微妙的陷阱。在C++中几乎有数不清的方式能把事情搞砸。幸运的是,如今的编译器已经足够智能化了,能够检测出相当多的这类编程陷阱并通过编译错误或编译警告来通知程序员。最终,如果处理得当的话,任何编译器能检查到的错误都不会是什么大问题,因为它们在编译时会被捕捉到,并在程序真正运行前得到解决。最坏的情况下,一个编译器能够捕获到的错误只会造成程序员一些时间上的损失,转载 2015-08-27 14:45:58 · 509 阅读 · 0 评论 -
C++ 异常
转自:http://www.cnblogs.com/nzbbody/p/3418989.html一、什么是异常处理 一句话:异常处理就是处理程序中的错误。二、为什么需要异常处理,以及异常处理的基本思想 C++之父Bjarne Stroustrup在《The C++ Programming Language》中讲到:一个库的作者可以检测转载 2015-08-27 14:48:09 · 258 阅读 · 0 评论 -
C++ 虚函数表解析
C++ 虚函数表解析陈皓http://blog.csdn.net/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTT转载 2015-08-27 13:38:09 · 214 阅读 · 0 评论 -
C++中几种强制类型转换的区别和联系
C++中包含哪几种强制类型转换?他们有什么区别和联系?reinterpret_cast: 转换一个指针为其它类型的指针。它也允许从一个指针转换为整数类型,反之亦 然. 这个操作符能够在非相关的类型之间转换. 操作结果只是简单的从一个指针到别的指针的值的 二进制拷贝. 在类型之间指向的内容不做任何类型的检查和转换? class A{}; class B{}; A* a = new原创 2015-08-04 18:56:16 · 563 阅读 · 0 评论 -
STL中vector的实现原理 (衍生:Map, Set等实现原理)
STL中vector的实现原理 (衍生:Map, Set等实现原理):vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,可以,一切琐细都得由客户端自己来:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统。vector是动态空间,随着元素的加入,原创 2015-08-04 18:58:09 · 1025 阅读 · 0 评论 -
operator new 函数、operator delete 函数 和 定位 new
我们知道在C++中申请内存空间和释放内存空间是用new和delete来完成,我们先来看new表达式:string *sp = new new string("initialized");实际上发生了三个步骤:(1)首先,该表达式调用名为operator new的标准库函数,分配足够大的原始的未类型化的内存,以保存指定类型的一个对象;(2)接下来,运行该类型的一个构造函数,用指定初始化式原创 2015-09-09 21:25:57 · 730 阅读 · 0 评论 -
C++中虚函数和多态
1.C++中的虚函数C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。对C++ 了转载 2015-08-24 15:54:28 · 264 阅读 · 0 评论