【C++类和对象】初始化列表与隐式类型转换

2024-05-13 1700阅读

💞💞 前言

hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹

【C++类和对象】初始化列表与隐式类型转换

💥个人主页:大耳朵土土垚的博客

💥 所属专栏:C++入门至进阶

这里将会不定期更新有关C++的内容,希望大家多多点赞关注收藏💖💖

目录

  • 💞💞 前言
  • 1.初始化列表
    • 1.1初始化列表定义
    • 1.2初始化列表原因
    • 1.3初始化列表注意点
    • 2. explicit关键字
      • 2.1explicit关键字定义
      • 2.2隐式类型转换
      • 2.3explicit关键字使用
      • 3.结语

        1.初始化列表

        1.1初始化列表定义

        C++中的初始化列表是一种在对象构造函数中初始化成员变量的方法。它通过在构造函数的参数列表后面使用冒号来指定成员变量的初始化值,而不是在构造函数体内使用赋值语句来初始化。

        在构造函数体内使用赋值语句来初始化:

        class Date
        {
        public:
         Date(int year, int month, int day)
         {
         _year = year;
         _month = month;
         _day = day;
         }
        private:
         int _year;
         int _month;
         int _day;
        };
        

        上述例子中我们使用构造函数对类的成员变量进行赋值;

        虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。

        初始化列表:

        初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。

        class Date
        {
        public:
        	Date(int year, int month, int day)
        	: _year(year)
        	, _month(month)
        	, _day(day)
        	{}
        private:
        	int _year;
        	int _month;
        	int _day;
        };
        

        在上面的例子中,构造函数的初始化列表使用冒号 “:” 来指定成员变量 _year 和 _month和_day的初始值。在构造函数体内,不需要再使用赋值语句来初始化这些成员变量。

        使用初始化列表可以提高代码执行效率,特别是在成员变量为对象类型时,可以避免多次调用默认构造函数和拷贝构造函数。

        1.2初始化列表原因

        在C++类和对象中有些成员变量必须定义的时候初始化,这时候如果只是简单的使用构造函数来赋值是不可行的,所以C++引入了初始化列表这个概念;

        类中包含以下成员,必须放在初始化列表位置进行初始化:

        1.引用成员变量

        2.const成员变量

        3.自定义类型成员(且该类没有默认构造函数时)

        class A
        {
        public:
         	A(int a)
        	 :_a(a)
        	 {}
        private:
         	int _a;
        };
        class B
        {
        public:
        	 B(int a, int ref)
        	 :_aobj(a)
        	 ,_ref(ref)
        	 ,_n(10)
        	 {}
        private:
        	 A _aobj; // 没有默认构造函数
        	 int& _ref; // 引用
        	 const int _n; // const 
        };
        
        • 在上面的例子中,常量成员变量 _n必须在构造函数的初始化列表中进行初始化,因为常量成员变量在对象创建后不能修改;
        • 引用成员变量 _ref 必须在构造函数的初始化列表中进行初始化,因为引用成员变量在创建后不能修改绑定的对象。
        • 没有默认构造函数的类类型成员变量_aobj:如果成员变量是一个类类型的对象,并且该类没有默认构造函数(无参构造函数),则必须在初始化列表中调用该类的有参构造函数进行初始化。

          1.3初始化列表注意点

          1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
          2. 类中包含以下成员,必须放在初始化列表位置进行初始化:

          引用成员变量

          const成员变量

          自定义类型成员(且该类没有默认构造函数时)

          1. 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。

            例如:

          class Time
          {
          public:
          	Time(int hour = 0)
          	:_hour(hour)
          	{
          	cout 
          public:
          	Date(int day)
          	{}
          private:
          	int _day;
          	Time _t;
          };
          int main()
          {
          	Date d(1);
          }
          
          public:
          	 A(int a)
           	:_a1(a)
          	 ,_a2(_a1)
          	 {}
           
          	 void Print()
          	 {
          	 cout
          	A aa(1);
           	aa.Print();
          }
          
          public:
          	// 1. 单参构造函数,没有使用explicit修饰,具有类型转换作用	
          	 Date(int year)
          		:_year(year)
          	{}
          private:
          	int _year;
          	int _month;
          	int _day;
          };
          void Test()
          {
          	Date d1(2022);
          	// 用一个整形变量给日期类型对象赋值
          	// 实际编译器背后会用2023构造一个无名对象,最后用无名对象给d1对象进行赋值
          	d1 = 2023;
          }
          
          public:
          	// 1. 单参构造函数,没有使用explicit修饰,具有类型转换作用	
          	explicit Date(int year)
          		:_year(year)
          	{}
          private:
          	int _year;
          	int _month;
          	int _day;
          };
          
VPS购买请点击我

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

目录[+]