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的复制构造函数被调用:

  • 相关阅读:
    关于这个 blog
    P6499 [COCI2016-2017#2] Burza 题解
    CF1172F Nauuo and Bug 题解
    CF1479D Odd Mineral Resource 题解
    CF1442E Black, White and Grey Tree 题解
    CF1442D Sum 题解
    CF1025D Recovering BST 题解
    CF1056E Check Transcription 题解
    CF1025F Disjoint Triangles 题解
    红包算法的PHP实现
  • 原文地址:https://www.cnblogs.com/focus-z/p/10992077.html
Copyright © 2011-2022 走看看