C++ ─── 隐式类型转换、static成员、友元、内部类

2024-05-01 1148阅读

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;
}

C++ ─── 隐式类型转换、static成员、友元、内部类

隐式类型转化可以方便场景应用

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 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]