zoukankan      html  css  js  c++  java
  • 《C++程序设计POJ》《WEEK3 类和对象进阶》成员对象和封闭类/友元/this指针/常量成员函数

    // 构造函数赋值

    CTyre(int r, int w):radius(r), width(w) { }

    初始化列表

    #include<iostream>
    using namespace std;
    /*成员对象和封闭类
    成员对象: 一个类的成员变量是另一个类的对象
    包含 成员对象 的类叫 封闭类 (Enclosing)
    */
    class CTyre
    {
    private:
        int radius;
        int width;
    public:
        CTyre(int r, int w) :radius(r), width(w) {} //初始化列表
    };
    
    class CEngine
    {
    
    };
    
    class CCar
    {
    private:
        int price;
        CTyre tyre;
        CEngine engine;
    public:
        CCar(int p, int tr, int tw);
    };
    
    CCar::CCar(int p, int tr, int w) :price(p), tyre(tr, w) {}
    
    int main()
    {
        CCar car(20000, 17, 225);
        return 0;
    }
    View Code

    友元

    #include<iostream>
    
    class CCar; //提前声明 CCar类, 以便后面CDriver类使用
    class CDriver
    {
    public:
        void ModifyCar(CCar * pCar); //改装汽车
    
    };
    
    class CCar
    {
    private:
        int price;
        friend int MostExpensiveCar(CCar cars[], int total); //声明友元
        friend void CDriver::ModifyCar(CCar* pCar); //声明友元
    };
    
    void CDriver::ModifyCar(CCar *pCar)
    {
        pCar->price += 1000; //汽车改装后价值增加
    
    }
    
    int MostExpensiveCar(CCar cars[], int total) //求最贵汽车的价格
    {
        int tmpMax = -1;
        for (int i = 0; i < total; ++i)
            if (cars[i].price > tmpMax)
                tmpMax = cars[i].price;
        return tmpMax;
    }
    int main()
    {
        return 0;
    }
    View Code

    Note:
    友元类之间的关系
    不能传递, 不能继承

    A 是 B的友元,B 是 C的友元, 不能推出A与C的友元关系。

    this指针

    C语言的结构体不能定义成员函数!!!

    C++可以

    常量成员函数
    在类的成员函数说明后面可以加const关键字,则该成员函数成为常量成员函数。
    常量成员函数执行期间不应修改其所作用的对象。因此,在常量成员函数中不能修改成员变量的值(静态成员变量除外),也不能调用同类的非常量成员函数(静态成员函数除外)

    常量成员函数的重载

    两个成员函数,名字和参数表都一样,但是一个是const,一个不是,算重载。

    #include<iostream>
    using namespace std;
    
    class CTest
    {
    private:
        int n;
    public:
        CTest() { n = 1; } // constructor function
        int GetValue() const { return n; }
        int GetValue() { return 2 * n; }
    };
    
    int main()
    {
        const CTest objTest1;
        CTest objTest2;
        cout << objTest1.GetValue() << "," << objTest2.GetValue();
        while (1);
        {
    
        }
    }
    View Code

    常引用

    引用前面可以加const关键字,成为常引用。
    不能通过常引用,修改其引用的变量

    可以用对象的常引用作为参数,如:
    class Sample {

    };
    void PrintfObj( const Sample & o)
    {
    ……
    }
    这样函数中就能确保不会出现无意中更改o值的语句了。

    复制构造函数起作用的三种情况

    1. 当用一个对象去初始化同类的另一个对象时。
    Complex c2(c1);
    Complex c2;  //初始化语句,非赋值语句

    2. 如果某函数有一个参数是类 A 的对象,
    那么该函数被调用时,类A的复制构造函数将被调用

    3. 如果函数的返回值是类A的对象时,则函数返回时,
    A的复制构造函数被调用:

  • 相关阅读:
    php and web service with wsdl
    QT creator出现 no executable specified时解决办法
    ECShop 2.x 3.0代码执行漏洞分析
    关于QtCharts中的映射器与模型的使用
    QT 异步函数转为同步函数的方法
    Win7+Qt5.6.0(64位)+msvc2015编译器 环境配置
    SMTP用户枚举原理简介及相关工具
    Android系统广播机制存在漏洞,恶意软件可绕过安全机制跟踪用户
    Qt 维护工具MaintenanceTool.exe 使用
    漏洞预警 | ECShop全系列版本远程代码执行高危漏洞
  • 原文地址:https://www.cnblogs.com/focus-z/p/10992077.html
Copyright © 2011-2022 走看看