zoukankan      html  css  js  c++  java
  • C++面向对象高级编程(一)基础篇

    技术在于交流、沟通,转载请注明出处并保持作品的完整性。

    概要:

    知识点1 构造函数与析构函数

    知识点2 参数与返回值

    知识点3 const

    知识点4 函数重载(要与重写区分开)

    知识点5 友元


    先以C++的两大经典class(complex 不含指针,   string 含指针)之一 complex(复数类) 做例子.

    #ifndef complex_hpp //防止头文件重复
    #define complex_hpp
    
    #include <stdio.h>
    
    class complex
    {
    public:
        //知识点1 构造与析构函数(见下文)
        complex(double r = 0, double i = 0) : re(r) ,im(i) {}
       //知识点2 参数与返回值(见下文)
        complex& operator += (const complex& r);
        //知识点3 const(见下文)
        double real() const { return re; }
        double imag() const { return im; }
        //知识点4 函数重载(见下文)
        void real(double r);
        
    private:
        double re,im;
        //知识点5 友元(见下文)
        friend complex& __doapl (complex*, const complex&);
    };
    //知识点6 内联(见下文)
    inline complex&__doapl (complex* ths, const complex& r)
    {
        ths->re += r.re;
        ths->im += r.im;
       return *ths;
    }
    
    #endif /* complex_hpp */

    知识点1 构造函数与析构函数

     a. 构造函数不可以直接调用,他是有我们创建之后自动调用的函数 

     b.上面我写的是带初省值的构造函数(就是带红色:),则你不可以再声明不带参数而带有出省值的构造函数

        complex () : re(0) , im(0) {}  //如果你在声明这样的构造函数  会报错.因为下面的两个初始化 编译器会识别不出该调用哪个
        complex c1;
        complex c2();

    c.如果将构造函数与析构函数声明private权限下,则外界不可以随便创建该对象,应用实例单例设计模式(这个我会在C++设计模式的文章中做详细介绍)

    d.可用下面三种方式创建对象

    complex c2;//默认构建  栈
    complex c1(2,1);//初始值构建 栈
    complex* p = new complex(4);//动态构建 堆

    e.析构函数,不可以直接调用,对象销毁时自动调用,不带指针的类多半可以不用写析构函数

    f.对象的创建有两个过程 1.初始化,2.赋值,所以带出省值的构造函数(给成员变量赋值)比 不该出省值的构造函数内部赋值 创建对象更有效率


    知识点2 参数与返回值

    参数 : 参数传递的三种形式 pass by value(将整包东西穿过去,效率低) , pass by pointer(传递指针), pass by reference(传递引用,类似指针,建议使用)

    a.介绍一下引用,引用相当于取别名,必须初始化,之后不能再引用其他变量,不能引用null

    b.传递引用效率高,且比传递指针更加漂亮,传递引用4字节(你可能会说传递char 1字节,比引用快,具体情况具体分析嘛)

    void func_int(int a); //pass by value
    void func_char(char* i);//pass by point
    void func()_class(const complex&);//pass by reference

    返回值 : 三种形式同参数,效率任然是by reference更高,但是要注意,不要返回局部对象的引用

    错误实例

    int& func()
    {
      int a = 0;
      return a; //函数调用结束后,局部变量a将销毁,返回局部变量引用无意义
    }

    知识点3 const

    先介绍一下const的作用,使"其"不能变.

    a.const声明普通变量, 即常量,必须初始化 

    const int a = 10;

    b.const声明指针

    const int* p1;//不能改变其指向的数据
    int const *p2;//同上
    int* const p3;//不能改变其指向

    c.const声明成员变量,常量成员,需要在构造函数中初始化

    d.const声明函数 

    //在class中
    const void func(); //不能调用非const成员函数

     像complex中函real()的const

    double real() const { return re; }//可以理解成常量成员函数 const member functions  不可以改变变量 只能get 不能set
    
    //如果你不声明const的话
    
     const complex c1(2,1);
    
     cout << c1.real(); //会报错  --- 因为c1是const变量 该函数可能修改其变量

    要大胆的使用const,会给你带来无限的好处.


    知识点4 函数重载(要与重写区分开)

    a.不同的函数可以具有相同的函数名,前提是形参列表不同(参数个数不同,参数类型不同)

    b.不能通过返回值得类型不同进行函数重载


    知识点5 友元

    a.frend声明的函数 优点:实现类之间数据共享时,减少系统开销,提高效率 . 缺点 友元函数破环了封装机制

    b.同一个class的各个object 互为 friend (友元)

    complex c1(2,1);
    complex c2; //c1与c2互为友元

    c.高效率

    friend complex& __doapl (complex*, const complex&); //可以直接使用其私有成员变量  效率会高于其他函数如"set()"函数

    知识点6 内联

    a.inline内联函数,效率高,即使你将函数声明称inline也可能内联不成功,内联函数实现控制在5行内.


    效率与推荐

    a.  带出省值的构造函数

    b.  return/pass by reference

    c.  友元

    d.  内联

    e.  move() //我在格式工厂(四)中有介绍

    如有不正确的地方请指正

    参照<<侯捷 C++面向对象高级编程>>

  • 相关阅读:
    phpstorm 使用 Xdebug 调试代码
    frp 实现内网穿透(Windows 版)
    update-alternatives 使用详解
    Linux 虚拟机使用 xshell 连接 (debian、kali、CentOS)
    PHP xml 转数组 数组转 xml 操作
    Mac上查看当前安卓手机上打开的app的包名和主程序入口
    启动appium server时打印日志时间
    App自动化测试框架学习探索--从零开始设计
    System.getProperty("user.dir")获取的到底是什么路径?
    读取Excel文件,抛出类似Cleaning up unclosed ZipFile for archive D:projectmyTestautoAppUIexcelMode用例模板2.xlsx 错误解决
  • 原文地址:https://www.cnblogs.com/LearningTheLoad/p/7277354.html
Copyright © 2011-2022 走看看