建筑设计作品展示网站wordpress免费相册
news/
2025/10/7 11:36:32/
文章来源:
建筑设计作品展示网站,wordpress免费相册,合肥网页设计方法,wordpress怎么装修网页在本篇博客中#xff0c;作者将会讲解类与对象的最后一篇。 一.再谈构造函数
在类与对象#xff08;上篇#xff09;中#xff0c;我们讲到了构造函数#xff0c;其实构造函数就是给每个成员变量进行赋值#xff01;#xff01;#xff01;
仅仅只是赋值而已#xf… 在本篇博客中作者将会讲解类与对象的最后一篇。 一.再谈构造函数
在类与对象上篇中我们讲到了构造函数其实构造函数就是给每个成员变量进行赋值
仅仅只是赋值而已并不算严格意义上的初始化。
#includeiostream
using namespace std;class Date
{
public://实例化对象时同时给成员变量赋值Date(int year 0, int month 1, int day 1){_year year;_month month;_day day;}void Show(){cout _year - _month - _day endl;}
private:int _year;int _month;int _day;
};int main()
{Date d1;d1.Show();return 0;
}
初始化列表 既然普通构造函数并不是初始化那么什么才是初始化呢答案是初始化列表。 #includeiostream
using namespace std;class Date
{
public://初始化列表用法Date(int year 0, int month 1, int day 1):_year(year),_month(month),_day(day){}void Show(){cout _year - _month - _day endl;}
private:int _year;int _month;int _day;
};int main()
{Date d1;d1.Show();return 0;
}
为什么要有初始化列表呢因为有些成员变量不能通过普通构造函数来赋值如引用变量、const常量、自定义类型且该类没有默认构造函数。
#includeiostream
using namespace std;class Date
{
public://无默认构造函数默认构造函数是指不需要传参的的构造函数Date(int year,int month,int day):_year(year),_month(month),_day(day){}void Show(){cout _year - _month - _day endl;}
private:int _year;int _month;int _day;
};class Temp
{
public:Temp(int ptmp):_a(ptmp),_b(10),_d(0,0,0){}void Show(){cout _a _b endl;}
private://必须要用初始化列表的三个成员变量int _a;const int _b;Date _d;//自定义类型且无默认构造函数
};int main()
{int tmp 0;Temp t1(tmp);return 0;
} 最后初始化列表的初始化顺序与构造函数的初始化列表无关与成员变量的定义先后有关 二.static成员
static成员变量 被static修饰的成员变量称为静态成员变量静态成员变量不属于某个实例化对象它是所有类对象共享的。且静态成员变量不能在类中初始化必须在类外初始化。 #includeiostream
using namespace std;class Date
{
private:int _year;static int count;
};int Date::count 0;int main()
{return 0;
}
static成员函数 被static修饰的成员函数没有this指针。在前面讲到类的成员函数都会带上一个默认的this指针而被static修饰的成员函数没有this指针。 三.友元
友元函数 什么是友元函数 我们知道在C类中成员变量都会有一个访问修饰符其中private和protect是私有和保护的被这两个修饰的成员变量不能被类外部访问只能被类内部访问那么如果我们想在外部用函数来对类内部的成员变量进行访问就可以用友元函数。 #includeiostream
using namespace std;class Date
{//声明Show是友元函数friend void Show(const Date d);
public:Date(int year0,int month1,int day1):_year(year),_month(month),_day(day){}
private:int _year;int _month;int _day;
};void Show(const Date d)//可以在类外部访问类内部的成员变量
{cout d._year - d._month - d._day endl;
}int main()
{Date d1(2024, 3, 24);Show(d1);return 0;
} 看到这里可能会有人疑惑我直接在类内部定义一个Show函数就好了吗为什么还要搞一个友元函数因为有一些地方必须要用到友元函数。 友元函数重载 在C中如果我们想输出某个内置类型变量直接cout 变量名即可那如果我们想输出自定义类型则需要额外写一个Show函数而且每次都要调用该类的函数那么有没有办法可以使用 cout类实例化对象 这样的方式来实现输出了答案是可以的。 在类与对象中篇中我们讲到了操作符重载即我们可以重载这个操作符来实现。 常规做法实现
#includeiostream
using namespace std;class Date
{
public:Date(int year0,int month1,int day1):_year(year),_month(month),_day(day){}ostream operator(ostream out)//重载操作符{cout _year - _month - _day endl;return out;}
private:int _year;int _month;int _day;
};int main()
{Date d1(2024, 3, 24);Date d2(2024, 3, 25);d2 (d1 cout);return 0;
} 我们可以发现如果在类中定义重载操作符会发现它的使用方式和常规使用方式不同它是反过来的因为在operator函数中会默认有个this指针占了第一个参数的位置同时d1cout 等价于 d1.operator(d1,cout)导致使用方法与原本相反这时我们就需要使用友元函数来解决。 友元函数实现 通过使用友元函数的实现可以达到我们想要的效果。 友元类 友元类就是A类是B类的朋友所以A类可以突破访问权限限制可以去访问B类的非公有成员变量。 #includeiostream
using namespace std;class Time
{friend class Date;//声明Date类是它的朋友
public:Time(int hour0,int min0,int second0):_hour(hour),_min(min),_second(second){}
private:int _hour;int _min;int _second;
};class Date
{
public:Date(int year,int month,int day):_year(year),_month(month),_day(day){}void SetTime(int hour, int min, int second)//这个函数可以突破访问权限去访问Time的成员变量{_t._hour hour;_t._min min;_t._second second;}
private:int _year;int _month;int _day;Time _t;
};int main()
{Date d1(2024, 3, 24);d1.SetTime(0, 0, 0);return 0;
} 但是这种关系是单向的Date可以去访问Time而Time不能去访问Date。同时友元关系不能传递也不能继承。 四.匿名对象 匿名对象就是使用类来实例化一个匿名的对象这个匿名的对象可以直接调用类种的成员函数但是它的生命周期只有在定义它的那一行。 #includeiostream
using namespace std;class Solution
{
public:int GetSum(int n){return n;}
};int main()
{Solution().GetSum(10);//实例化一个匿名类去知道调用它的成员函数return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/930354.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!