C++ ─── 隐式类型转换、static成员、友元、内部类
目录
1. explicit关键字
2. static成员
2.1 概念
2.2 特性
3. 友元
3.1 友元函数
3.2 友元类
4. 内部类
5. 再次理解类和对象
1. explicit关键字
构造函数不仅可以构造与初始化对象,对于接收单个参数的构造函数,还具有类型转换的作用。接收单个参数的构造函数具体表现: 1. 构造函数只有一个参数 2. 构造函数有多个参数,除第一个参数没有默认值外,其余参数都有默认值 3. 全缺省构造函数class Date
{
public:
// 1. 单参构造函数,没有使用explicit修饰,具有类型转换作用
// explicit修饰构造函数,禁止类型转换---explicit去掉之后,代码可以通过编译
explicit Date(int year)
:_year(year)
{}
/*
// 2. 虽然有多个参数,但是创建对象时后两个参数可以不传递,没有使用explicit修饰,具有类型转
换作用
// explicit修饰构造函数,禁止类型转换
explicit Date(int year, int month = 1, int day = 1)
: _year(year)
, _month(month)
, _day(day)
{}
*/
Date& operator=(const Date& d)
{
if (this != &d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
return *this;
}
private:
int _year;
int _month;
int _day;
};
void Test()
{
Date d1(2022);
// 用一个整形变量给日期类型对象赋值
// 实际编译器背后会用2023构造一个匿名对象,最后用匿名对象给d1对象进行赋值
d1 = 2023;
// 将1屏蔽掉,2放开时则编译失败,因为explicit修饰构造函数,禁止了单参构造函数类型转换的作
用
}
上述代码可读性不是很好,用explicit修饰构造函数,将会禁止构造函数的隐式转换。
隐式类型转换
匿名对象看后面博客 http://t.csdnimg.cn/O7iFT#define _CRT_SECURE_NO_WARNINGS 1
#include
using namespace std;
class Date
{
public:
Date(int year= 0 ,int month = 0 ,int day = 1)
:_year(year)
,_month(month)
,_day(day)
{
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1(2024, 4, 27);
Date(2024, 5, 1);//匿名对象
//相当于Date d2 = Date(2024,5,1);
Date d2 = {2024, 5, 1};//隐式类型转换(生成了由{2024,5,1}产生的匿名对象,)
Date d3[10]{ 1,2,3,{2024,5,27} };
return 0;
}
隐式类型转化可以方便场景应用
class Date
{
public:
Date(int year = 0, int month = 0, int day = 1)
:_year(year)
, _month(month)
, _day(day)
{
}
private:
int _year;
int _month;
int _day;
};
class Stack
{
public:
void Push(const Date& d)//重点必须用const修饰,因为匿名函数是临时变量具有常性
{
//...
}
private:
//...
};
int main()
{
Stack st;
//可以直接使用
st.Push(1);
st.Push({2024,5,27});
Date d1(1);
st.Push(d1);
Date d2(2024, 5, 1);
st.Push(d2);
//隐式类型转换
Date d3 = {2024,4,27};
st.Push(d3);
return 0;
}
2. static成员
.
2.1 概念
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。 ★★★ 静态成员变量一定要在 类外 进行 初始化,要标明类int A::_scount=0;面试题:实现一个类,计算程序中创建出了多少个类对象。
class A
{
public:
A()
{ ++_scount; }
A(const A& t)
{ ++_scount; }
~A()
{ --_scount; }
static int GetACount()
{ return _scount; }
private:
static int _scount;
};
int A::_scount = 0;
void TestA()
{
cout
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!


