zoukankan      html  css  js  c++  java
  • 学习C++必须掌握的概念

     


    一、指针的概念 

    char str[] = "ABCDEFG";
    char *pc = str; //pc是指向string str的指针
    short x = 33;  
    short *ppx = &x; //px是指向short x的指针
    cout << *pc << endl; //这条语句将打印字符‘A’
    pc += 4; //指针向右移动4指向第5个字符
    cout << *pc << endl; //这时这条语句将打印字符‘E’
    pc--; //向左移动指针
    cout << *pc << endl; //这时这条语句将打印字符‘D’
    cout << *ppx + 3 << endl; //这条语句打印36因为=33+3

    在 C 程序中,假设我们已定义了以下的几个变量及函数: int k, tem, *P1, *P2, a[5], f(), *P3(); 以下的设定叙述(Assignment statements)中, 那些有语法上的错误? 并请说明其原因

    1.P1 = &k;
    2.P2 = a;
    3.P3 = f;
    4.P1 = &a[3];
    5.P1 = P2;

    答案:
    (1) P1 = &k; P1是指针变量, 因此P1表位址,而k表示一般变量,&k表示取出k的位址,故正确.
    (2) P2 = a; a是数组名称,此时可代表数组存放在内存中的起始位址,而P2为指针变量,故正确.
    (3) P3 = f; f代表函数的名称,此时代表呼叫函数f,因此含有传回值,而P3为指针变量,故此式有错误.
    (4) P1 = &a[3];P1表指针变量,代表位址,而&a[3]表取出索引(index)为3的数组元素的位址,故正确.
    (5) P1 = P2; P1,P2皆为指针变量代表位址,此叙述是指将P2的位址指定给P1,故正确.


    结构的概念
    结构是一种类型,它的成员默认是public.

    struct Student //定义一个结构Student用来存放学生的资料

    int id; //编号
    char name[30]; //名字
    }
    Student s = {555, “Davis, Samuel”}; //初始化Student的实例s
    cout << s.id << “ “ << s.name << endl; //这条将打印“ 555 Davis,Samuel”

    类的概念我想大家都应该很清楚了,我就不废话了。

    类的继承的概念
    class base
    {
    private:
    int a;
    protected:
    int b;
    public:
    int c;
    };
    class sub1:public base {…};
    class sub2:private base{…};

    说明在base,sub1,sub2中所能取用的data members各为何.并指出这些data members的access mode(private, protected或public).
    Ans:
    class data members access mode
    base a private
    b protected
    c public
    sub1
    b protected
    c public
    sub2
    b private
    c private


    虚函数和抽象类

    多态 (polymorphism)
    面向对象程设计的核心观念之一就是多态--它使一群类似的行为的同名称的方法, 但各对象可依适合自己所需的方式建构此同名动作的实行细节, C++多态的关键在于所谓的虚函数这一类的函数。

    虚函数(virtual function)
    透过虚拟函数, 衍生类可重新定义基类的成员函数, 若想在C++程式中建立虚拟函数(然後才能实行多态), 只需利用virtual关键字声明函数即可(如下所示)
    virtual void Display();
    虚函数的用处
    针对共享相同基类的那些对象, 可有较一致的使用态度, 例如, 你可能定义一个名为Shape且带有一 个Draw虚拟成员函数的基类, 然后从它派生了Circle类和Square类, 而且它们各自带有自己的Draw成员函数.从这些类派生建立的每个对象都可呼叫Draw成员函数; 但是编译程式可确保各自应呼叫那个版本的Draw 函数.是基类的还是派生类的。

    一个例子

    重要观念: 指向父类的指针也可用来指向子类别

    #include <iostream.h>
    class BaseClass
    {
    public:
    virtual void Display( ) { cout << 100 << "\n"; }
    };
    class DerivedClass: public BaseClass
    {
    public:
    virtual void Display( ) { cout << 200 << "\n"; }
    };
    void Print(BaseClass* pbc)
    { pbc->Display( ); }
    int main( )
    { BaseClass* pbc = new BaseClass;
    DerivedClass* pdc = new DerivedClass;
    Print(pbc);//显示 100
    Print(pdc);//显示 200
    return 0;
    }

    V-table (Virtual function table)
    当C++程式呼叫非虚函数, 采用与C程式呼叫函数所用方式一样的静态绑定来呼叫函数. 但是C++程式 若是透过指向类别的指针来呼叫虚函数时, 编译程式则采用所谓的晚期绑定(late binding)或静态绑定 (static binding)技术来呼叫函数.
    而C++虚函数用虚函数表(virtual function table), 或称V-表来实作动态绑定, 所谓的V-表是一 个函数指针的阵列, 这是编译程序替每个使用虚函数的类所建制的。

    纯虚函数 (pure virtual function)
    一个不仅可被重新定义, 而且必须被重新定义的成员函数就称为纯虚函数, 你只要指定函数一个零值 (更有效说法是一个空指针),就可将虚成员函数转为纯虚成员函数,如以下所示
    virtual void PrintData() = 0;

    抽象类 (abstract class)
    当一个类含有至少一个纯虚函数时, 此类就称为抽象类,而你无法以此类来衍生建立对象.


    C++ template classes

    一般的声明及使用 
    class Collection
    { …
    int A[10]; 
    }
    Collection object; 
    模板的声明及使用
    template <class T> //注意这里
    class Collection
    { …
    T A[10]; }// generic declaration
    Collection<int> object; //注意这里
    Collection<char> object; //注意这里

  • 相关阅读:
    学习笔记1:性能问题在于你想不到的任何地方!
    React Native控件之PullToRefreshViewAndroid下拉刷新组件解说(20)
    CSDN-markdown编辑器之导入导出文档功能
    无名管道与有名管道通讯编程
    LeetCode Remove Nth Node From End of List
    libpcap出错信息调试函数pcap_geterr, pcap_perror
    工作流学习——Activiti流程实例、任务管理四步曲
    B
    oracle学习笔记 oracle软件安装和数据库的创建
    路由器逆向分析------MIPS系统网络的配置(QEMU)
  • 原文地址:https://www.cnblogs.com/bluespot/p/932767.html
Copyright © 2011-2022 走看看