C++面试八股文之什么是构造函数

 更新时间:2023年06月30日 08:54:53   作者:二进制架构  
构造函数是一种特殊的成员函数,用于创建和初始化类的对象,这篇文章主要为大家详细介绍了C++中构造函数的相关知识点,需要的可以参考一下

某日二师兄参加XXX科技公司的C++工程师开发岗位第29面:

面试官:什么是构造函数?

二师兄:构造函数是一种特殊的成员函数,用于创建和初始化类的对象。构造函数的名称与类的名称相同,并且没有返回类型。构造函数在对象被创建时自动调用。

struct Foo
{
  Foo(int v):val(i){}	//构造函数
private:
  int val;
};

面试官:什么是默认构造函数?什么情况下默认构造函数会被创建?

二师兄:没有任何参数的构造函数(所有参数都要默认参数的构造函数也是)。一般定义类时没有显式的声明任何构造函数,默认构造函数会被编译器自动创建。

struct Foo
{
private:
  int val;
};	//此时默认构造函数会被创建

二师兄:当然就算为类自定义了构造函数,我们也可以通过Foo()=default为类显式定义一个默认构造函数。

面试官:什么是构造函数初始值列表?

二师兄:是为了初始化成员变量所传入的参数列表:

class Foo
{
public:
    Foo(int i, long l):ival_(i),lval_(l){}	//初始值列表
private:
    int ival_;
    long lval_;
};

面试官:上面的构造函数和以下的构造函数有什么区别?

Foo(int i, long l)
{
    ival_ = i;
    lval_ = l;
}

二师兄:这是初始化与赋值的区别。这段代码中的ival_和lval_先被默认初始化,然后被赋值。而初始化列表是直接初始化,少了一步赋值。

面试官:如果把构造函数写成Foo(int i, long l):lval(l),ival_(i){}会有什么问题吗?

二师兄:成员初始化的顺序尽量要和定义的顺序保持一致。如下面的代码,就是未定义的:

class Foo
{
public:
    Foo(int i):jval_(i),ival_(jval_){}	//未定义的行为,因为ival先被初始化,这时候jval是未定义的
private:
    int ival_;
    int jval_;
};

面试官:什么是委托构造函数?

二师兄:构造函数在构造对象的时候把一部分任务委托给其他构造函数进行构造,这是C++11引入的新特性:

class Foo
{
public:
    Foo(int i, long l):ival_(i),lval_(l){}
    Foo(int i):Foo(i,0){}   //委托给Foo(int i, long l)
private:
    int ival_;
    long lval_;
};

面试官:如果构造函数没有初始化任何成员变量,使用这个构造函数会发生什么?

二师兄:成员变量将会被默认初始化

面试官:什么是默认初始化?

二师兄:如果是内置类型(如boolintdouble),将不被初始化,如果是类类型,将执行类类型的的默认构造函数初始化变量。如果类类型的默认构造函数是删除的(=delete)或定义了其他构造函数但是没有定义默认构造函数的,将不能通过编译。

二师兄:类类型的初始化时一个循环的过程,如果类类型中有类类型成员,初始化方式和以上描述的一致。

struct Foo{ int a;}
struct Goo
{
    int b;
    Foo f;
};	
Goo g;	//此g.b是默认初始化,值不确定。Foo中的a也是默认初始化,所以g.f.a的值也是不确定的。

面试官:可以使用virtual修饰构造函数吗?

二师兄:不可以,因为构造函数在对象构造阶段调用,虚表尚未建立,所以无法调用虚函数实现多态。

面试官:可以使用const修饰构造函数吗?

二师兄:不可以,因为构造函数需要初始化成员变量,这与const修饰成员函数的意义相悖。

面试官:可以使用constexpr修饰构造函数吗?

二师兄:可以。这表明类的对象可以在编译器构造。我们所熟悉的std::array的构造函数在C++20下就是constexpr的。

面试官:什么情况下会将一个类的构造函数定义为私有的?

二师兄:一般不希望直接通过类型定义对象,如C++的单例模式:

