《C++编程自学宝典》配套代码、彩图

  • 更新时间:
  • 2789人关注
  • 点击下载

给大家带来的是《C++编程自学宝典》配套代码、彩图,介绍了关于C++编程、C++自学、C++编程方面的内容,本书是由人民邮电出版社出版,已被596人关注,由热心网友万妙春 提供,目前本书在C++编程类综合评分为:7.2分

资源详情相关推荐
《《C++编程自学宝典》配套代码、彩图》封面
  • 出版社:人民邮电出版社
  • 作者:(英)理查德·格里姆斯(Richard
  • 大小:76.66 MB
  • 类别:C++编程
  • 热度:729
  • 《小学生C++创意编程》电子资源
  • Android C++高级编程:使用NDK
  • C++编程基础:标准库编程
  • Google C++编程风格指南
  • C++黑客编程揭秘与防范
  • 内容简介

    作为一门广为人知的编程语言,C++已经诞生30多年了,这期间也出现并流行过许多种编程语言,但是C++是经得起考验的。如此经典的编程语言,值得每一位编程领域的新人认真学习,也适合有经验的程序员细细品味。
    本书旨在通过全面细致的内容和代码示例,带领读者更加多方面地认识C++语言。全书分为10章,由浅入深地介绍了C++的各项特性,包括C++语法、数据类型、指针、函数、类、面向对象特性、标准库容器、字符串、诊断和调试等。本书涵盖了C++11规范及相关的C++11标准库,是全面学习C++编程的合适之选。
    本书适合C++零基础读者,但是希望读者有一些编程经验。通过书中丰富、典型的代码示例,读者将快速把握C++的特性和编程技巧。

    作者介绍

    Richard Grimes有25年C++编程经验,曾经致力于汽车制造业远程设备的金融分析和科学控制等多个项目。他曾经在70多场微软技术(其中包含C++和C#)的国际会议上发布重要讲话,共编写了8本书,在编程期刊上发表了150多篇文章,主讲了5期Microsoft培训课程。Richard曾经连续10年(1998-2007)获得微软MVP认证。他对微软.net框架和C++的深刻理解,以及他对新技术的坦率评估在业内享有盛誉。

    目录

    • 第1章 初识C++ 1
    • 第2章 语言特性简介 28
    • 第3章 C++类型探秘 63
    • 第4章 内存、数组和指针 102
    • 函数 110
    • 第5章 函数 136
    • 第6章 类 170
    • 第7章 面向对象编程简介 204
    • 第8章 标准库容器 245
    • 第9章 字符串 277
    • 第 10章 诊断和调试 306
    展开阅读
    精选笔记1:深入解析C++编程中的运算符重载

    14小时41分钟前回答

    C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作。例如:

    class complex 
    { 
     public: 
     complex(double r=0.0,double I=0.0){real=r;imag=I;} 
     void display(); 
     private: 
     double real; 
     double imag; 
    }; 
    complex a(10,20),b(5,8); 
    

    “a+b”运算如何实现?这时候我们需要自己编写程序来说明“+”在作用于complex类对象时,该实现什么样的功能,这就是运算符重载。运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同类型的行为。
    运算符重载的实质是函数重载。在实现过程中,首先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用达标函数,这个过程爱编译过程中完成。

    一、 运算符重载的规则
    运算符重载规则如下:
    ①、 C++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已有的运算符。
    ②、 重载之后运算符的优先级和结合性都不会改变。
    ③、 运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。一般来说,重载的功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时至少要有一个操作对象是自定义类型。
    不能重载的运算符只有五个,它们是:成员运算符“.”、指针运算符“*”、作用域运算符“::”、“sizeof”、条件运算符“?:”。
    运算符重载形式有两种,重载为类的成员函数和重载为类的友元函数。
    运算符重载为类的成员函数的一般语法形式为:

    函数类型 operator 运算符(形参表) 
    { 
     函数体; 
    } 
    

    运算符重载为类的友元函数的一般语法形式为:

    friend 函数类型 operator 运算符(形参表) 
    { 
     函数体; 
    } 
    

    其中,函数类型就是运算结果类型;operator是定义运算符重载函数的关键字;运算符是重载的运算符名称。
    当运算符重载为类的成员函数时,函数的参数个数比原来的操作个数要少一个;当重载为类的友元函数时,参数个数与原操作数个数相同。原因是重载为类的成员函数时,如果某个对象使用重载了的成员函数,自身的数据可以直接访问,就不需要再放在参数表中进行传递,少了的操作数就是该对象本身。而重载为友元函数时,友元函数对某个对象的数据进行操作,就必须通过该对象的名称来进行,因此使用到的参数都要进行传递,操作数的个数就不会有变化。
    运算符重载的主要优点就是允许改变使用于系统内部的运算符的操作方式,以适应用户自定义类型的类似运算。

    二、 运算符重载为成员函数
    对于双目运算符B,如果要重载B为类的成员函数,使之能够实现表达式oprd1 B oprd2,其中oprd1为类A的对象,则应当把B重载为A类的成员函数,该函数只有一个形参,形参的类型是oprd2所属的类型。经过重载后,表达式oprd1 B oprd2 就相当于函数调用oprd1.operator B(oprd2).
    对于前置单目运算符U,如“-”(负号)等,如果要重载U为类的成员函数,用来实现表达式U oprd,其中oprd为A类的对象,则U应当重载为A类的成员函数,函数没有形参。经过重载之后,表达式U oprd相当于函数调用oprd.operator U().
    对于后置运算符“++”和“- -”,如果要将它们重载为类的成员函数,用来实现表达式oprd++或oprd--,其中oprd为A类的对象,那么运算符就应当重载为A类的成员函数,这时函数要带有一个整型形参。重载之后,表达式oprd++和oprd—就想当于函数调用oprd.operator++(0)和oprd.operator—(0);
    运算符重载就是赋予已有的运算符多重含义。通过重新定义运算符,使它能够用于特定类的对象执行特定的功能,这便增强了C++语言的扩充能力。
     
    1. 运算符重载的作用:
    运算符重载允许C/C++的运算符在用户定义类型(类)上拥有一个用户定义的意义。重载的运算符是函数调用的语法修饰:

    class Fred
    {
    public:
    // ...
    };
     
    #if 0
    // 没有算符重载:
    Fred add(Fred, Fred);
    Fred mul(Fred, Fred);
     
    Fred f(Fred a, Fred b, Fred c)
    {
    return add(add(mul(a,b), mul(b,c)), mul(c,a)); // 哈哈,多可笑...
    }
    #else
    // 有算符重载:
    Fred operator+ (Fred, Fred);
    Fred operator* (Fred, Fred);
     
    Fred f(Fred a, Fred b, Fred c)
    {
    return a*b + b*c + c*a;
    }
    #endif
    

     
    2. 可以用作重载的运算符:
    算术运算符:+,-,*,/,%,++,--;
    位操作运算符:&,|,~,^,<<,>>
    逻辑运算符:!,&&,||;
    比较运算符:<,>,>=,<=,==,!=;
    赋值运算符:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=;
    其他运算符:[],(),->,,(逗号运算符),new,delete,new[],delete[],->*。
    下列运算符不允许重载:
    .,.*,::,?:
     
    3. 运算符重载后,优先级和结合性:
    用户重载新定义运算符,不改变原运算符的优先级和结合性。这就是说,对运算符重载不改变运算符的优先级和结合性,并且运算符重载后,也不改变运算符的语法结构,即单目运算符只能重载为单目运算符,双目运算符只能重载双目运算符。
     
    4. 编译程序如何选用哪一个运算符函数:
    运算符重载实际是一个函数,所以运算符的重载实际上是函数的重载。编译程序对运算符重载的选择,遵循着函数重载的选择原则。当遇到不很明显的运算时,编译程序将去寻找参数相匹配的运算符函数。
     
    5. 重载运算符有哪些限制:
    (1) 不可臆造新的运算符。必须把重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中。
    (2) 重载运算符坚持4个“不能改变”。
    ·不能改变运算符操作数的个数;
    ·不能改变运算符原有的优先级;
    ·不能改变运算符原有的结合性;
    ·不能改变运算符原有的语法结构。
     
    6. 运算符重载时必须遵循哪些原则:
    运算符重载可以使程序更加简洁,使表达式更加直观,增加可读性。但是,运算符重载使用不宜过多,否则会带来一定的麻烦。
    (1) 重载运算符含义必须清楚。
    (2) 重载运算符不能有二义性。
    运算符重载函数的两种形式
    运算符重载的函数一般地采用如下两种形式:成员函数形式和友元函数形式。这两种形式都可访问类中的私有成员。

    三、例子
    使用全局函数重载

    #include <IOSTREAM.H> 
     
    class A 
    { 
    public: 
      A(int i):i(i){}; 
      void print(){cout<<i<<endl;} 
      friend A operator + (A &a, A &b);//声明为友元 
      friend A operator ++(A &a, int); 
      friend A& operator ++(A &a); 
      friend A& operator +=(A &a, A &b); 
    protected: 
      int i; 
    private: 
    }; 
     
    A operator + (A &a, A &b){//重载 a + b 
      return A(a.i + b.i); 
    } 
     
    A operator ++(A &a, int){//重载 a++ 
      return A(a.i++); 
    } 
     
    A& operator ++(A &a){//重载 ++a 
      a.i++; 
      return a; 
    } 
     
    A& operator +=(A &a, A &b){//重载 += 
      a.i += b.i; 
      return a; 
    } 
     
    void main(){ 
      A a(5); 
      A b(3); 
      (a += b).print(); 
    } 
    

     
    使用成员函数重载

    #include <IOSTREAM.H> 
     
    class A 
    { 
    public: 
      A(int i):i(i){}; 
      void print(){cout<<i<<endl;} 
      A operator + (A &b); 
      A& operator += (A &b); 
      A operator ++(int); 
      A& operator ++(); 
    protected: 
      int i; 
    private: 
    }; 
     
    A A::operator + (A &b){//重载 + 
      return A(i + b.i); 
    } 
     
    A& A::operator+= (A &b){ 
      i += b.i; 
      return *this; 
    } 
     
    A A::operator++ (int){//i++ 
      return A(i++); 
    } 
     
    A& A::operator ++(){//++i 
      i++; 
      return *this; 
    } 
     
    void main(){ 
      A a = 2; 
      A b = 3; 
      (++a).print(); 
      (b++).print(); 
    } 
    

    展开阅读
    精选笔记2:C++设计模式编程中Template Method模板方法模式的运用

    19小时37分钟前回答

    准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模版方法模式的用意。

    很多人可能没有想到,模版方法模式实际上是所有模式中最为常见的几个模式之一,而且很多人可能使用过模版方法模式而没有意识到自己已经使用了这个模式。模版方法模式是基于继承的代码复用的基本技术,模版方法模式的结构和用法也是面向对象设计的核心。

    模版方法模式需要开发抽象类和具体子类的设计师之间的协作。一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤。代表这些具体逻辑步骤的方法称做基本方法(primitive method);而将这些基本法方法总汇起来的方法叫做模版方法(template method),这个设计模式的名字就是从此而来。

    模版方法模式中的方法

    模版方法中的方法可以分为两大类:模版方法(Template Method)和基本方法(Primitive Method)。

    模版方法

    一个模版方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法或一个总行为的方法。这个模版方法一般会在抽象类中定义,并由子类不加以修改地完全继承下来。

    基本方法

    基本方法又可以分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。

    • 抽象方法:一个抽象方法由抽象类声明,由具体子类实现。在C#语言里一个抽象方法以abstract关键字标示出来。
    • 具体方法:一个具体方法由抽象类声明并实现,而子类并不实现或置换。在C#语言里面,一个具体方法没有abstract关键字。
    • 钩子方法:一个钩子方法由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。(Visual FoxPro中项目向导建立的项目会使用一个AppHook类实现监视项目成员变化,调整系统结构的工作。)钩子方法的名字通常以do开始。


    模板方法模式的实现

    完整代码示例(code):模板方法模式的实现很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用 C++实现,并在 VC 6.0 下测试运行)。

    代码片断 1:Template.h

    //Template.h
    #ifndef _TEMPLATE_H_
    #define _TEMPLATE_H_
    class AbstractClass{
      public:
      virtual ~AbstractClass();
      void TemplateMethod();
      protected:
      virtual void PrimitiveOperation1() = 0;
      virtual void PrimitiveOperation2() = 0;
      AbstractClass();
      private:
    };
    class ConcreteClass1:public AbstractClass{
      public:
      ConcreteClass1();
      ~ConcreteClass1();
      protected:
      void PrimitiveOperation1();
      void PrimitiveOperation2();
      private:
    };
    class ConcreteClass2:public AbstractClass{
      public:
       ConcreteClass2();
      ~ConcreteClass2();
      protected:
      void PrimitiveOperation1();
      void PrimitiveOperation2();
      private:
    };
    #endif //~_TEMPLATE_H_
    

    代码片断 2:Template.cpp

    #include "Template.h"
    #include <iostream>
    using namespace std;
    AbstractClass::AbstractClass(){
    }
    AbstractClass::~AbstractClass(){
    }
    void AbstractClass::TemplateMethod(){
       this->PrimitiveOperation1();
      this->PrimitiveOperation2();
    }
    ConcreteClass1::ConcreteClass1(){
    }
    ConcreteClass1::~ConcreteClass1(){
    }
    void ConcreteClass1::PrimitiveOperation1(){
      cout<<"ConcreteClass1...PrimitiveOperat
      ion1"<<endl;
    }
    void ConcreteClass1::PrimitiveOperation2(){
      cout<<"ConcreteClass1...PrimitiveOperat
      ion2"<<endl;
    }
    ConcreteClass2::ConcreteClass2(){
    }
    ConcreteClass2::~ConcreteClass2(){
    }
    void ConcreteClass2::PrimitiveOperation1(){
    cout<<"ConcreteClass2...PrimitiveOperat
    ion1"<<endl;
    }
    void ConcreteClass2::PrimitiveOperation2(){
      cout<<"ConcreteClass2...PrimitiveOperat
      ion2"<<endl;
    }
    

    代码片断 3:main.cpp

    #include "Template.h"
    #include <iostream>
    using namespace std;
    int main(int argc,char* argv[]){
      AbstractClass* p1 = new ConcreteClass1();
      AbstractClass* p2 = new ConcreteClass2();
      p1->TemplateMethod();
      p2->TemplateMethod();
      return 0;
    }
    

    代码说明:由于模板方法模式的实现代码很简单,因此解释是多余的。其关键是将通用算法(逻辑)封装起来,而将算法细节让子类实现(多态)。

    唯一注意的是我们将原语操作(细节算法)定义未保护(Protected)成员,只供模板方法调用(子类可以)。


    适用场景
    一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
    各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是O p d y k e 和J o h n s o n 所描述过的“重分解以一般化”的一个很好的例子[ O J 9 3 ]。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
    控制子类扩展。模板方法只在特定点调用“h o o k ”操作(参见效果一节),这样就只允许在这些点进行扩展。

    展开阅读

    C++编程相关资源

    • C++编程调试秘笈

      C++编程调试秘笈

      大小:19439 MB MC++编程

      立即下载
    • C++标准模板库编程实战

      C++标准模板库编程实战

      《C++标准模板库编程实战》 介绍最新的C++14标准的API、库和扩展,以及如何将它们运用到C++14程序中。在书中,作者Ivor Horton 则阐述了什么是STL,以及如何将它们应用到程序中。我们将学习如何

      大小:130.9 MBC++编程

      立即下载
    • Visual C++/Turbo C串口通信编程实践

      Visual C++/Turbo C串口通信编程实践

      VisualC++/TurboC串口通信编程实践 作者:龚建伟熊光明 出版时间:2004/10/1 本书从编程实践的角度详细介绍了Windows环境下和DOS环境下的串口通 信的基本方法,并根据当前串口与网络结合发展的趋势,介绍了串口与网络 TCP/IP、远程控制与监测相结合的一些解决方案和编程要点。由于编程步骤 详尽,初学VisualC++/C(甚至是以前完全没有接触过VisualC++)的读者也 能很快编写出VisualC++的串口通信程序。本书配光盘,书中实例源程序和 相关资料可在对应章节的文件夹中

      大小:16.27 MBC++

      立即下载
    • Vilual C++ 6.0编程实例与技巧

      VisualC++6.0编程实例与技巧 作者:王华/叶爱亮 出版日期:1999-04 本书共分20章,主要介绍了VisualC++集成开发环境、通用MFC编程、多媒体制作、数据库编程、多线程编程、网络编程、Activex控件以及一些常用编程方法和技巧等,并配以大量例程。 本书是使用VisualC++开发工具的初、中级程序员。

      大小:10.88 MBC++

      立即下载
    • 小学生C++趣味编程

      小学生C++趣味编程

      《 小学生C++趣味编程 》难度系数适度、易懂易教的教材内容是进行中小学信息学课堂教学的重要一环。 选择80好几个接近中学生学习衣食住行的事例,融合小学生的认知能力规律性,激起小孩

      大小:57 MB儿童编程

      立即下载

    学习笔记

    17小时23分钟前回答

    C++设计模式编程中的迭代器模式应用解析

    迭代器模式:提供一种方法顺序访问一个聚合对象中个各个元素,而不暴露该对像的内部表示. 迭代器模式应该是最为熟悉的模式了,最简单的证明就是我在实现组合模式、享元模式、观察者模式中就直接用到了 STL 提供的迭代器来遍历 Vector 或者 List数据结构。 迭代器模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个类中进行,这样就避免了暴露这个聚合对象的内部表示的可能。 模式的动机: (1)一个聚合对象,如一个列表(List)或者一个集合(Set),应该提供一种方法来让别人可以访问它的元素,而又不需要暴露它的内部结构。 (2)针对不同的需要,可能还要以不同的方式遍……

    24小时8分钟前回答

    浅析设计模式中的代理模式在C++编程中的运用

    由遇到的问题引出代理模式 至少在以下集中情况下可以用代理模式解决问题: 创建开销大的对象时候,比如显示一幅大的图片,我们将这个创建的过程交给代理去完成,GoF 称之为虚代理(Virtual Proxy); 为网络上的对象创建一个局部的本地代理,比如要操作一个网络上的一个对象(网络性能不好的时候,问题尤其突出),我们将这个操纵的过程交给一个代理去完成,GoF 称之为远程代理(Remote Proxy); 对对象进行控制访问的时候,比如在 Jive 论坛中不同权限的用户(如管理员、普通用户等)将获得不同层次的操作权限,我们将这个工作交给一个代理去完成,GoF 称之为保护代理(Protection Proxy)。 UML 图……