0
点赞
收藏
分享

微信扫一扫

【C++初阶】第六篇——类和对象(下)(初始化列表+explicit关键字+static成员+友元+内部类)

pipu 2022-01-21 阅读 144

目录


🌏构造函数中的初始化列表

class
{
public:
	Date(int year, int month, int day)// 成员变量定义处  给变量开空间
		: _year(year)
		, _month(month)
		, _day(day)
	{}
private:
	// 成员变量声明处  
	int _year;
	int _month;
	int _day;
};

注意:

  1. 每个成员变量只能在初始化列表中出现一次
  2. 类中包含定义时必须初始化的成员时,必须使用初始化列表
  • const成员变量(常量)
  • 引用成员变量(引用必须在定义时初始化)
  • 无默认构造函数(无参、全缺省和编译器给的默认构造函数)的自定义类型成员变量
class AA
{
public:
    AA(int a)// AA类无默认构造函数,必须使用初始化列表
    {
        _a = a;
    }
private:
    int _a;
};
class Date
{
    Date(int year = 1, int month = 1, int day = 1, int i = 10)
        :_a(10)
        ,_ref(i)
        ,_aa(10)
    {
        _year = year;
        _month = month;
        _day = day;
    }


    void Print()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
    
private:
    // 成员变量声明的地方 还未申请空间
    int _year;
    int _month;
    int _day;
	
	// 以下三个成员变量都是必须在定义时初始化
    const int _a;
    int _ref;
    AA _aa;
};

一个小问题

🌏explicit关键字

class Date
{
public:
    Date(int year, int month, int day)
        :_year(year)
        ,_month(month)
        ,_day(day)
    {}
    
private:
    int _year;
    int _month :
    int _day;
}int main()
{
    Date d1 = { 2022, 1, 21 };

    return 0;
}
explicit Date(int year, int month, int day)
        :_year(year)
        ,_month(month)
        ,_day(day)
    {}

🌏static成员

特性:

  • 静态成员属于整个类,且不占类的大小
  • 静态成员变量是在类内声明,类外定义的
  • 静态成员可以直接通过::指定类域来访问
  • 静态成员函数中没有this指针,不能访问非静态的成员

我们实现一个类,计算该程序创建了多少个对象

class Date
{
public:
    Date(int year = 1, int month = 1, int day = 1)
    {
        _sCount++;
        _year = year;
        _month = month;
        _day = day;
    }

    // 静态成员函数  无this指针,可以直接用::指定类域访问
    // 只能访问静态成员变量和函数
    static int GetCount()
    {
        return _sCount;
    }

    void Print()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
    
private:
    // 成员变量声明的地方
    int _year;
    int _month;
    int _day;

    // 静态成员变量属于整个类(所有类)生命周期在整个程序运行期间
    // 可以直接用::指定类域访问
    static int _sCount;// 类内声明,类外初始化定义
};

// 静态必须要在类外初始化定义
int Date::_sCount = 0;

🌏C++11中新的初始化方式

class Date
{
public:

    void Print()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
    
private:
    // 成员变量声明的地方
    // 注意,这里不是定义,而是声明,在声明是给缺省值
    int _year = 1;
    int _month = 1;
    int _day = 1;
    static int _sCount;// 静态成员变量不能像上面一样
};

// 静态必须要在类外初始化定义
int Date::_sCount = 0;

🌏友元

💎友元函数


class Date
{
    // 友元函数
    // 不能用const修饰  const修饰的是非静态的成员函数 一个类可以是很多函数的友元
    friend ostream& operator<<(ostream& out, const Date& d);
    friend istream& operator>>(istream& in, Date& d);
public:
    Date(int year = 1, int month = 1, int day = 1)
    {
        _year = year;
        _month = month;
        _day = day;
    }

    void Print()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
    
private:
    int _year;
    int _month;
    int _day;
};



// 全局
ostream& operator<<(ostream& out, const Date& d)
{
    out << d._year << "-" << d._month << "-" << d._day << endl;

    return out;
}

istream& operator>>(istream& in, Date& d)
{
    in >> d._year >> d._month >> d._day;

    return in;
}

特性:

  • 不能用const修饰
  • const修饰的是非静态的成员函数
  • 一个类可以是很多函数的友元

💎友元类

class Date
{
public:
    Date(int year = 1, int month = 1, int day = 1)
    {
        _year = year;
        _month = month;
        _day = day;
    }

    void Print()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
    
private:
    int _year;
    int _month;
    int _day;
};

class Time
{
    // 友元类
    // Date类是Time类的友元   Date可以访问Time的私有成员  单向  不能传递
    friend class Date;
public:
    Time(int hour, int minute, int second)
        :_hour(hour)
        , _minute(minute)
        , _second(second)
    {}
private:
    int _hour;
    int _minute;
    int _second;
};

🌏内部类

特性:

  • 外部类天生就是内部类的友元类,内部类具有访问外部类私有属性的权限,但外部类却没有访问内部类的私有属性的权限
  • 内部类只是受外部类的类域的限制,内部类并不属于外部类,也就是sizeof(外部类)=内部类
class A
{
private:
    static int _a;
    int _b;
public:
    // 内部类
    // B天生就是A的友元   B可以访问A的私有成员,但是A不可以访问B的私有
    // sizeof(A) = 4    A中成员变量b  a属于整个类,不占对象的大小  内部类B和在全局定义的基本一致,知识受A类域的限制
    class B
    {
    public:
        void f()
        {

        }
    private:
        int _a;
    };
};

int A::_a = 10;

🌐总结

C++的类和对象全部内容就介绍到这里了,喜欢的话,欢迎点赞支持~
在这里插入图片描述

举报

相关推荐

0 条评论