C++学习(3)-类和对象

2020-08-11  本文已影响0人  su945

1.this指针作用

2.静态成员


- 静态成员变量本质上是全局变量,即使一个对象都不存在,类的静态成员变量也存在。
- 静态成员函数本质上是全局函数

注意事项

在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数。

3.成员对象和封闭类

class A
{
public:
    A() { cout << "default" << endl; }
    A(A & a) { cout << "copy" << endl; }
};
class B { A a; };
int main()
{
    B b1, b2(b1);
    return 0;
}
/*
输出:
default
Copy
说明b2.a是用类A的
复制构造函数初始化的
。而且调用复制构造函
数时的实参就是b1.a。
*/

4.友元

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;
}

可以将一个类的成员函数(包括构造、析构函数)说明为另一个类的友元。


2)友元类:如果A是B的友元类,那么A的成员函数可以访问B的私有成员。

class CCar
{
private:
int price;
friend class CDriver; //声明CDriver为友元类
};
class CDriver
{
public:
CCar myCar;
void ModifyCar() {//改装汽车
myCar.price += 1000;//因CDriver是CCar的友元类,
//故此处可以访问其私有成员
}
};
int main(){ return 0; }

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

5.常量成员函数

如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加const关键字。

class Sample {
private:
    int value;
public:
    void PrintValue() const;
};
void Sample::PrintValue() const { //此处不使用const会
                                  //导致编译出错
    cout << value;
}
void Print(const Sample & o) {
    o.PrintValue(); //若 PrintValue非const则编译错
}

如果一个成员函数中没有调用非常量成员函数
,也没有修改成员变量的值,那么, 最好将其
写成常量成员函数。
如果两个函数,名字和参数表都一样,但是一个是const,一个不是,算重载。


class CTest
{
public:
    bool GetData() const
    {
        m_n1++;
        return m_b2;
    }
private:
    mutable int m_n1;
    bool m_b2;
};
上一篇下一篇

猜你喜欢

热点阅读