首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《逆袭进大厂》第三弹之C++提高篇79问79答

109、什么情况会自动生成默认构造函数? 1) 带有默认构造函数的类成员对象,如果一个类没有任何构造函数,但它含有一个成员对象,而后者有默认构造函数,那么编译器就为该类合成出一个默认构造函数。...不过这个合成操作只有在构造函数真正被需要的时候才会发生; 如果一个类A含有多个成员类对象的话,那么类A的每一个构造函数必须调用每一个成员对象的默认构造函数而且必须按照类对象在类A中的声明顺序进行; 2)...例如,绘画程序中,shape作为一个基类可以派生出圆形、矩形、正方形、梯形等, 如果我要求面积总和的话,那么会可以使用一个 shape * 的数组,只要依次调用派生类的area()函数了。...拷贝构造函数用来初始化一个非引用类类型对象,如果用传值的方式进行传参数,那么构造实参需要调用拷贝构造函数,而拷贝构造函数需要传递实参,所以会一直递归。 149、你知道空类的大小是多少吗?...都说一说,你知道的都说一下 1) 如果一个类没有任何构造函数,但他含有一个成员对象,该成员对象含有默认构造函数,那么编译器就为该类合成一个默认构造函数,因为不合成一个默认构造函数那么该成员对象的构造函数不能调用

2.2K30

