小工具知识网

当前位置: 首页 > 行业知识 > 【C++】类和对象终章

行业知识

【C++】类和对象终章

2026-11-08 00:48:43 来源:互联网转载

博客主页: 小羊失眠啦.

系列专栏:《C语言》 《数据结构》 《C++》 《Linux》 《Cpolar》

❤️感谢大家点赞收藏⭐评论✍️


文章目录

  • 一、初始化列表
    • 1.1 初始化列表的形式
    • 1.2 初始化列表的注意事项
    • 二、explicit关键字
      • 2.1 单参数构造函数
      • 2.2 多参数构造函数
      • 三、static成员
        • 3.1 static成员的概念
        • 3.2 static成员的特性
        • 四、友元
          • 4.1 概念
          • 4.2 友元函数
          • 4.3 友元类
          • 五、内部类(不常用)
            • 5.1 内部类的性质
            • 六、匿名对象
            • 七、关于拷贝对象时一些编译器优化

              本章我们将继续加深对构造函数的学习。认识初始化列表、explicit关键字、static成员、学习static成员的相关特性、学习友元的概念,包含友元函数和友元类;内部类;匿名对象以及关于拷贝构造时一些编译器优化的情况等。

              一、初始化列表

              在构造函数的学习中,我们知道可以通过构造函数对一个对象的成员变量赋初始值。我们以Date类为例:

              namespace Aron{class Date{public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}void print(){cout Aron::Date d1(2024, 3, 16);d1.print();return 0;}class Date{public:Date(int year, int month, int day):_year(year),_month(month),_day(day){/*_year = year;_month = month;_day = day;*/}void print(){cout Aron::Date d1(2024, 3, 16);d1.print();return 0;}class A{public:A(int a):_a(a){}private:int _a;};class B{public:B(int a,int i,int b):_b(a),_i(i),_a(b){}private:int& _b;const int _i;A _a;};}class Date{public:void print(){cout class C{public:C():a(10),b(a){}void print(){cout Aron::C c;c.print();return 0;}class D{public:D():b(10), a(b){}void print(){cout Aron::D d;d.print();return 0;}    class Date    {        public:        Date(int year)            :_year(year)            {}        private:        int _year=0;    };}class Date{public:explicit Date(int year):_year(year){}private:int _year = 0;int _month = 0;int _day = 0;};}int main(){Aron::Date d = 100;return 0;}    class Date    {    public:        //除第一个参数外,其余都有默认值        //加上explicit关键字会报错        Date(int year, int month=0, int day=0)            :_year(year),            _month(month),            _day(day)        {}    private:        int _year;        int _month;        int _day;    };}int main(){Aron::Date d2 = 100;return 0;}    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(){Aron::Date d2 ={2024,3,16};//使用大括号return 0;}    class A    {    public:        int getN()        {            return n;        }    private:        //类中进行声明        static int n;    };        //类外进行定义与初始化int A::n = 0;}class A{public:int getN(){return n;}static int m;private://类中进行声明static int n;};//类外进行定义与初始化int A::n = 0;int A::m = 0;}int main(){Aron::A a;a.m += 10;cout class B    {    public:        static int getN()        {            //错误示例            //静态函数不能直接访问非静态成员            //_a++;            return n;//可以访问静态成员        }    private:        static int n;        int _a;    };}public:sum(){_sum += _i;_i++;}static int GetSum(){return _sum;}private:static int _sum;static int _i;};int sum::_sum = 0;int sum::_i = 1;class Solution{public:int Sum_Solution(int n){sum a[n];return sum::GetSum();}};class Date    {    //...        //使用因为返回,为了适应连续输入或输出的情况        ostream& operator            out             in _year _month _day;            return in;        }        //...    }}void Test(){Aron::Date d1(2024, 3, 16);d1 class Date    {    //...        //声明友元函数        friend ostream& operatorout in  d._year  d._month  d._day;return in;}}    class Time    {        friend class Date;//声明日期类为时间类的友元类,则在日期类中可以直接发访问时间类        Time(int hour = 0, int minute = 0, int second = 0)            : _hour(hour)            , _minute(minute)            , _second(second)        {}    private:        int _hour;        int _minute;        int _second;    };    class Date    {    public:        Date(int year = 2023, int month = 4, int day = 9)            : _year(year)            , _month(month)            , _day(day)        {}        void SetTime(int hour, int minute, int second)        {            // 直接访问时间类私有的成员变量            _t._hour = hour;            _t._minute = minute;            _t._second = second;        }    private:        int _year;        int _month;        int _day;        Time _t;    };}    class A    {    public:        class B // B天生就是A的友元        {        public:            void print(const A& a)            {                cout Aron::A::B b;//定义B类对象Aron::A a;b.print(a);return 0;}class solution{public:int Sum_Solution(int n){int sum = 0;for (int i = 1; i sum += i;}return sum;}};}int main(){//匿名对象的使用场景cout class Date    {    public:        Date(int year)            :_year(year)        {}    private:        int _year=0;    };}void Test(){//1个拷贝构造+1个构造优化为——直接构造Aron::Date d = 2024;}public:A(int a = 0):_a(a){}private:int _a;};void func1(A aa){}void func2(const A& aa){}A func3(){A aa;return aa;}A func4(){return A();}int main(){A aa1 = 1; // 构造+拷贝构造 —— 优化为直接构造func1(aa1); // 无优化func1(2); // 构造+拷贝构造 —— 优化为直接构造func1(A(3)); // 构造+拷贝构造—— 优化为直接构造func2(aa1);  // 无优化func2(A(3)); // 无优化A aa2 = func3(); // 拷贝构造+拷贝构造  -- 优化为一个拷贝构造A aa3;aa3 = func3();  // 不能优化func4(); // 构造+拷贝构造 -- 优化为直接构造A aa4 = func4(); // 构造+拷贝构造+拷贝构造  -- 优化为直接构造return 0;}

上一篇:宝塔面板重启教程,详细步骤助你快速恢复服务运行!

下一篇:怎么联系苍南网站?