class Singleton
{
public:
    static Singleton& Instance()
    {
        static Singleton instance;
        return instance;
    }
    Singleton(const Singleton&) = delete;
    Singleton(Singleton&&) = delete;
    Singleton& operator=(const Singleton&) = delete;
    Singleton& operator=(Singleton&&) = delete;
private:
    Singleton() = default;
    ~Singleton() = default;
};
Singleton s; //编译失败
Singleton& s = Singleton::Instance();	//编译成功

面试官:最后一个问题,你知声明、定义、初始化、赋值的区别吗?

二师兄:声明是告诉编译器这里有个符号,但不分配内存。定义告诉编译器,这里有个符号,要分配一块内存给它。初始化时在分配内存的时候给它一个初始值。赋值是将这块内存原来的值擦除,给它填入一个新值。

面试官:好的,今天的面试结束了,请回去等通知吧。

C++类的构造函数的基本考点都在这里了,小伙伴本要理解这些设计及设计背后的取舍,面对面试官的拷问才能对答如流哦。

到此这篇关于C++面试八股文之什么是构造函数的文章就介绍到这了,更多相关C++构造函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 与ASCII码相关的C语言字符串操作函数

    与ASCII码相关的C语言字符串操作函数

    这篇文章主要介绍了与ASCII码相关的C语言字符串操作函数,分别是将字符转换为ASCII码的toascii()函数和根据ASCII码进行字符串比较的strcoll()函数,需要的朋友可以参考下
    2015-08-08
  • C++类与对象的详细说明2

    C++类与对象的详细说明2

    这篇文章主要为大家详细介绍了C++的类与对象,使用数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C++ 风靡一时的连连看游戏的实现流程详解

    C++ 风靡一时的连连看游戏的实现流程详解

    游戏“连连看”是源自台湾的桌面小游戏,自从流入大陆以来风靡一时,也吸引众多程序员开发出多种版本的“连连看”。这其中,顾芳编写的“阿达连连看”以其精良的制作广受好评,这也成为顾方“阿达系列软件”的核心产品。并于2004年,取得国家版权局的计算机软件登记证书
    2021-11-11
  • Opencv获取身份证号码区域的示例代码

    Opencv获取身份证号码区域的示例代码

    这篇文章主要介绍了Opencv获取身份证号码区域的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • 关于C/C++中的side effect(负效应)和sequence point(序列点)

    关于C/C++中的side effect(负效应)和sequence point(序列点)

    不知你在写code时是否遇到这样的问题?int i = 3; int x = (++i) + (++i) + (++i); 问x值为多少?进行各种理论分析,并在编译器上实践,然而可能发现最终的结果是不正确的,也是不稳定的,不同的编译器可能会产生不同的结果。这让人很头疼
    2013-10-10
  • VC中CDC、HDC、pDC区别与联系及相互转换

    VC中CDC、HDC、pDC区别与联系及相互转换

    这篇文章主要介绍了VC中CDC、HDC、pDC区别与联系及相互转换的方法,非常的详细,有需要的小伙伴可以参考下,希望对大家学习VC能够有所帮助。
    2015-11-11
  • C语言驱动开发之内核通过PEB获取进程参数

    C语言驱动开发之内核通过PEB获取进程参数

    PEB结构(Process Envirorment Block Structure)其中文名是进程环境块信息。本文将通过PEB实现获取进程参数,感兴趣的小伙伴可以了解一下
    2022-10-10
  • Cocos2d-x中背景音乐和音效使用实例

    Cocos2d-x中背景音乐和音效使用实例

    这篇文章主要介绍了Cocos2d-x中背景音乐和音效使用实例,注意本文中使用大量注释来说明背景音乐和音效的使用方法,需要的朋友可以参考下
    2014-09-09
  • OpenCV图像轮廓提取的实现

    OpenCV图像轮廓提取的实现

    本文主要介绍了OpenCV图像轮廓提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • C++轻量级界面开发框架ImGUI介绍小结

    C++轻量级界面开发框架ImGUI介绍小结

    如果从事过C++ Windows客户端开发,大家对MFC、Qt、DuiLib等各种DirectUI应该有了解,本篇给大家介绍一个超级轻量级的C++开源跨平台图形界面框架ImGUI,感兴趣的可以了解一下
    2021-11-11

最新评论