这篇文章主要讲解了“C++中怎么初始化列表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中怎么初始化列表”吧!创建一个类对象时,编译器通过调用构造函数,给类对象中各个成员变量赋初值:但上述赋初值不能称作类对象成员的初始化,因为构造函数体内可以多次赋值:而初始化列表能只能初始化一次。初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个”成员变量”后面跟一个放在括 号中的初始值或表达式。(1)初始化列表能只能初始化一次,多次初始化会报错:编译器也允许构造函数赋初值和初始化列表初始化混用:混用时初始化列表初始化和构造函数赋初值不冲突:但混用时初始化列表初始化还是要遵循只能初始化一次成员变量的原则:(2)const成员变量、引用成员变量、没有默认构造函数的自定义类型成员只能在初始化列表初始化。①const成员变量必须在定义的时候初始化②引用成员变量必须在定义的时候初始化③没有默认构造函数的自定义类型成员变量const成员变量、引用成员变量、没有默认构造函数的自定义类型成员变量必须在初始化列表内初始化的原因:①初始化列表是对象的成员变量定义的地方。②对象的内置类型成员变量在初始化列表定义时没有要求必须初始化,因此既可以在初始化列表进行初始化,也可以在构造函数体内初始化。③而const成员变量、引用成员变量、没有默认构造函数的自定义类型成员变量不能先定义再初始化,它们在初始化列表内定义,并且必须在定义时就初始化,因此必须在初始化列表内初始化。(3)尽量使用初始化列表初始化,因为不管是否使用初始化列表,虽然对于内置类型没有差别,但是对于自定义类型成员变量,一定会先使用初始化列表初始化。为什么会先使用初始化列表初始化?如下,Date类没有默认构造函数,因为26行的构造函数不属于默认构造函数中的任意一种,在对Date类的对象d进行初始化时,会调用Date类的默认构造函数,所以对象d的day实参12和hour实参12都没有被传进去,_t作为Date类的自定义类型成员变量会调用Time类的默认构造函数,_hour默认传参为0,因此打印_hour的值也为0,d的参数没有传成功:假如Date类的构造函数不使用初始化列表进行初始化,使用函数体内初始化时,要把Date类的构造函数的形参hour的值给d,那么就必须构造一个Time类对象t,对该对象传参传hour,再使用赋值运算符重载函数将对象t拷贝给_t:这还不如直接使用使用初始化列表初始化呢,还不需要赋值运算符重载函数:因此,建议尽量直接使用初始化列表进行初始化。(4)成员变量初始化的顺序就是成员变量在类中的声明次序,与初始化列表中的先后次序无关。如下代码,类成员变量中先声明了_a2,再声明了_a1,因此初始化的顺序是先初始化_a2,再初始化_a1:先声明_a2就会先初始化_a2,用_a1初始化_a2,由于此时_a1还是随机值,因此_a2的值也是随机值,_a1使用a的值1进行初始化,因此,_a1的值为1:所以,建议类中的成员变量声明的顺序和初始化列表中初始化的顺序一致。根据监视可以看出:double d = i;并不是将i直接赋值给d,而是用i创建一个临时变量,再把临时变量的值给d,那么d改变的是临时变量的值,而不是i的值,因为程序执行完毕后,i的值并未发生改变。如果d作为引用,那么必须加上const关键字免费云主机域名进行修饰,因为d不是i的引用,是临时变量的引用,而临时变量具有常性,不允许引用权限放大。正常的类对象初始化如下面的aa1,也可以使用拷贝构造初始化,如aa2。由于c++支持隐式类型转换,因此也支持单参数构造函数初始化,如aa3:那么是如何支持类型转换的呢?对于自定义类型A,aa3是A类型,3是整形。编译器会先拿A构造一个临时对象temp,3作为参数传给这个临时对象temp,再拿aa3(temp)去拷贝构造,发生隐式类型转换,即先构造,再拷贝构造:不过现在的编译器已经优化过了,会直接调用构造函数A aa(3)。如果不想让单参数的构造函数发生隐式类型转换,可以使用explicit关键字修饰构造函数,表明该构造函数是显式的,而不是隐式的,就会避免发生不期望的类型转换,使用场景如下:aa3作为A类的对象,构造时传参应该传int型,但却传了char型,由于发生隐式类型转换,因此编译也没毛病,但是它传参就是不伦不类。这时候可以给A的构造函数加上explicit声明不让该单参构造函数发生隐式类型转换,编译就会报错:这时候只能乖乖给aa3传int型参数了。没有名字的对象叫做匿名对象,A(3)跟aa1和aa2相比少了个对象名,没有名字,aa1和aa2的生命周期在main函数内,A(3)的生命周期只在当前行:F10调试:当执行完A(3)还没执行return 0时,aa1和aa2的生命周期还没有结束,不会调用析构函数,此时打印的析构函数只能是匿名对象A(3)的析构函数:所以A(3)这一行执行完就调析构函数了。假设有一个函数f,且A类的构造函数全缺省:调用f()函数时,需要定义一个A类对象,才能调用A类函数f,这就需要写两行:对象aa4在main函数结束后才会销毁。如果定义对象只是为了调用函数,那么可以考虑直接定义一个匿名对象:这个匿名对象就是为了调用函数f,这个匿名对象后边也没人用它,在当前行调用完f()函数就销毁了。感谢各位的阅读,以上就是“C++中怎么初始化列表”的内容了,经过本文的学习后,相信大家对C++中怎么初始化列表这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云主机,小编将为大家推送更多相关知识点的文章,欢迎关注!
这篇文章主要介绍了php能不能实现socket通信的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇php能不能实现socket通信文章都会有所收获,下面我们一起来看看吧。 php能实现socket通信,其实现方法:1、在客户端创建“…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。