某日二师兄参加XXX科技公司的C++工程师开发岗位第9面:
面试官:C++中,设计一个类要注意哪些东西?
二师兄:设计一个类主要考虑以下几个方面:1.面向对象的封装、继承及多态。2.
big three
或者big five
。3.运算符和函数重载、静态成员、友元、异常处理等相关问题。面试官:请介绍一下面向对象的三个特性。
二师兄:封装是将类的函数和数据封装起来,外部不能直接访问类的数据,而是需要通过方法访问数据。继承是指一个类可以继承另一个类的属性和方法。多态是指一个对象可以表现出多种形态。
面试官:请问多态是如何实现的?
二师兄:多态的是通过父类的指针或引用指向子类的对象实现的。在对象中维护一个虚指针(
vtptr
),这个指针指向一个虚表(vtable
),当用户通过父类对象访问子类的方法时,通过查询虚表中对应的方法的地址,并跳转到此地址执行间接访问对象的方法。所以多态是有一点点运行时开销的。面试官:你刚才所说的
big three
和big five
是什么?二师兄:(嘿嘿,被装到了)类的
big three
分别是拷贝构造函数(copy constructor
)、拷贝赋值运算符(copy assignment
)和析构函数。而类的big five
则多了两个,分别是移动构造函数(move constructor
)和移动赋值运算符(move assignment
)。后面两个是C++11之后引入的。面试官:好的。那你知道为什么要引入移动构造和移动赋值吗?
二师兄:主要是为了效率。移动构造和移动赋值不需要把所有的数据重新拷贝一遍,而是霸占了被移动对象的数据的所有权。代价是被移动对象在被移动后不能使用。
面试官:嗯。那你知道为什么移动构造和移动赋值都要加上
noexcept
关键字吗?二师兄:额。。。好像不让抛异常?
面试官:你知道类的静态成员变量需要注意哪些问题吗?
二师兄:要注意哪些问题?额。。。
面试官:在成员方法后加
const
是为什么?二师兄:主要是为了约束这个成员方法不更改对象的任何数据。
面试官:还有其他的原因吗?
二师兄:好像没有了吧。。。
面试官:类的成员方法可以通过
const
符号重载吗?二师兄:这个,,应该可以吧。。
面试官:你知道什么是类的成员方法的引用限定符吗?
二师兄:没有听说过耶。。。
面试官:好的,回去等通知吧。
让我们来看一看今日二师兄的表现吧,
为什么移动构造和移动赋值都要加上
noexcept
关键字?
因为在使用移动语义时,通常会将资源的所有权从一个对象转移到另一个对象,而不是复制资源。如果抛出异常,那么在转移资源的过程中可能会出现问题,导致资源泄漏或其他不可预测的行为。
另外,加上 noexcept
关键字还可以提高代码的性能,因为编译器可以在不必要的情况下进行优化。
类的静态成员变量需要注意哪些问题?
静态成员变量的初始化顺序是不确定的。如果一个静态成员变量依赖于另一个静态成员变量的值,要确保第二个静态化成员先被初始化,否则程序可能会出现未定义的行为。
静态成员变量的值可以被多个实例同时修改,因此在多线程访问静态成员时要注意数据竞争问题。静态变量的生命周期与程序的生命周期相同,因此它们可能会占用大量的内存。
在成员方法后加
const
是为什么?
一是可以约束此方法不会更改对象的任何数据。二是cosnt
对象也可以访问此成员方法。
#include
struct Foo
{
void f1(){std::cout
类的成员方法可以通过
const
符号重载吗?
这是一个很好的问题,估计很多人没有思考过。先说答案,底层const
可以,而顶层const
不可以。
#include
struct Foo{};
struct Goo
{
void f1(Foo& f){std::cout
当我们把顶层const
改为底层const
,
#include
struct Foo{};
struct Goo
{
void f1(Foo& f){std::cout
那么我们能否通过在函数括号后加上const
来重载函数呢?
#include
struct Goo
{
void f1() {std::cout
答案是肯定的,因为const_goo.f1()
可以等同于f1(const Goo* goo)
,也是底层const
。
最后一个问题虽然简单,但我相信至少有80%的C++程序员不知道是什么,
什么是类的成员方法的引用限定符吗?
类的成员方法的引用限定符是 C++11 中引入的一种新特性,用于指定成员方法的参数是左值引用还是右值引用。
#include
struct Foo
{
void f1() & {std::cout
好了,今日份面试到这里就结束了,小伙伴们,对于今天二师兄的面试,能打几分呢?如果是你,以上的问题都能回答的上来吗?
关注我,带你21天“精通”C++!(狗头)
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net