最新公告
  • 欢迎您光临欧资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 94.移动构造函数何时需要合成构造函数?(二)移动

    94.移动构造函数? 1)我们通常会遇到这样的情况:我们用对象a初始化对象b之后,就不再使用对象a了,但是对象a的空间还在(在析构之前)。既然拷贝构造函数实际上是将a对象的内容拷贝到b中,那为什么不能直接使用a的空间呢?这样就避免了新空间的分配,大大降低了构造成本,是move构造函数的初衷;

    2)在拷贝构造函数中,我们必须对指针使用深拷贝,而在移动构造函数中,我们对指针使用浅拷贝;

    3)C++ 引入了一个移动构造函数,专门处理这种情况。用a初始化b后,a将被销毁;

    4)类似于复制,移动也是用一个对象的值来设置另一个对象的值。但与复制不同,move 实现了对象值的实际传输(源对象到目标对象)。即源对象将丢失其内容,其内容将被目标对象占用。当移动值的对象是未命名的对象时没有初始化为空指针,会发生移动操作。这里的未命名对象是那些甚至没有名字的临时变量。典型的未命名对象是函数的返回值或类型转换的对象。用临时对象的值初始化另一个对象值不需要对象的副本,因为临时对象将没有其他用途。因此,它的值可以移动到目标对象。为此,请使用移动构造函数和移动赋值(当使用临时变量对象进行构造初始化时,将调用移动构造函数)。类似地,当使用未命名变量的值赋值给对象时,可以调用移动赋值。

    95.什么时候需要合成构造函数? 1)如果一个类没有任何构造函数,但是有一个带有默认构造函数的成员对象,编译器会为该类合成一个默认构造函数,因为如果没有合成一个默认构造函数,那么该成员对象的构造函数无法调用;

    2)没有任何构造函数的类是从有默认构造函数的基类派生的,所以需要为派生类综合构造函数,然后才能调用基类的构造函数;

    p>

    3)带虚函数的类,引入虚函数需要进入虚表,虚表的指针,指针在构造函数中初始化,所以没有构造函数就无法初始化指针;

    4)具有虚拟基础的类:

    没有构造函数的类不会合成构造函数。

    编译器合成的构造函数并没有显式设置类中的每个成员变量。

    什么时候需要合成复制构造函数?

    将一个对象的内容作为另一个对象的初始值的三种情况:

    1)初始化一个对象,X xx = x;

    2)当对象作为参数传递给函数时;

    3)函数返回类对象时;

    了解:

    1)如果一个类没有拷贝构造函数,但是包含一个类类型的成员变量,并且该类型包含拷贝构造函数,编译器会为该类合成一个拷贝构造函数;

    2)如果一个类没有拷贝构造函数,但是该类继承自一个带有拷贝构造函数的基类,编译器会为该类合成一个拷贝构造函数;

    3)如果一个类没有拷贝构造函数,但该类声明或继承了虚函数,编译器会为该类合成一个拷贝构造函数;

    4)如果一个类没有拷贝构造函数,但该类有虚基类,编译器会为该类合成一个拷贝构造函数。

    96.构造函数的扩展过程? 1)记录在成员初始化列表中的数据成员初始化操作会放在构造函数的函数体中,与成员的声明顺序一致;

    2)如果一个成员没有出现在成员初始化列表中,但它有一个默认构造函数,那么就必须调用默认构造函数;

    3)如果类有vtable,必须初始化;

    4)必须调用之前所有的基类构造函数;

    5)必须调用所有虚拟基类构造函数。

    构造函数执行算法?

    1)在派生类构造函数中,调用所有虚基类和前一个基类的构造函数;

    2)对象的vptr被初始化;

    3)如果有成员初始化列表,会在构造函数体中展开,必须在设置vptr后进行;

    4)执行程序员提供的代码。

    析构函数扩展的过程?

    1)析构函数体被执行;

    2)如果类有成员类对象,它们有析构函数,它们将按照声明的相反顺序被调用;

    3)如果对象有 vptr,现在重新定义

    4)如果任何紧接在上面的非虚拟基类有析构函数,它们将按声明顺序被调用;

    5)如果任何虚拟基类有析构函数。

    97. ※哪些函数不能是虚函数? 1)构造函数,构造函数初始化对象,派生类必须知道基类函数做了什么才可以构造;当有虚函数时,每个类都有一个虚表,每个对象都有一个虚表指针,虚表指针在构造函数中被初始化;

    2)内联函数,内联函数代表在编译阶段对函数体的替换,而虚函数意味着在运行时确定类型,所以内联函数不能是虚函数;

    3)静态函数,静态函数不属于对象属于类,静态成员函数没有this指针,所以设置静态函数没有任何意义作为一个虚函数。

    4)友元函数,友元函数不是类的成员函数没有初始化为空指针,不能被继承。没有继承的函数就没有虚函数这样的东西。

    5)普通函数,普通函数不是类的成员函数,不具有继承特性,所以普通函数没有虚函数。

    98.sizeof和strlen有什么区别? 1)strlen 计算字符串的具体长度(只是一个字符串),不包括字符串终止符,返回字符数。

    2)sizeof 计算声明所占用的内存(字节大小),而不是实际长度。

    3)sizeof 是字节运算符,strlen 是函数。

    4)sizeof的返回值=字符数×字符占用的字节数,字符实际长度小于定义长度,字符数等于定义的长度。如果未给出定义的大小,则按类别讨论。对于字符串数组,字符大小等于实际字符数+1;对于整数数组,字符数是实际字符数。字符串的每个字符占用1个字节,整数数据的每个字符占用的字节数需要根据系统的位类来确定,32位占用4个字节。

    5)sizeof可以使用类型作为参数,strlen只能使用char*作为参数,并且必须以”结尾,sizeof也可以使用函数作为参数;

    6)sizeof数组的参数没有退化,但是传给strlen的时候退化成一个指针。

    99.简述strcpy、sprintf、memcpy的区别? 1)操作对象不同

    ①strcpy的两个操作对象都是字符串

    ②sprintf的操作源对象可以是多种数据类型,目的操作对象是字符串

    ③memcpy的两个对象是两个任意可操作的内存地址,不限于任何数据类型。

    2)执行效率不同

    memcpy 最高,strcpy 次之,sprintf 效率最低。

    3)功能不同

    ①strcpy主要实现字符串变量之间的拷贝

    ②sprintf主要实现其他数据类型格式到字符串的转换

    ③memcpy主要是内存块之间的拷贝。

    100.局部和全局变量的问题? 1)本地会阻塞全局。要使用全局变量,您需要使用“::”。局部变量可以与全局变量同名。在函数中引用该变量时,将使用同名的局部变量而不是全局变量。对于某些编译器,可以在同一个函数中定义多个同名的局部变量。例如,一个同名的局部变量定义在两个循环体中,该局部变量的作用域就在那个循环体中。

    2)如何引用一个已定义的全局变量,可以使用引用头文件或extern关键字的方式。如果使用引用头文件的方式引用头文件Argument中声明的全局变量,如果那个变量写错了,那么编译时会报错。如果你使用extern来引用,假设你犯了同样的错误,那么编译时不会报错,但链接时会报错。

    3)全局变量是否可以定义在多个.C文件可以包含的头文件中,同名的全局变量在不同的C文件中以静态形式声明。同名的全局变量可以在不同的C文件中声明,前提是只有一个C文件可以给这个变量赋初值,连接不会出错。

    待续~

    站内大部分资源收集于网络,若侵犯了您的合法权益,请联系我们删除!
    欧资源网 » 94.移动构造函数何时需要合成构造函数?(二)移动

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    欧资源网
    一个高级程序员模板开发平台

    发表评论