当前视点!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_;};
面试官:如果构造函数没有初始化任何成员变量,使用这个构造函数会发生什么?
二师兄:成员变量将会被默认初始化。
面试官:什么是默认初始化?
二师兄:如果是内置类型(如
bool
、int
、double
),将不被初始化,如果是类类型,将执行类类型的的默认构造函数初始化变量。如果类类型的默认构造函数是删除的(=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年,留队担任第三门将
- 牛肉配啥菜包包子好吃_牛肉包子如何调馅才嫩|快播
- 当前播报:深圳宝安:把握机遇发挥优势 打造内外循环链接门户
- 小米13 Pro怎么关闭ltpo
- 谷歌地球截图软件(谷歌地图截图软件)
- 丰元股份:终止投资青海聚之源
- 每日动态!南汇中学贴吧最新消息_南汇中学贴吧
- T10+设计联盟 x 古木子月空间设计:幸会 · 江南味道餐厅_今日热议
- 不留死角!北京两机场拉网式排查消防安全隐患_每日快讯
- 下月开工!事关淄博火车站北广场,要建12栋楼,还有3栋商业+车库
- 世界速看:惠州博罗首例!批捕贩卖含依托咪酯成分"上太空"电子烟案
- 当前最新:集中开工企业看好海南自贸港前景 落地寻求发展共赢
- 全球消息!欠钱不还还玩“躲猫猫”,调解员“智斗”被告促成履行
- 环球快讯:防止“虫”从口入 做到这三点很重要
- 全球微速讯:中铁装配:寇家屯片区旧改还建工程EPC总承包项目的具体合同条款尚在洽商中
- 天天亮点!唯特偶(301319):该股换手率大于8%(06-29)
- 青海省2023年养老金调整方案今日公布了吗?2023年青海省养老金能涨多少怎么计算? 全球热点评
- 女子航班延误却见山航冒雨起飞 网友慕了:艺高人胆大
- 杭州房东有多卷:给中介发8888元大红包,送电脑送手机
- 亨通光电亨通集团有限公司质押415.00万股|世界时快讯
- 深圳前海永利玖富股权投资中心:股权投资的3种方法-即时焦点
- 大连庄河发生一起较大道路运输事故,致3人死亡