行业知识
【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;}
下一篇:怎么联系苍南网站?