某日二师兄参加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++类的构造函数的基本考点都在这里了,小伙伴本要理解这些设计及设计背后的取舍,面对面试官的拷问才能对答如流哦。

好了,今天的面试到这里就结束了,让我们期待明天面试官和二师兄的表现吧~

关注我,带你21天“精通”C++!(狗头)

C++面试八股文:什么是构造函数?的更多相关文章

  1. 《面试八股文》之kafka21卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是moon,最新一篇面试八股文系 ...

  2. 《面试八股文》之 Redis 16卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. redis 作为 ...

  3. 《面试八股文》之 JVM 20卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. <面试八股 ...

  4. 一天吃透JVM面试八股文

    什么是JVM? JVM,全称Java Virtual Machine(Java虚拟机),是通过在实际的计算机上仿真模拟各种计算机功能来实现的.由一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一 ...

  5. 三天吃透Spring面试八股文(最新整理)

    本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...

  6. 三天吃透Java虚拟机面试八股文

    本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...

  7. 这可能是最全面的TCP面试八股文了

    计算机网络基础,考验一个程序员的基本功,也能更快的筛选出更优秀的人才. 说说TCP的三次握手 假设发送端为客户端,接收端为服务端.开始时客户端和服务端的状态都是CLOSED. 第一次握手:客户端向服务 ...

  8. 一天吃透MySQL面试八股文

    什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据.你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列).行代表每一行数据,列代表该行中的每个值.列上的值是 ...

  9. 这可能是最全面的MySQL面试八股文了

    什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据.你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列).行代表每一行数据,列代表该行中的每个值.列上的值是 ...

  10. 这可能是最全面的Redis面试八股文了

    Redis连环40问,绝对够全! Redis是什么? Redis(Remote Dictionary Server)是一个使用 C 语言编写的,高性能非关系型的键值对数据库.与传统数据库不同的是,Re ...

随机推荐

  1. 多线程结合自定义logback日志实现简单的工单日志输出

    前言 这周学习了logback自定义日志格式.多线程基础.以及常见的定时器,本篇博客主要是结合以上知识实现一个简单的定时全部工单输出任务,再通过自定义的日志打印输出到控制台. 1.logback自定义 ...

  2. Java:一篇学好设计模式

    什么是设计模式 简单理解,设计模式是前人多年写代码踩坑总结出来的优秀代码攻略,目的是减少大量无用代码,让项目更好维护 七大设计原则 接下来要讲的23种设计模式,但遵循下面的七大原则: 单一职责原则 2 ...

  3. 官宣 | Hugging Face 中文博客正式发布!

    作者:Tiezhen.Adina.Luke Hugging Face 的中国社区成立已经有五个月之久,我们也非常高兴的看到 Hugging Face 相关的中文内容在各个平台广受好评,我们也注意到,H ...

  4. Android 通过scheme跳转支付宝实现支付

    原文地址: Android 通过scheme跳转支付宝实现支付 - Stars-One的杂货小窝 需求的来源是支付功能,由于支付宝不允许个人开通具有webhook的支付服务,所以是对接了一个支付系统( ...

  5. vue-cli3构建和发布 实现分环境打包步骤(给不同的环境配置相对应的打包命令)

    https://panjiachen.github.io/vue-element-admin-site/zh/guide/essentials/deploy.html#%E6%9E%84%E5%BB% ...

  6. CS144 计算机网络 Lab4:TCP Connection

    前言 经过前面几个实验的铺垫,终于到了将他们组合起来的时候了.Lab4 将实现 TCP Connection 功能,内部含有 TCPReceiver 和 TCPSender,可以与 TCP 连接的另一 ...

  7. 【已解决】使用代理后,登陆微软账号提示0x800190001

    今天晚上想要登录Onedrive同步文件时,发现怎么都登陆不上去,报出的错误代码是0x80190001,在网上搜索了各种方法,重置网络,重置Onedrive都没什么用,甚至把Onedrive重装了一遍 ...

  8. 聚合短信PHP代码示例短信接口调用CURL方法

    聚合的短信相信大家已经做多了吧,网上的代码看了下就是感觉太繁琐了,不过网上的也是比较好的,用的是post方法,更安全,因我们的项目是在服务器上请求,又绑定了白名单 ,所以弄了个简单点的自己用,参考如下 ...

  9. Django, urls的参数name的demo

    Django的路由变化 遇到需要修改路由的需求,特别记录一下 项目开始 django-admin startproject sandboxOA. # 外部文件夹可以改变名字, '.'的意思是上一级不需 ...

  10. 🚀 jdbc-plus是一款基于JdbcTemplate增强工具包, 已实现分页、多租户、动态表名等插件,可与mybatis、mybatis-plus等混合使用

    jdbc-plus简介 jdbc-plus是一款基于JdbcTemplate增强工具包, 基于JdbcTemplate已实现分页.多租户.动态表名等插件,可自定义扩展插件,可与mybatis.myba ...