CC++面试题之语言基础篇(一)

} 引用传递:形参在函数体内值发生变化,会影响实参的值; void bar(int &x) { x = x * 2; // 修改原始数据 } 指针传递:在指针指向没有发生改变的前提下,形参在函数体内值发生变化...如果你没有为类定义构造函数,并且没有提供初始化值,编译器会自动生成一个默认构造函数。...,将另一个对象的值复制到新对象中。...(默认拷贝函数)︰将原对象或原数组的引用直接赋给新对象,新数组,新对象/新数组只是原对象的一个引用。...深拷贝∶创建一个新的对象和数组,将原对象的各项属性的"值”(数组的所有元素)拷贝过来,是“值",深拷贝会在堆内存Q中另外申请空间来储存数据,从而解决了指针悬挂问题。

30910
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)

    对于编译器自动生成的构造函数,当其对对象成员变量进行初始化时,如果成员是内置类型,则编译器通常不会为其赋初值;如果成员是由class或者struct创建的自定义类型(也就是类嵌套的情况),则会自动调用该自定义类型的默认构造函数...,给三个成员变量分别赋初值1、2、3,而当程序运行结束时,这三个成员变量的值已经变为了0,这说明对象销毁时确实自动调用了析构函数。...对于一个局部域中的多个对象在进行销毁时,c++规定后创建的对象先析构。 那么我们什么时候该显示写析构函数呢?...因为对象在传值传参的时候需要调用拷贝构造,如果拷贝构造的参数带有对象的临时拷贝,那就会再次调用拷贝构造,以至于发生无限递归。 3. 如果我们没有显示定义拷贝构造函数,编译器会自动生成一个拷贝构造。...如果有写析构函数,那么通常需要写拷贝构造。 当我们在某个函数当中将对象作为返回值时,由于这个返回值是一份临时拷贝,所以会自动调用拷贝构造函数,造成运行效率的下降。

    17310

    C++重要知识点小结---1

    ,而不是按构造函数说明中冒号后面的顺序,所以num成员被赋的是一个随机值,并不是想赋的16,因为这个时候,成员age还没有被赋值,age的内存空间中是一个随机值。...简单记就是:左内容,右指针。   我只要一听到被面试者说:"const意味着常数",我就知道我正在和一个业余者打交道。...尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一下Saks的文章吧。)如果应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思?...最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。...顺带提一句,也许你可能会问,即使不用关键字const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由: 1).

    79291

    【C++】详解深浅拷贝的概念及其区别

    浅拷贝是指将一个对象的值赋给另一个对象时,只是简单地将对象的每个成员变量的值进行复制。...这意味着两个对象的内容是完全一模一样的,即: 浅拷贝看似没有什么问题,但当我们面对含有指针类型成员变量的类时,浅拷贝就会出现一些严重的事故,浅拷贝使两个类对象共享相同的内存地址,当一个对象的值发生改变时...,当一个对象的值发生改变时,另一个对象的值也会相应地改变。...并且如果类对象中指向的这块空间原本是动态开辟的,那么当其中一个类对象析构时将这块空间释放,另一个类对象中存储的这个指针就是一个悬空指针,极容易造成非法访问问题,即便是不使用,也不能销毁,否则也会造成内存空间二次释放的问题...什么是深拷贝 深拷贝是一种比较安全和稳定的对象拷贝方式,它在拷贝时如果遇到指针类型的数据,不会像浅拷贝那样单纯的只赋值指针的位置,而是会重新动态开辟一块新的空间,然后将原指针指向空间的内容拷贝到自己新开辟的空间中

    38100

    初识 C# 编程语言

    把完成一个需求的所有步骤从头到尾逐步实现 根据开发需求,将一个一个功能封装成一个又一个函数 按照需求顺序执行调用不同的函数 特点 注重步骤和过程,不注重职责分工 如果需求复杂,代码会变得很复杂...,应该先有类,再有对象 类只有一个,而对象可以有很多个 类中定义了什么属性和方法,对象中就有什么属性和方法,不可能多,也不可能少。...使用多个变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化。 内置的 引用类型有:object、dynamic 和 string。...*a; 将指向一个变量。 ? : 条件表达式 如果条件为真 ? 则为 X : 否则为 Y is 判断对象是否为某一类型。...成员选择(对象) 对象.成员名 -> 成员选择(指针) 对象指针->成员名 2 - 负号运算符 -表达式 右到左 单目运算符 (类型) 强制类型转换 (数据类型)表达式 前置++ 前置自增运算符

    21.1K20

    C++ 多态的实现机制

    如果做点邪恶的事情 将一个 Animal 的指针指向一个 Dog 的对象, 通过指针调用 eat() 函数, 会调用 Dog::eat() Animal a; Dog b; Animal* p = &b...对象没有发生任何的变化, 仅仅是让一个基类的指针指向了派生类的对象. 如果把派生类的对象赋值给基类的对象会发生什么?...只有通过指针或者引用调用才会是动态绑定, 此处当然在 a=b; 后, 即使通过指向 a 的指针调用也不会是动态绑定的, 这是因为, 在进行对象的赋值操作时, 虚函数表指针 vptr 并不会随着赋给 a,...是否可以做一些邪恶的事情呢 ?手动将 b 的 vptr 赋值给 a 会怎样? 千万不要在实际写代码中这样做!...同时可以看到, 最后打印了一个奇怪的值, 因为 Dog 类中新增了一个成员变量 tail (可以看到尽管 tail 是private 也并非没有办法去访问甚至修改), 而在基类 Animal 中是不存在的

    68440

    this指针的介绍和用法

    2.一个类所有的对象调用的成员函数都是统一代码段。 那么成员函数又是怎么识别属于同一对象的数据成员呢?...例如,当调用成员函数a.volume时,编译系统就把对象a的起始地址赋给this指针,于是在成员函数引用数据成员时,就按照this的指向找到对象a的数据成员。...同样如果有b.volume( ) ,编译系统就把对象b的起始地址赋给成员函数volume的this指针,显然计算出来的是长方体b的体积。this指针是隐式使用的,它是作为参数被传递给成员函数的。...由此可见,this在成员函数的开始前构造的,在成员的结束后清除。 这个生命周期同任一个函数的参数是一样的,没有任何区别。 当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去。...a1的地址 *this = aa;//*this操作该成员函数的对象,在这里是对象a1 //对象aa赋给a1,aa具有的数据成员的值赋给a1的数据成员 } int main() {

    54120

    终极 C++避坑指南

    所以,右值引用是不是应该叫“续命引用”更加合适呢~ 当用右值引用捕获一个将亡对象的时候,对象的生命周期从“将亡”变成了“与右值引用共存亡”,这就是右值引用的根本意义,这时的右值引用就是“将亡对象的引用”...,又因为这时的将亡对象已经不再“将亡”了,那它既然不再“将亡”,我们再对它进行操作(改变成员的值)自然就是有意义的啦,所以,这里的右值引用其实就等价于一个普通的引用而已。...总结来说就是,右值引用绑定常量时相当于“给一个常量提供了生命周期”,这时的“右值引用”并不是谁的引用,而是相当于一个普通变量;而右值引用绑定将亡对象时,相当于“给将亡对象延长了生命周期”,这时的“右值引用...,const 引用更倾向于“引用一个不可变的量”,既然这里的将亡对象是一个“不可变的值”,那么,我就可以用 const 引用来保存“这个值”,或者这里的“值”也可以理解为这个对象的“快照”。...所以,C++的移动语义仅仅是在语义上,在使用时必须要注意,一旦将一个对象 move 给了一个右值引用,那么不可以再操作原本的对象,但这种约束是一种软约束,操作了也并不会有报错,但是就可能会出现奇怪的问题

    2.3K20

    《C++Primer》第十三章 拷贝控制

    拷贝初始化除了在我们用=定义变量时会发生,在下列情况下也会发生: 将一个对象作为实参传递给一个非引用类型的形参 从一个返回类型为非引用类型的函数返回一个对象 用花括号列表初始化一个数组中的元素或一个聚合类中的成员...在一个析构函数中,不存在类似构造函数中初始化列表的东西来控制成员如何销毁,析构部分是隐式的。成员销毁时发生什么完全依赖于成员的类型。销毁类类型的成员需要执行成员自己的析构函数。...内置类型无析构函数,因此销毁内置类型成员什么也不做。 隐式销毁一个内置指针类型的成员不会delete它指向的对象。但是智能指针是类类型,所以具有析构函数,因此指向的对象在析构阶段会被销毁。...这些函数简单拷贝指针成员,这意味着多个HasPtr对象可能指向相同的内存。那么析构函数会导致多个HasPtr对象被销毁时delete相同的指针多次,这是未定义的行为。...很多时候都会发生对象拷贝,如果对象拷贝完之后就被立即销毁,那么移动对象而非拷贝对象会大幅度提升性能。

    1.6K40

    【C++入门篇】保姆级教程篇【中】

    我这里举一个例子: 工人在造房子之前需要建筑图纸,这个图纸可以看做是一个类,图纸的内容就是类的成员变量及成员函数,那么图纸可以住人吗?显然不行,所以类是不存储任何数据的。...,类的内部私有成员依旧是被赋了值。...,你不小心忘记写构造函数了,这时候你在调用Print函数会发现: 似乎出来的是随机值,其实我们没写构造函数的时候编译器是会默认生成构造函数的,只不过生成的默认构造赋给成员变量时是随机值。...,首先我们从内容来分析,将本类的成员变量拷贝一份给新的类,没什么问题(注意这里都是同一个类,不同的对象,只要在类内就能访问私有成员)。...其实这样是会发生无穷递归的,我们知道类的对象在进行传值传递时会自动调用拷贝构造,但是如果拷贝构造也是形参,那么传值传递就会引发对象的拷贝,一直循环发生无穷递归。

    7810

    嵌入式软件工程师笔试面试指南-CC++

    修饰函数的返回值。 a.如果给用 const修饰返回值的类型为指针,那么函数返回值(即指针)的内容是不能被修改的,而且这个返回值只能赋给被 const修饰的指针。...左值和右值是什么? 左值是指可以出现在等号左边的变量或表达式,它最重要的特点就是可写(可寻址)。也就是说,它的值可以被修改,如果一个变量或表达式的值不能被修改,那么它就不能作为左值。...右值是指只可以出现在等号右边的变量或表达式。它最重要的特点是可读。一般的使用场景都是把一个右值赋值给一个左值。 通常,左值可以作为右值,但是右值不一定是左值。 什么是短路求值?...函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有“函数返回值”,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。...例如,动物作为一个基类可以派生出老虎、孔雀等子类,但是动物本身生成对象不合情理,此时就可以将动物类中的函数定义为纯虚函数,如果基类中有纯虚函数,那么在子类中必须实现这个纯虚函数,否则子类将无法被实例化,

    1.6K11

    CC++常见面试知识点总结附面试真题—-20220326更新

    或者左值就是在程序中能够寻址的东西,右值就是一个具体的真实的值或者对象,没法取到它的地址的东西(不完全准确),因此没法对右值进行赋值,但是右值并非是不可修改的,比如自己定义的class, 可以通过它的成员函数来修改右值...在c中,int fun() 会解读为返回值为int(即使前面没有int,也是如此,但是在c++中如果没有返回类型将报错),输入类型和个数没有限制, 而int fun(void)则限制输入类型为一个void...,直接将tmp的资源给临时对象 ~Stack() // tmp析构 operator=(Stack&&) // 调用带右值引用的赋值运算符重载函数,直接将临时对象资源给...如果拷贝构造函数的参数不是当前类的引用,而是当前类的对象,那么在调用拷贝构造函数时,会将另外一个对象直接传递给形参,这本身就是一次拷贝,会再次调用拷贝构造函数,然后又将一个对象直接传递给了形参,将继续调用拷贝构造函数...AVL树中所有结点为根的树的左右子树高度之差的绝对值不超过1。将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF,那么平衡二叉树上的所有结点的平衡因子只可能是-1、0和1。

    1.6K10

    C++|智能指针模板类

    ,这样两个指针将指向不同的对象,其中一个对象是另外一个的副本。...对于特定的对象,只能有一个智能指针可以拥有它,这样只有拥有对象的智能指针的构造函数会删除该对象。然后,让赋值操作转让所有权。...番外:将一个智能指针赋给另外一个一定会引起错误吗? 批话少说,代码掏出来看看!...总结一下就是: 如果程序试图将一个unique_ptr赋给另外一个时,如果源unique_ptr是一个临时右值,编译器允许这样的操作,相反,如果这个unique_ptr会存在一定的时间,那么这将会被编译器禁止...如果实在需要这种赋值操作,安全的重用这种指针,可以给他赋新值,这就引出了另外一个标准函数库中的函数:std::move()通过它,你可以实现将unique_ptr赋值给另外一个。

    63810

    笔记系列:JVM类链接和初始化

    同时也会记录分析一个关键性问题,就是静态变量和成员变量对于赋默认值和赋初始值的区别,这个区别会导致一些问题,为了避免这些问题,会用到volatile关键字。...2、Preparation,给静态成员变量赋默认值。例如int默认值0,long默认值0,float默认值0.0。 3、resolution,解析。将类、方法、属性等符号引用解析为直接引用。...1、实例化时会先给对象申请内存,在这时候给成员变量赋默认值0。 2、当申请完内存以后,会执行构造方法,才会赋值初始值8。...所以,我要保证,其他线程来的时候,要拿到instance的赋完初始值以后准备成熟的对象,再去使用就没问题了。那么如何保证呢?...3、astore_1,把内存赋值给对象t。 指令重排就是第2和第3步顺序发生了交替,就是先把内存赋给了对象t,然后再构造方法init。

    26520

    【C++】C++11常用特性总结

    如果你调试下面代码,其实就可以发现光标在初始化对象时,会跳到类的构造函数处进行对象的初始化。...所以,在C++11中,容器也都实现了右值版本的移动构造和移动赋值,以便于在某些场景下能够提高效率,如果拷贝的是一个右值,那么就会对应的调用移动构造和移动赋值,将资源进行转移,而不是进行拷贝一份,此时效率就会提高很多...下面再补充一个知识点。除const左值引用外,实际上还有const右值引用,有人可能会问,右值不是不能被修改嘛?你搞一个const右值引用有什么意义啊?...由于构造函数对内置类型不处理,所以C++11在成员变量打了补丁,即允许在类定义的时候,给成员变量缺省值,这个缺省值会在构造函数的初始化列表使用,进行成员变量的初始化。...另一种是固定绑定参数,在绑定类成员函数时,function要在模板参数第一个位置加类名,在调用的时候也需要先传一个该成员函数所属类的对象(平常我们直接传匿名对象了就),这样用起来有点烦,所以可以在绑定类成员函数的同时

    82140

    CC++学习之路(一)

    首先,我们先来弄懂关于构造函数的定义。在百度百科上,是这么定义的:构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。...; public:         //    无参数构造函数         // 如果创建一个类你没有写任何构造函数,则系统会自动生成默认的无参构造函数,函数为空,什么都不做        ...,用于根据一个已存在的对象复制出一个新的该类的对象,一般在函数中会将已存在对象的数据成员的值复制一份到新创建的对象中         //    若没有显示的写复制构造函数,则系统会默认创建一个复制构造函数...m_imag = 0.0;         }         // 等号运算符重载         // 注意,这个类似复制构造函数,将=右边的本类对象的值复制给等号左边的对象,它不属于构造函数...当你理解了以上的内容是再看上面我出的题,就知道答案原来是这样来的:         a[4]是类数组,有4个对象,调用构造函数4次,而*p[5]是指针数组,也就是5个元素存放的是指向MyClass类型的对象的指针

    80631

    C++11

    对于const修饰的左值,不能对他赋新值。 那么所谓左值引用就是对左值进行引用,给左值起别名。...再将临时对象拷贝到ret变量的时候,会调用移动构造,将临时对象的资源转移到ret中,发生两次拷贝(这里某些先进版本的编译器会优化此过程,不会产生临时对象,直接将str内的资源转移到ret中,只有一次移动构造...默认生成的移动构造函数,对于内置类 型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动构造, 如果实现了就调用移动构造,没有实现就调用拷贝构造。...默认生成的移动构造函数,对于内 置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动赋 值,如果实现了就调用移动赋值,没有实现就调用拷贝赋值。...C++中的function本质是一个类模板,也是一个包装器。 ret = func(x); // 上面func可能是什么呢?那么func可能是函数名?函数指针?函数对象(仿函数对象)?

    14810

    你们要的C++面试题答案来了--基础篇

    另外unique_ptr还有更聪明的地方:当程序试图将一个 unique_ptr 赋值给另一个时,如果源 unique_ptr 是个临时右值,编译器允许这么做;如果源 unique_ptr 将存在一段时间...C++有一个标准库函数std::move(),让你能够将一个unique_ptr赋给另一个。...请你回答一下C++类内可以定义引用数据成员吗? 参考回答: 可以,必须通过成员函数初始化列表初始化。 请你回答一下什么是右值引用,跟左值又有什么区别?...左值可变,右值不可变(仅对基础类型适用,用户自定义类型右值引用可以通过成员函数改变)。 4. 请你来说一下一个C++源文件从文本到可执行文件经历的过程?...当基类指针指向子类对象时,如果基类的析构函数不是virtual,那么子类的析构函数将不会被调用,子类的资源没有正确是释放,因此造成内存泄露。

    2.9K31

    读完某C++神作,我只记下了100句话

    cout对象,将右操作数写到左操作数对象,"hello world"是右操作数,前面半句话的意思是将hello world...C++强制要求指向const对象的指针也必须具有const特性,可以把非const对象地址赋给const指针。...函数实参如果和定义类型不一致,但可被转换成定义类型,那么也可以使用。 如果需要保护指针指向的值,形参需要定义为指向const的指针。...应将不修改实参的形参定义为const引用,好处是可以传递字符串字面值(和产生右值的表达式),非const引用反而不灵活。 如果形参是引用,那么他只是实参的别名。...如果知道基类到派生类的转换【这种转换是基类地址赋给派生类指针】是安全的【就是说心里清楚基类指针指向的确实是派生类】,可以使用static_cast强制编译器进行转换。

    1.4K20
    领券