
c/c++
文章平均质量分 75
frank_rabbit
这个作者很懒,什么都没留下…
展开
-
C++函数重载详解
我们在开瓶瓶罐罐的时候,经常会遭遇因各种瓶口规格不同而找不到合适的工具的尴尬。所以有时候就为了开个瓶,家里要备多种规格的开瓶器。同样是开个瓶子嘛,何必这么麻烦?于是有人发明了多功能开瓶器,不管啤酒瓶汽水瓶还是软木塞的红酒瓶都能轻松打开。然而开瓶器的问题也会发生到程序设计中。比如我们要编写一个函数来求一个数的绝对值,然而整数、浮点型数、双精度型数都有绝对值,但为它们编写的函数返回值类型却是各转载 2014-03-02 23:10:04 · 700 阅读 · 0 评论 -
C++面向对象特点—多态性
在本章的开头介绍一个RPG游戏的时候,我们就说到不同职业的玩家在发动普通攻击和特殊攻击时,有着不同的效果。在编写程序的时候,我们并不知道用户会选择哪种职业的玩家,那么又该如何保证各种攻击效果和用户选择的玩家是对应的呢?在使用继承的时候,子类必然是在父类的基础上有所改变。如果两者完全相同,这样的继承就失去了意义。同时,不同子类之间具体实现也是有所区别的,否则就出现了一个多余的类。不同的类的同转载 2014-03-18 11:05:30 · 592 阅读 · 0 评论 -
C++继承的实现和方式
了解继承的概念之后,我们就来学习一下如何实现继承。私有和保护在第14章中我们说到,成员函数或成员数据可以是公有或者私有的。如果是公有的,那么它们可以被直接访问;如果是私有的,那么它们无法被直接访问。同时,我们还提到一个protected保留字,在没有使用继承的时候,它与private的效果是一样的,即无法被直接访问。如果使用了继承,我们就能体会到protected和private的差别。转载 2014-03-18 10:08:05 · 848 阅读 · 0 评论 -
C++子类对象—子类对象的构造和析构
对象在使用之前,始终是要经历“构造”这个过程的。在第15章,我们了解到当一个对象的成员数据是另一个对象的时候,就先运行成员对象的构造函数,再运行父对象的构造函数。但是继承的出现,会引入子类的构造函数。这时候,这些构造函数的运行顺序又是怎样的呢?子类对象的构造讨论子类对象的构造,就是在讨论子类对象的生成方式。它是先生成父类对象的成员,再对其进行扩展呢,还是先生成子类对象的成员,然后再对其进行转载 2014-03-18 10:28:28 · 1011 阅读 · 0 评论 -
C++操作符的重载
在表达式中,我们常会用到各种操作符(运算符),例如1+3和4*2。然而,这些操作符只能用于C++内置的一些基本数据类型。如果我们自己编写一个复数类,它也会有加减法的操作,那么它能否摆脱一串冗长的函数名,而享用加号呢?在第六章我们学到过,函数是可以重载的,即同名函数针对不同数据类型的参数实现类似的功能。在C++中,操作符也是可以重载的,同一操作符对于不同的自定义数据类型可以进行不同的操作。转载 2014-03-17 14:50:53 · 660 阅读 · 0 评论 -
C++ this 指针详解
在前面曾经提到过: 每个对象中的数据成员都分别占有存储空间,如果对同一个类定义了n个对象,则有n组同样大小的空间以存放n个对象中的数据成员。但是,不同对象都调用同一个函数代码段。那么,当不同对象的成员函数引用数据成员时,怎么能保证引用的是所指定的对象的数据成员呢?假如,对于例9.6程序中定义的Box类,定义了3个同类对象a,b,c。如果有a.volume( ) ,应该是引用对象a中的h转载 2014-03-19 17:37:55 · 665 阅读 · 0 评论 -
C++类模板详解
有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类:class Compare_int{ public : Compare(int a,int b) { x=a; y=b; } int max( ) { return (x>y)?x:y;}int min( )转载 2014-03-19 17:38:33 · 592 阅读 · 0 评论 -
C++函数模板详解
C++提供了函数模板(function template)。所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。看下面的例子就清楚了。例4.7 将例4转载 2014-03-19 17:37:19 · 440 阅读 · 0 评论 -
C++多态与虚函数(多态的实现)
多态能够方便我们编写程序,可以让不同的类与它独特的成员函数一一对应。即使我们只是简单地“称呼”,程序也会很明白我们的心思。那么,多态应该如何实现呢?多态的实现在C++中,我们把表现多态的一系列成员函数设置为虚函数。虚函数可能在编译阶段并没有被发现需要调用,但它还是整装待发,随时准备接受指针或引用的“召唤”。设置虚函数的方法为:在成员函数的声明最前面加上保留字virtual。注意,不能把vi转载 2014-03-18 17:24:49 · 530 阅读 · 0 评论 -
C++虚函数与虚析构函数
在类中,有两个与众不同的成员函数,那就是构造函数和析构函数。当构造函数与析构函数遭遇继承和多态,它们的运行状况又会出现什么变化呢?多态性是在父类或各子类中执行最合适成员函数。一般来说,只会选择父类或子类中的某一个成员函数来执行。这可给析构函数带来了麻烦!如果有的资源是父类的构造函数申请的,有的资源是子类的构造函数申请的,而虚函数只允许程序执行父类或子类中的某一个析构函数,岂不是注定有一部分转载 2014-03-19 10:48:56 · 489 阅读 · 0 评论 -
虚函数和纯虚函数的区别
首先:强调一个概念定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。定义一个函数为纯虚函数,才代表函数没有被实现。定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。1、简介假设我们有下面的类层次:[cpp] view plaincopyclass转载 2014-03-20 18:07:27 · 528 阅读 · 0 评论 -
C++中的namespace用法
关键字namespace定义了一个名字空间,里面的变量和函数,声明在此名字空间外使用须在前面加名字空间名称.例如:#includenamespace my{int a=3;}class test{public:int a;test(){a=1;}void fb(){int a=0;cout}};int main(){tes转载 2014-03-20 17:53:07 · 551 阅读 · 0 评论 -
C++如何输入含有空格字符的字符串
http://blog.163.com/wenxianliang08@126/blog/static/835832632010724195686原创 2014-04-08 16:55:03 · 2299 阅读 · 0 评论 -
C++继承与对象指针
我们在第14章的最后学习了对象指针,并且在编写链表类的过程中已经能熟练地使用它了。现在有了继承之后,我们的心中有了疑问:父类指针能否指向子类对象?子类指针能否指向父类对象?如果那样使用指针,对象的功能是否会受到限制呢?父类指针与子类对象我们修改程序17.3.1,用程序的运行结果来解答我们的疑问://student.h和undergraduate.h同程序17.3.1//main.c转载 2014-03-18 11:02:26 · 1256 阅读 · 0 评论 -
C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝
关键词:构造函数,浅拷贝,深拷贝,堆栈(stack),堆heap,赋值运算符摘要: 在面向对象程序设计中,对象间的相互拷贝和赋值是经常进行的操作。 如果对象在申明的同时马上进行的初始化操作,则称之为拷贝运算。例如: class1 A("af"); class1 B=A; 此时其实际调用的是B(A)这样的浅拷贝操作。 如果对象在申明之后转载 2014-03-17 11:55:18 · 553 阅读 · 0 评论 -
C++堆内存空间详解(释放内存、内存泄露)
家里要来客人了,我们要给客人们泡茶。如果规定只能在确定来几位客人之前就把茶泡好,这就会显得很尴尬:茶泡多了会造成浪费,泡少了怕怠慢了客人。所以,最好的方法就是等知道了来几位客人再泡茶,来几位客人就泡几杯茶。然而,我们在使用数组的时候也会面临这种尴尬:数组的存储空间必须在程序运行前申请,即数组的大小在编译前必须是已知的常量表达式。空间申请得太大会造成浪费,空间申请得太小会造成数据溢出而使得程转载 2014-03-04 21:19:18 · 1919 阅读 · 0 评论 -
C++字符串—特殊对象
字符串(String)“abc”是我们可以想象出来的具体物体,它的长度为3个字符,我们可以在它的第2个字符查找到字母“b”。字符串“abcdefg”是我们可以想象出来的具体物体,它的长度为7个字符,我们可以在它的第3个字符查找到字母“cd”。由于各个字符串都具有一些属性,都能对其进行一些操作,所以,字符串是一个类。下面我们先来看一段程序,了解如何使用字符串:(程序13.2.1)#inc转载 2014-03-05 15:43:08 · 644 阅读 · 0 评论 -
C++向量讲解
向量(Vector)是一个深奥的词。不过这里的向量不是数学里的向量,也不是物理里的向量。在C++中的向量,就是一个存放数据的地方,类似于一维数组和链表。向量的性能在第九章末尾,我们介绍了数组存储和链表存储的优缺点。数组的缺点是分配空间不灵活;链表的缺点是无法通过下标快速找到结点。然而这里介绍的向量却吸收了这两种数据结构各自的优点,综合性能较高。向量的分配空间是会随着数据的量而变化的转载 2014-03-05 16:16:41 · 1579 阅读 · 0 评论 -
new和delete的使用
一、基本数据类型的动态分配new和delete已经完全包含malloc和free的功能,并且更强大、方便、安全。使用动态分配内存时不能忘记释放内存,不要忘记出错处理!下面先看new和delete的基本使用方法。#include using namespace std;int main ( ){ //基本数据类型 int *i = new int;转载 2014-03-10 20:31:58 · 585 阅读 · 0 评论 -
setfill、setw 和 setprecision
使用setfill、setw和 setprecision 操作器,这些操作器带有参数,并在头文件iomanip.h中定义。因此,此头文件必须包括在程序中。#include#include#includevoid main(){ int amt1 = 100, amt2 = 12345; float f1 = 10.0/3.0; cout cout转载 2014-03-04 21:00:32 · 1084 阅读 · 0 评论 -
C++成员函数—C++成员函数的定义和重载
我们已经学会如何调用成员函数,那么成员函数又是如何声明和定义的呢?它和普通函数有着什么异同点呢?普通函数在使用之前必须声明和定义,成员函数也是这样。不过成员函数是属于某一个类的,所以只能在类的内部声明,即在定义类的时候写明成员函数的函数原型,同时要注意此函数是公有的还是私有的。如果一个类的某个成员函数是私有的,那么它只能被这个类的其他成员函数调用。成员函数的函数原型和普通函数的函数原型在写转载 2014-03-05 17:35:18 · 1283 阅读 · 0 评论 -
C++构造函数—构造函数的声明与定义、带参数的构造函数
构造函数是一种随着对象创建而自动被调用的函数,它的主要用途是为对象作初始化。那么,构造函数到底是什么样子的呢?构造函数的声明与定义在C++中,规定与类同名的成员函数就是构造函数。需要注意的是,构造函数应该是一个公有的成员函数,并且构造函数没有返回值类型。以下是我们为链表结点类编写的一个构造函数:(其他成员函数定义见14.3节)//node.h#include //如果不包含iost转载 2014-03-06 17:32:08 · 13768 阅读 · 1 评论 -
链表类
链表结点类编写好了,我们可以向链表类进军了。链表是由一个个链表结点组成的,所以我们会在链表类中使用到链表结点类。链表结点类是一个很简单的类,链表类是一个功能更为强大的类。正是将一个个类不断地组合与扩充,使得面向对象的程序功能越来越强大。让我们感兴趣的是,假设我们编写的链表需要有一个头结点作为成员数据,那么是先有链表呢,还是先有头结点?我们又该如何在给链表作初始化的同时初始化头结点呢?转载 2014-03-13 17:22:00 · 1243 阅读 · 0 评论 -
C++拷贝构造函数详解
一. 什么是拷贝构造函数首先对于普通类型的对象来说,它们之间的复制是很简单的,例如:[c-sharp] view plaincopyint a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。[c-sharp] view pla转载 2014-03-07 15:01:12 · 478 阅读 · 0 评论 -
C++静态成员数据—定义、初始化
由于内存的空间有限,我们常常关心已经使用掉了多少内存空间。如果我们修改上一章的链表程序(程序15.5),要能计算出整个程序一共产生了多少链表结点,我们该怎么做呢?显然,我们需要一个计数器。每产生一个结点,计数器就加一;每消除一个结点,计数器就减一。由于结点的产生和消除只会与链表类或结点类的某些成员函数有关,所以这个计数器只能是一个全局变量了(全局变量的概念见11.1节),否则它将无法被各个转载 2014-03-13 18:11:22 · 1025 阅读 · 0 评论 -
C++友元类讲解
在编写链表类的时候我们有着这样的困惑:链表类和链表结点类都是我们编写的,我们能保证链表类对链表结点类的操作都是安全的。但由于类的封装性,我们不得不编写一些成员函数,以便于链表类访问链表结点类的私有成员数据。好在链表结点类的成员数据并不是很多,否则岂不是需要一大堆成员函数来供别的类访问?对于这种情况,我们能否告诉链表结点类:“链表类是安全的,让它访问你的私有成员吧”?在C++中,可以用友元来转载 2014-03-14 13:58:27 · 687 阅读 · 0 评论 -
C++静态成员函数
静态成员数据是某一个类所具有的属性,而不是某一个对象的属性,所以它的存在并不依赖于对象。那么,如果一个类没有任何对象实例时,所有的普通成员函数都无法使用,我们该如何访问私有的静态成员数据呢?既然成员数据可以属于某一个类而不属于某一个具体的对象,成员函数能否这样呢?答案是肯定的。在C++中,除了有静态成员数据,还有静态成员函数。静态成员函数也是属于某一个类而不属于某一个具体的对象的。静态成员转载 2014-03-13 18:13:45 · 789 阅读 · 0 评论 -
C++的坑真的多吗?
先说明一下,我不希望本文变成语言争论贴。希望下面的文章能让我们客观理性地了解C++这个语言。(另,我觉得技术争论不要停留在非黑即白的二元价值观上,这样争论无非就是比谁的嗓门大,比哪一方的观点强,毫无价值。我们应该多看看技术是怎么演进的,怎么取舍的。)事由周五的时候,我在我的微博上发了一个贴说了一下一个网友给我发来的C++程序的规范和内存管理写的不是很好(后来我删除了,因为当事人要求),我并转载 2014-03-13 21:16:01 · 1326 阅读 · 0 评论 -
C++友元函数讲解
私有成员数据除了可能被别的类访问之外,也可能被别的函数或别的类的部分成员函数访问。为了保证类的封装性,我们可以以函数作为单位,“对外开放”类的私有成员。与声明友元类类似,如果我们想用函数访问链表结点类的私有成员数据,则那些函数必须得到链表结点类的认可。声明友元函数的语句格式为: friend 返回值类型函数名(参数表);如果该函数是某个类的成员函数,则语句格式为: frie转载 2014-03-14 15:30:56 · 640 阅读 · 0 评论 -
在C/C++程序里打印调用栈信息
我们知道,GDB的backtrace命令可以查看堆栈信息。但很多时候,GDB根本用不上。比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试。如果能让程序自己输出调用栈,那是最好不过了。本文介绍和调用椎栈相关的几个函数。 NAME backtrace, backtrace_symbols, backtrace_symbols_fd -转载 2014-02-17 22:06:52 · 709 阅读 · 0 评论 -
C++类和对象的继承
在前面的章节,我们学会了如何编写一个完整的类。然而,面向对象的优势还没有被完全体现出来。特别是在编写一些相似的类时,可能会造成很多的浪费。本章就将以一个文字游戏为例,向大家介绍类的继承问题。剑士·弓箭手·法师的困惑在一个角色扮演类游戏(RPG)中,可能有各种不同职业的玩家,比如剑士、弓箭手和法师。虽然他们的职业不同,却有着一些相似之处:他们都具有生命值(Health Point——HP)、转载 2014-03-17 14:58:10 · 787 阅读 · 0 评论 -
C++中的虚函数(virtual function)
1.简介 虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。假设我们有下面的类层次:class A{public: virtual void foo() { cout };class B: public A{public: virtual void foo() { cout转载 2014-04-08 22:33:58 · 500 阅读 · 0 评论