设为首页 收藏本站
查看: 141|回复: 0

[经验分享] C++面试八股文:什么是构造函数?

[复制链接]
累计签到:50 天
连续签到:1 天
发表于 2025-2-7 11:38:45 | 显示全部楼层 |阅读模式
某日二师兄参加XXX科技公司的C++工程师开发岗位第29面:
面试官:什么是构造函数?
二师兄:构造函数是一种特殊的成员函数,用于创建和初始化类的对象。构造函数的名称与类的名称相同,并且没有返回类型。构造函数在对象被创建时自动调用。

[C] 纯文本查看 复制代码
struct Foo
{
  Foo(int v):val(i){}        //构造函数
private:
  int val;
};
面试官:什么是默认构造函数?什么情况下默认构造函数会被创建?
二师兄:没有任何参数的构造函数(所有参数都要默认参数的构造函数也是)。一般定义类时没有显式的声明任何构造函数,默认构造函数会被编译器自动创建。

[C++] 纯文本查看 复制代码
struct Foo
{
private:
  int val;
};        //此时默认构造函数会被创建
二师兄:当然就算为类自定义了构造函数,我们也可以通过Foo()=default为类显式定义一个默认构造函数。
面试官:什么是构造函数初始值列表?
二师兄:是为了初始化成员变量所传入的参数列表:

[C] 纯文本查看 复制代码
class Foo
{
public:
    Foo(int i, long l):ival_(i),lval_(l){}        //初始值列表
private:
    int ival_;
    long lval_;
};
面试官:上面的构造函数和以下的构造函数有什么区别?

[C++] 纯文本查看 复制代码
Foo(int i, long l)
{
    ival_ = i;
    lval_ = l;
}
二师兄:这是初始化与赋值的区别。这段代码中的ival_和lval_先被默认初始化,然后被赋值。而初始化列表是直接初始化,少了一步赋值。
面试官:如果把构造函数写成Foo(int i, long l):lval(l),ival_(i){}会有什么问题吗?
二师兄:成员初始化的顺序尽量要和定义的顺序保持一致。如下面的代码,就是未定义的:

[C] 纯文本查看 复制代码
class Foo
{
public:
    Foo(int i):jval_(i),ival_(jval_){}        //未定义的行为,因为ival先被初始化,这时候jval是未定义的
private:
    int ival_;
    int jval_;
};
面试官:什么是委托构造函数?二师兄:构造函数在构造对象的时候把一部分任务委托给其他构造函数进行构造,这是C++11引入的新特性:

[C] 纯文本查看 复制代码
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)或定义了其他构造函数但是没有定义默认构造函数的,将不能通过编译。
二师兄:类类型的初始化时一个循环的过程,如果类类型中有类类型成员,初始化方式和以上描述的一致。

[C] 纯文本查看 复制代码
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++的单例模式:

[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++类的构造函数的基本考点都在这里了,小伙伴本要理解这些设计及设计背后的取舍,面对面试官的拷问才能对答如流哦。
好了,今天的面试到这里就结束了,让我们期待明天面试官和二师兄的表现吧~



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-1005677-1-1.html 上篇帖子: C++面试八股文:知道std::unordered_set/std::unordered_map吗? 下篇帖子: C++面试八股文:什么是空指针/野指针/悬垂指针?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表