前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >当类构造与析构的时候...

当类构造与析构的时候...

作者头像
看、未来
发布2021-10-09 14:26:28
6260
发布2021-10-09 14:26:28
举报
请添加图片描述
请添加图片描述

关于虚函数部分不在这篇再提,上一篇提过了。

文章目录

什么时候会调用默认构造函数

1、当不使用任何初始值定义一个类的非静态变量时,会调用该类的默认构造函数。

代码语言:javascript
复制
A a;

2、当类B含有类A的对象,并且使用类B的默认构造函数时,会调用类A的默认构造函数。

代码语言:javascript
复制
class A {
  public:
    A(int i){}
};
 
class B {
  A m_a;
};

3、new一个对象的时候。

4、子类对象默认构造的时候。


什么时候调用拷贝构造函数?

1、用类的一个实例化对象去初始化另一个对象的时候 2、函数的参数是类的对象时(非引用传递) 3、函数的返回值是函数体内局部对象的类的对象时 ,此时虽然发生(Named return Value优化)NRV优化,但是由于返回方式是值传递,所以会在返回值的地方调用拷贝构造函数


什么时候调用赋值运算符?

赋值运算符是执行某种运算,将一个对象的值复制给另一个对象(已经存在的)。调用的是拷贝构造函数还是赋值运算符,主要是看是否有新的对象实例产生。


深拷贝与浅拷贝

浅复制 :只是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用,我们把这种拷贝叫做“(浅复制)浅拷贝”,换句话说,浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。


成员初始化列表的概念,为什么用它会快一些?

在类的构造函数中,不在函数体内对成员变量赋值,而是在构造函数的花括号前面使用冒号和初始化列表赋值。

用初始化列表会快一些的原因是,对于类型,它少了一次调用构造函数的过程,而在函数体中赋值则会多一次调用。而对于内置数据类型则没有差别。

代码语言:javascript
复制
#include<string.h>
#include<iostream>

using namespace std;


#include <iostream>
using namespace std;
class A
{
public:
    A()
    {
        value = 10;
        cout << "默认构造函数A()" << endl;
        //cout << &*this << endl;
    }
    A(int a)
    {
        value = a;
        cout << "A(int " << value << ")" << endl;
    }
    A(const A& a)
    {
        value = a.value;
        cout << "拷贝构造函数A(A& a):  " << value << endl;
    }
    int value;
};

class B
{
public:
    B() : a(1)
    {   //在这里构造的
        //cout << &b << endl;
        b = A(2);
        //cout << &b << endl;
    }
    A a;
    A b;    //会被先构造一次
};
int main()
{
    B b;
    cout << b.b.value << endl;
}

不过前后两次构造地址倒是没有改,没有重新分配内存,但是里面的数据倒是进行了一波修改。


有哪些情况必须用到成员列表初始化?

1、初始化一个const成员 2、调用基类构造函数时的传参 3、初始化不存在默认构造函数的别的类的对象


构造/析构函数的执行顺序

构造的时候:如果基类,先调用基类的构造函数,再调用自己的构造函数。

析构的时候,如果有基类,且基类的析构函数是虚函数,则先调用自己的构造函数,再调用基类的构造函数。 如果基类的析构函数不是虚函数,则调用基类的析构函数。


继承机制中对象之间如何转换?

  1. 向上类型转换

将派生类指针或引用转换为基类的指针或引用被称为向上类型转换,向上类型转换会自动进行,而且向上类型转换是安全的。

  1. 向下类型转换

将基类指针或引用转换为派生类指针或引用被称为向下类型转换,向下类型转换不会自动进行,因为一个基类对应几个派生类,所以向下类型转换时不知道对应哪个派生类,所以在向下类型转换时必须加动态类型识别技术。RTTI技术,用dynamic_cast进行向下类型转换。


C++中类成员的访问权限和继承权限问题

  1. 三种访问权限

① public:用该关键字修饰的成员表示公有成员,该成员不仅可以在类内可以被 访问,在类外也是可以被访问的,是类对外提供的可访问接口;

② private:用该关键字修饰的成员表示私有成员,该成员仅在类内可以被访问,在类体外是隐藏状态;

③ protected:用该关键字修饰的成员表示保护成员,保护成员在类体外同样是隐藏状态,但是对于该类的派生类来说,相当于公有成员,在派生类中可以被访问。

  1. 三种继承方式

① 若继承方式是public,基类成员在派生类中的访问权限保持不变,也就是说,基类中的成员访问权限,在派生类中仍然保持原来的访问权限;

② 若继承方式是private,基类所有成员在派生类中的访问权限都会变为私有(private)权限;

③ 若继承方式是protected,基类的共有成员和保护成员在派生类中的访问权限都会变为保护(protected)权限,私有成员在派生类中的访问权限仍然是私有(private)权限。


如何禁止程序自动生成拷贝构造函数?

1、直接将拷贝构造函数写在私域里。 2、起一个基类,将类的拷贝函数设为私有,在项目中比较优雅。 参考:muduo网络库源码实现。


C++中struct和class的区别

相同点

代码语言:javascript
复制
两者都拥有成员函数、公有和私有部分
任何可以使用class完成的工作,同样可以使用struct完成

不同点

代码语言:javascript
复制
两者中如果不对成员不指定公私有,struct默认是公有的,class则默认是私有的
class默认是private继承,而struct模式是public继承
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/09/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 什么时候会调用默认构造函数
  • 什么时候调用拷贝构造函数?
  • 什么时候调用赋值运算符?
  • 深拷贝与浅拷贝
  • 成员初始化列表的概念,为什么用它会快一些?
  • 有哪些情况必须用到成员列表初始化?
  • 构造/析构函数的执行顺序
  • 继承机制中对象之间如何转换?
  • C++中类成员的访问权限和继承权限问题
  • 如何禁止程序自动生成拷贝构造函数?
  • C++中struct和class的区别
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档