当前位置:首页 > 编程技术 > 正文

c语言构造函数的方法:使用成员初始化列表?

c语言构造函数的方法:使用成员初始化列表?

大家好,感谢邀请,今天来为大家分享一下c语言构造函数的方法:使用成员初始化列表?的问题,以及和c语言结构体中定义的数组成员初始化的一些困惑,大家要是还不太明白的话,也没...

大家好,感谢邀请,今天来为大家分享一下c语言构造函数的方法:使用成员初始化列表?的问题,以及和c语言结构体中定义的数组成员初始化的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

文章目录:

成员初始化列表和构造函数体的区别

在初始化列表中初始化与在构造函数的函数体中赋初值的区别:定义是指开辟空间,初始化是指给一个初值。

C++中, 类成员的初始化于初始化列表中完成, 先于构造函数体. 即成员真正的初始化发生在初始化列表中, 而不是构造函数体中.再给说明。

初始化顺序为:先就地声明,然后初始化列表,最后构造函数初始化。列表初始化值会覆盖声明时的值,构造函数的值又会覆盖列表的值。初始化列表中成员变量初始化顺序与变量声明顺序一致,与列表顺序无关。声明时初始化带来便捷,与初始化列表和构造函数相比,无需在每个构造函数中成员变量的默认参数。

首先把数据成员按类型分类并分情况说明:内置数据类型,复合类型(指针,引用)在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的 用户定义类型(类类型)结果上相同,但是性能上存在很大的差别。

内存管理不一样,类引用类型,浅拷贝,分配在堆上。结构体是值类型,深拷贝,分配在栈上。类,有析构函数。结构体不能有析构函数。结构体构造函数会自动生成带参数的构造器。类不会对有初始化赋值生成带参数的构造器。类有继承特性,结构体没有继承特性。

的确,以{}的方式来赋初值,只是用一个初始化列表 来对数据进行按顺序的初始化,如上面如果写成A a={p,7};则c1,n2被初始化,而db3没有。这样简单的copy操作,只能发生在简单的数据结构上,而不应该放在对象上。

c++中构造函数,初始化列表和直接赋值有什么区别吗?

赋初值一般而言是指逻辑意义上的初始化。在C语言中,由于初始化的语法是“=”后加初值,所以“赋初值”基本上就是指语法上的初始化。不过随着语言的发展,“赋初值”的意义发生了扩大。对有构造语义但又允许不初始化而不产生编译错误的程序设计语言而言,两者有些微妙的差别。

说明:赋值操作是在两个已经存在的对象间进行的,而初始化是要创建一个新的对象,并且其初值来源于另一个已存在的对象。编译器会区别这两种情况,赋值的时候调用重载的赋值运算符,初始化的时候调用拷贝构造函数。如果类中没有拷贝构造函数,则编译器会提供一个默认的。

赋值是删除原值,赋予新值,构造函数的意思是先开辟空间然后为其赋值,只能算是赋值,不算初始化;初始化列表就不一样了,开辟空间和初始化是同时完成的,直接给予一个值;常量不能被赋值,只能被初始化,所以必须在初始化列表中完成;C++的引用也一定要初始化,所以必须在初始化列表中完成。

构造函数初始值列表用于指定成员变量的初始化参数。区分构造函数与初始化列表的区别在于,前者可能包含赋值步骤,而后者直接初始化。如果构造函数的成员初始化顺序与定义顺序不一致,可能会导致错误。C++11引入了委托构造函数,允许构造函数将部分任务委托给其他构造函数。

无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果是相同的。不同之处在于,使用构造函数初始化列表的版本初始化数据成员,没有定义初始化列表的构造函数版本在构造函数体中对数据成员赋值。

初始化列表的为什么使用初始化列表

主要是性能问题,对于内置类型,如int, float等,使用初始化类表和在构造函数体内初始化差别不是很大,但是对于类类型来说,最好使用初始化列表,为什么呢?由下面的测试可知,使用初始化列表少了一次调用默认构造函数的过程,这对于数据密集型的类来说,是非常高效的。

类中存在const成员,那么该成员必须在初始化列表中做初始化。 类中含有其它类B作为成员,而B类禁止掉赋值操作的情况下,那么对B的对象也只能通过初始化列表来实现。

使用初始化列表的第二个原因是出于效率考虑,当成员类具有一个缺省的构造函数和一个赋值操作符时。MFC的CString提供了一个完美的例子。假定你有一个类CMyClass具有一个CString类型的成员m_str,你想把它初始化为Hi,how are you.。

首要优点在于,初始化列表能有效避免类型收窄的问题,即在构造过程中,它确保了数据的原始类型不会因为赋值过程而改变。当构造函数同时接受普通数组和initializer_list时,后者会优先被调用。

关于c语言构造函数的方法:使用成员初始化列表?的内容到此结束,希望对大家有所帮助。

最新文章